Bartłomiej Głowacki

Bartłomiej Głowacki BI Support Manager

Temat: SQL Server nie używa indexu w joinie

Czy jest jakaś, komenda, hint, który pozwoliłby na użycie indexu w tym JOINie?

cdr.CA_DATE_ID -- to jest index na dniach w dużej tabeli FV_BSE_CDR

poniżej są dwie wersje (zakomentowany where), obecna nie używa indeksu, zakomentowana używa go

SELECT COUNT(1)
FROM tmi_data.dbo.FV_BSE_CDR cdr
INNER JOIN tmi_data.dbo.DAT_LU_DATETIME dat
ON cdr.CA_DATE_ID = dat.DA_DATE_ID
WHERE dat.DA_WEEK_ID = 201146
--WHERE DA_DATE_ID IN ('2011-11-06', '2011-11-07', '2011-11-08', '2011-11-09', '2011-11-10', '2011-11-11', '2011-11-12')
GROUP BY cdr.CA_CALL_ROUTE_ID

jakieś pomysły? od niedawna zajmuję się SQL serverem, może jest coś oczywistego co przegapiłem

PS. próbowałem standardowych sztuczek typu podzapytania dla DAT_LU_DATETIME itd.
Bartłomiej Głowacki

Bartłomiej Głowacki BI Support Manager

Temat: SQL Server nie używa indexu w joinie

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)

-- 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')

konto usunięte

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?
Bartłomiej Głowacki

Bartłomiej Głowacki BI Support Manager

Temat: SQL Server nie używa indexu w joinie

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.

konto usunięte

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
Bartłomiej Głowacki

Bartłomiej Głowacki BI Support Manager

Temat: SQL Server nie używa indexu w joinie

dupa :) nie da się tego zrobić

ale dzięki za pomoc !
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: SQL Server nie używa indexu w joinie

A próbowałeś wymusić użycie indeksu przez WITH ( INDEX (NazwaIndeksu)) ?

http://www.sql-server-performance.com/2006/hints-table/

konto usunięte

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

konto usunięte

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

Następna dyskusja:

LiteSpeed for SQL Server - ...




Wyślij zaproszenie do