To jest pytanie dotyczące wydajności SQL.Zapytania SQL - czy jest lepszy sposób?
Jakiś czas temu musiałem napisać zbiór zapytań do pobierania danych z systemu ERP. Większość z nich była dość prosta, ale jedna z nich zaowocowała dość nieefektywnym zapytaniem i od tego czasu mnie dręczyła, ponieważ musi być lepszy sposób.
Problem nie jest skomplikowany. Masz wiersze danych sprzedaży. W każdym wierszu znajduje się między innymi ilość, cena sprzedaży i kod sprzedawcy.
Prowizja wypłacana jest w oparciu o stopniowaną skalę ruchomą. Im więcej sprzedają, tym lepsza prowizja. Kroki mogą wynosić 1000, 10000, 10000 $ i tak dalej. Problem prawdziwego świata jest bardziej złożony, ale to w istocie.
Jedynym sposobem znalazłem w ten sposób było zrobić coś takiego (oczywiście nie prawdziwe query)
select qty, price, salesman,
(select top 1 percentage from comissions
where comisiones.salesman = saleslines.salesman
and saleslines.qty > comisiones.qty
order by comissiones.qty desc
) percentage
from saleslines
skutkuje prawidłowym komisji, ale jest straszliwie ciężkie.
Czy jest lepszy sposób to zrobić? Nie szukam kogoś, kto przerobiłby mój sql, bardziej "spójrz jak zapytania foobar" i mogę to zrobić.
Rzeczywistą strukturę prowizji można określić dla różnych sprzedawców, artykułów i klientów, a nawet dat sprzedaży. Zmienia się również od czasu do czasu, więc wszystko musi być napędzane danymi w tabelach ... tj. Nie mogę ustawić stałych zakresów w sql. Obecne zapytanie zwraca około 3-400000 wierszy i zajmuje około 20-30 sekund. Na szczęście jest to używane tylko raz w miesiącu, ale powolność trochę mnie dręczy.
To jest na mssql.
Ian
edit:
powinny dałem bardziej złożony przykład od początku. Zdaję sobie teraz sprawę, że w moim pierwszym przykładzie brakuje kilku istotnych elementów złożoności, przepraszam wszystkich.
To może lepiej uchwycić go
select client-code, product, product-family, qty, price, discount, salesman,
(select top 1 percentage from comissions
where comisiones.salesman = saleslines.salesman
and saleslines.qty > comisiones.qty
and [
a collection of conditions which may or may not apply:
Exclude rows if the salesman has offered discounts above max discounts
which appear in each row in the commissions table
There may be a special scale for the product family
There may be a special scale for the product
There may be a special scale for the client
A few more cases
]
order by [
The user can control the order though a table
which can prioritize by client, family or product
It normally goes from most to least specific.
]
) percentage
from saleslines
trzeba dodawać prawdziwy zapytanie nie jest łatwe do naśladowania. Aby uczynić życie bardziej interesującym, jego nazewnictwo jest wielojęzykowe.
Tak więc dla każdego wiersza sprzedaży prowizja może być różna.
Może wydawać się to zbyt skomplikowane, ale jeśli myślisz o tym, jak zapłacić prowizję, ma to sens. Nie chcesz płacić komuś za sprzedawanie rzeczy przy wysokich rabatach, ale chcesz też zaoferować konkretnemu klientowi zniżkę na konkretny produkt, jeśli kupisz jednostki X. Sprzedawca powinien zarabiać więcej, jeśli sprzedają więcej.
We wszystkich powyższych przypadkach wykluczam specjalne oferty z ograniczoną datą.
Myślę, że partycje mogą być rozwiązaniem, ale muszę zbadać to bardziej dogłębnie, ponieważ nie wiem nic o partycjach. Dał mi kilka pomysłów.
jeśli jej tylko uruchomić miesięcznie, nie będę się o to martwić. Wygląda na to, że musi wykonać wiele obliczeń na kilku dużych stołach. Jeśli musiał być uruchamiany częściej, możesz stopniowo budować zestaw wyników przy użyciu innej strategii. –
Czasami lepiej jest zmierzyć pracę i wprowadzić lepszą infrastrukturę, np. Indeksy lub szybsze dyski itp. Powinieneś profilować zapytanie i widzieć, że bity są ciężkie. –
Jakiej wersji programu SQL Server używasz? –