Saya telah membuat indeks yang difilter di bawah ini tetapi ketika saya menjalankan 2 kueri lebih jauh ke bawah, indeks ini hanya digunakan untuk pencarian dalam contoh pertama yang memiliki END_DTTM dalam GABUNGAN daripada klausa di mana (itulah satu-satunya perbedaan dalam kueri) . Adakah yang bisa menjelaskan mengapa ini terjadi?
Pembuatan Indeks
CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE]
(
[LIST_ID] ASC,
[END_DTTM] ASC
)
WHERE ([END_DTTM] IS NULL)
Pertanyaan
DECLARE @LIST_ID INT = 3655
--This one seeks on the index
SELECT
PATIENT_LISTS.LIST_ID
FROM
DBO.PATIENT_LISTS
LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID
AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL
WHERE
PATIENT_LISTS.LIST_ID = @LIST_ID
--This one scans on the index
SELECT
PATIENT_LISTS.LIST_ID
FROM
DBO.PATIENT_LISTS
LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID
WHERE
PATIENT_LISTS.LIST_ID = @LIST_ID AND
PATIENT_LIST_BESPOKE.END_DTTM IS NULL
Dua pertanyaan berbeda - dalam arti dan hasil. Ini adalah penulisan ulang, jadi lebih jelas apa yang dilakukan dua pertanyaan:
dan ke-2:
Saya pikir sekarang cukup jelas bahwa untuk bagian 2 dari permintaan 2nq, indeks yang difilter tidak dapat digunakan.
Secara detail, mengenai kueri ini, ada 4 jenis
LIST_ID
nilai di tabel pertama:(a) nilai yang memiliki baris yang cocok di tabel kedua, semuanya dengan
END_DTTM IS NULL
.(B) nilai-nilai yang memiliki baris yang cocok di tabel kedua, baik dengan
END_DTTM IS NULL
dan denganEND_DTTM IS NOT NULL
.(c) nilai yang memiliki baris yang cocok di tabel kedua, semuanya dengan
END_DTTM IS NOT NULL
.(D) nilai-nilai yang tidak memiliki baris yang cocok di tabel kedua.
Sekarang, kueri pertama akan mengembalikan semua nilai tipe (a) dan (b) mungkin berkali-kali (sebanyak mereka memiliki baris yang cocok di tabel kedua dengan
END_DTTM IS NULL
) dan semua baris tipe (c) dan (d) tepat sekali ( itu adalah bagian yang tidak cocok dari bagian luar).Kueri ke-2 akan mengembalikan semua nilai tipe (a) dan (b) mungkin berkali-kali (sebanyak mereka memiliki baris yang cocok di tabel kedua dengan
END_DTTM IS NULL
) dan semua baris tipe (d) tepat sekali.Itu tidak akan mengembalikan nilai jenis (c) karena gabungan akan menemukan baris yang cocok di tabel kedua (tetapi ini akan memiliki
END_DTTM IS NOT NULL
) dan mereka akan dihapus olehWHERE
klausa berikutnya .sumber