MS SQL Server - optymalizacja zapytania przy dużej ilości danych

0

Witam.
Potrzebuje nakierowania, czy jest możliwość zmniejszyć czas wykonania zapytania. Na tę chwilę mam między 7 a 9 sekund. Na pierwszy rzut oka nie wydaje się dużo, ale robię integrację, w której tym zapytanim sprawdzam czy zamówienie już zostało dodane do systemu ERP i to sprawdzenie trwa te 7-9 sekund. W przełożeniu na ilość zamówień, a może być ich tysiące dziennie, te 9 sekund to już dużo.

  1. Wszystkich dokumentów danego typu mam 748196
  2. Probówalem pobierać count(*), count(TrN_TrNId), wyciągnąć tylko idTrN_TrNId
  3. Zawężanie do 3000, 1000, 100 rekordów
  4. Robiłem reverse + like - czasem pomaga
  5. Inne filtry w where

Czasy są te same... Robię coś nie tak? Czy w przypadku select top(100) nie powinno być dużo szybciej?

Ostateczne zapytanie

select top(1000) count(TrN_TrNID) from CDN.TraNag where TrN_TypDokumentu = 308 and TrN_Korekta = 0 and TrN_Bufor >= 0 and reverse(TrN_NumerObcy) like '%'+ reverse('438961041') + '%' group by TrN_TrNID order by TrN_TrNID desc
4

pokaż plan zapytania i jakie są indexy na tej tabeli. BTW like '%'+ dość mocno zabije wydajność bo na to nie da się indeksu założyć (jeśli po przefiltrowaniu pozostałymi filtrami masz nadal stosunkowo dużo rekordów to każdy trzeba sprawdzić czy pasuje do wzorca)

0

Po co to reverse?

 reverse(TrN_NumerObcy) like '%'+ reverse('438961041') + '%'

Czy TrN_NumberObcy ma jakaś określoną strukturę?

0

W nawiązaniu do @areklipno
Błyskawica

select top(1) count(TrN_TrNID) 
from CDN.TraNag 
where TrN_TypDokumentu = 308 
and TrN_Korekta = 0 
and TrN_Bufor >= 0 
and TrN_NumerObcy = '438961041'
group by TrN_TrNID 
order by TrN_TrNID desc

Wraca do 9 sekund

select top(1) count(TrN_TrNID) 
from CDN.TraNag 
where TrN_TypDokumentu = 308 
and TrN_Korekta = 0 
and TrN_Bufor >= 0 
and TrN_NumerObcy = '438961041'

Co ten order by i group by daje w tym przypadku?

@abrakadaber:
query_plan.png
query_statistics.png

@yarel
Swego czasu robiłem dynamiczne filtrowanie do frontu, w którym wpisywało się parametr search jako szukajka w aplikacji webowej. Chciałem zrobić to na tyle uniwersalnie, że robiłem Name like '%' + Search_Param + '%', ale bardzo długo wyszukiwał. Gdzieś w netach znalazłem wpis, żeby zrobić reverse() na kolumnie i na parametrze i faktycznie różnica była kolosalna. Myślałem, że w tym przypadku to też może pomóc.

1

A czy ty na pewno wiesz co robisz? Wg mnie mas zapytanie trochę skopane. Spójrz tu: http://sqlfiddle.com/#!18/e7959/3

0

Tak, zgadza się. Na początku chciałem liczyć wszystkie, ale sugestia @areklipno żeby pobrać tylko top(1) mi w zupełności wystarczy. Ja tylko sprawdzam, czy dany dokument już istnieje w bazie żeby nie dodać go drugi raz. W związku z tym, że usługa będzie odpytywać API co 15 minut, w jakimś okresie czasu, to znajdą się takie zamówienia, które są już w systemie ERP. Mnie interesuje tylko 0 lub 1, nie ma albo jest.

1 użytkowników online, w tym zalogowanych: 0, gości: 1