Przemysław R. pracownik
Temat: SQL Server nie używa indexu w joinie
a);with a as ( SELECT DA_DATE_ID FROM DAt_LU_DATETIME WHERE DA_WEEK_ID = 201146 )
SELECT * FROM FV_BSE_CDR join a on CA_DATE_ID = DA_DATE_ID
b)
jakie są typy danych CA_DATE_ID i DA_DATE_ID?
Przemysław R. pracownik
Temat: SQL Server nie używa indexu w joinie
Bartłomiej Głowacki:
rozumiem, że to działa identycznie jak
SELECT *
FROM FV_BSE_CDR
join
( SELECT DA_DATE_ID FROM DAt_LU_DATETIME WHERE DA_WEEK_ID = 201146 )a
on CA_DATE_ID = DA_DATE_ID
???
Niestety próbowałem, execution plan jest taki sam. Jeśli wartości przekazywane są z podzapytania/tabeli, index nie jest wykorzystywany, jeśli są zahardkodowane, nie ma problemu.
jakie masz typy danych w kolumnach w obu tabelach?
bo być moze masz niejawną konwersję text -> data a wtedy z indeksu nici
Jakub
Wojt
Projektant systemów
IT, Team Leader,
Programista .NET C#
Temat: SQL Server nie używa indexu w joinie
Bartłomiej Głowacki:
dla uproszczenia mamy dwa przypadki:
-- nie używa indeksu CA_DATE_ID
SELECT * FROM FV_BSE_CDR
WHERE CA_DATE_ID IN ( SELECT DA_DATE_ID FROM DAt_LU_DATETIME WHERE DA_WEEK_ID = 201146)
Nie używa bo jest głupio napisane.
Indeksy pozwalają na szybkie wyszukiwanie zadanych rekordów a w tym zapytaniu sprawdzasz, czy wartość z indeksowanej kolumny znajduje się w zbiorze wartości z nieindeksowanej kolumny. Bez sensu.
Powinieneś zrobić join po DA_DATE_ID a warunek (DA_WEEK_ID = 201146) umieścić w WHERE
...a ja powienien sobie dopisać 'w doświadczeniu': Consultant of Data Warehouse
Consultants ;)
-- używa indeksu CA_DATE_ID
SELECT * FROM FV_BSE_CDR
WHERE CA_DATE_ID IN ('2011-11-06', '2011-11-07', '2011-11-08', '2011-11-09', '2011-11-10', '2011-11-11', '2011-11-12')
A to akurat programiści z MS przewidzieli...Jakub Wojt edytował(a) ten post dnia 03.01.12 o godzinie 00:26
Grzegorz
Stolecki
konsultant Business
Intelligence, SQL
Server, MVP
Temat: SQL Server nie używa indexu w joinie
To nie musi być kwestia złączeń w treści zapytania. Z resztą podzapytanie i tak będzie realizowane jako złączenie. Sprawdziłbym liczności tabel. Jeśli jedna z tabel jest mała, to wykorzystanie indeksu może być nieopłacalne (szczególnie jeśli indeks nie kryje zapytania).Sprawdziłbym ilość czytanych stron bazy po narzuceniu indeksu przez podany w tym wątku hint.
Edit:
W zapytaniu jest select * więc indeks, o którym mowa pewnie nie jest kryjący. No chyba, że włączono wszystkie kolumny.
Nie ma też informacji o tym czy tabele są stertami czy indeksami zgrupowanymi.
PozdrawiamGrzegorz Stolecki edytował(a) ten post dnia 03.01.12 o godzinie 00:51
