Haruskah ada indeks pada bendera 'Dihapus'?

Dalam database SQL Server 2008 R2 saya, kami menggunakan Soft Deletes (Kolom DateTime yang dapat dibatalkan, disebut 'Dihapus').

Ini ada di setiap tabel di database kami.

Saya telah menambahkan indeks, terutama berdasarkan tabel yang lebih besar, pada kolom yang biasa digunakan dalam klausa WHERE, atau pada klausa JOIN ON.

Namun pertanyaan saya adalah, haruskah saya menyertakan kolom DELETED di semua indeks ini juga, karena sering kali, saya mungkin melakukan sesuatu seperti:

SELECT ....
FROM TableA a
INNER JOIN TableB b
ON b.TableAId = a.Id
AND b.Deleted IS NULL
WHERE a.AFieldId = x

Dalam hal ini, apakah bermanfaat jika memiliki indeks seperti ini:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId, [Deleted])

Oleh karena itu, karena SEBAGIAN besar pertanyaan saya memeriksa tanda yang dihapus, seharusnya semuanya seperti ini?


person Craig    schedule 26.08.2014    source sumber


Jawaban (1)


Anda dapat mengurangi ukuran indeks menggunakan indeks yang difilter:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
WHERE ( [Deleted] IS NULL )

Tentu saja, indeks yang paling dapat diterapkan hampir selalu merupakan indeks penutup:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
INCLUDE ( column list )
WHERE ( [Deleted] IS NULL )

Referensi: BUAT INDEKS

Buat Indeks yang Difilter

person Mitch Wheat    schedule 26.08.2014
comment
Terima kasih, Mitch! Googling ini sekarang. - person Craig; 26.08.2014
comment
Mengenai Covering Index, dalam kasus sederhana saya di atas, 'daftar kolom' hanya akan menjadi 'TableAId', bukan? Atau apakah daftar kolomnya akan menjadi 'TableAId, Dihapus'? Apakah cara yang tepat untuk pergi? - person Craig; 26.08.2014
comment
Saat membaca ini: practicalsqldba.com/2013/ 03/ - Pertanyaan saya sehubungan dengan cakupan indeks adalah - mengapa saya tidak menambahkan SEMUA kolom saja ke 'Sertakan'. Tentunya ada penalti untuk ini? - person Craig; 26.08.2014
comment
Hukumannya adalah mempertahankan indeks jika salah satu kolom tersebut berubah. Penasihat Penyetelan Basis Data sering menyarankan indeks penutup yang menduplikasi tabel dengan menyertakan semua kolom (yang tidak ada di bagian indeks). Saya jarang mencamkan nasihatnya mengenai saran khusus ini. - person Mitch Wheat; 26.08.2014