Termasuk Kolom versus Indeks yang Difilter

11

Kami saat ini bekerja dengan tabel bernama tb_tranfers . Tabel ini memiliki 40 juta baris dan berukuran ~ 26 GB (data 11 GB, indeks 15 GB).

10 hingga 15% dari baris adalah baris yang dihapus dengan lunak ( DeletedDate bukan nol). Aplikasi hanya menggunakan baris di mana DeletedDate adalah nol. Semua kueri ke tabel ini akan menyertakan klausa untuk efek itu.

Ada 15 indeks pada tabel ini. DMV indeks yang hilang berisi saran untuk membuat indeks dengan DeletedDate sebagai kolom yang disertakan.

Apakah akan membantu untuk menggunakan indeks yang difilter WHERE DeleteDdate IS NULLpada semua 11 indeks yang tidak dihitung? Atau akan lebih baik untuk memiliki kolom DeletedDate sebagai kolom yang disertakan?

Paul White 9
sumber

Jawaban:

12

Ya, memodifikasi semua 11 indeks NC yang akan difilter indeks ( CREATE INDEX ... ON ... WHERE DeletedDate IS NULL) akan membantu. Dengan cara ini Anda mendapatkan dua keuntungan:

  • Query Optimizer akan tahu bahwa setiap baris yang datang dari indeks ini sudah tidak memenuhi filter kueri Anda di DeletedDate, sehingga tidak perlu lookup indeks berkerumun untuk periksa DeletedDate yang
  • Semua indeks NC akan berukuran 10-15% lebih kecil, membutuhkan lebih sedikit memori dan lebih sedikit operasi IO untuk pencarian.

Imbalannya adalah bahwa setiap kueri yang merawat baris yang dihapus dengan lembut (dan harus ada beberapa permintaan, jika tidak, mengapa baris itu ada?) Tidak akan dapat menggunakan indeks NC ini.

Remus Rusanu
sumber
7

Jika Anda SELALU menggunakan DeletedDate IS NULLfilter dalam kueri, maka ya Anda kemungkinan akan melihat peningkatan kinerja yang signifikan dengan menambahkan filter.

Ini jauh lebih sedikit halaman untuk mesin untuk memeriksa untuk menemukan baris yang relevan, yang berarti lebih sedikit IO (dan lebih banyak kecepatan).

Menambahkannya sebagai INCLUDEDbidang tidak akan berguna . Karena Anda selalu memasukkannya dalam filter, (tapi mungkin tidak pernah menambahkannya ke daftar SELECT), bidang itu tidak akan pernah dirujuk jika Anda menambahkannya sebagai INCLUDE.

JNK
sumber
2

Karena 85-90% baris DeletedDate adalah NULL, tidak mungkin bahwa selektivitas indeks yang hanya terdiri dari DeletedDate akan cukup untuk SQL untuk menggunakan indeks ini. Namun, digunakan bersama dengan kolom lain yang lebih selektif, menambahkan DeletedDate ke indeks yang ada akan memberikan beberapa manfaat jika meningkatkan selektivitas keseluruhan indeks.

Seperti yang dikatakan JNK, DeletedDate akan sedikit berguna dalam mencakup indeks kecuali Anda menggunakannya dalam klausa SELECT.

Karena sudah ada lebih banyak penyimpanan untuk indeks daripada untuk data, Anda mungkin juga ingin melihat apakah ada redundansi dalam 15 indeks NC yang ada.

StuartLC
sumber