Apa itu "Indeks Pencocokan Parsial"?

27

Saya mencoba untuk mempelajari lebih lanjut tentang operator rencana permintaan "pemeriksaan kunci asing" yang diperkenalkan di SQL Server 2016. Tidak ada banyak informasi tentang itu di luar sana. Microsoft mengumumkannya di sini dan saya menulis blog di sini . Operator baru dapat dilihat dengan menghapus baris dari tabel induk dengan 254 atau lebih referensi kunci asing yang masuk: tautan dbfiddle .

Ada tiga hitungan berbeda yang ditampilkan dalam rincian operator:

FK memeriksa detailnya

  • Asing Referensi Kunci Hitungan adalah jumlah kunci asing yang masuk.
  • Penghitungan Indeks Tidak Cocok adalah jumlah kunci asing yang masuk tanpa indeks yang sesuai. Memverifikasi bahwa tabel yang diperbarui atau dihapus tidak akan melanggar kendala yang akan memerlukan pemindaian tabel anak.
  • Saya tidak tahu apa yang diwakili Hitung Indeks Pencocokan Parsial .

Apa yang dimaksud indeks pencocokan parsial dalam konteks ini? Saya tidak bisa mendapatkan yang berikut ini untuk bekerja:

  • Indeks yang difilter
  • Menempatkan kolom kunci asing sebagai INCLUDEkolom untuk indeks
  • Indeks dengan kolom kunci asing sebagai kolom kunci kedua
  • Indeks kolom tunggal untuk beberapa kunci asing kolom
  • Membuat beberapa indeks penutup untuk mengaktifkan rencana "indeks bergabung" untuk kunci asing beberapa kolom

Dan Guzman menunjukkan bahwa kunci asing beberapa kolom dapat cocok dengan indeks bahkan jika kunci indeks berada dalam urutan yang berbeda dari kolom kunci asing. Kode nya ada di sini jika seseorang dapat menggunakannya sebagai titik awal untuk mencari tahu lebih lanjut tentang indeks pencocokan sebagian.

Joe Obbish
sumber

Jawaban:

13

Saya berbicara kepada orang-orang yang jauh lebih pintar daripada saya dan kami akan mendokumentasikan ini segera ™.

Definisi sebenarnya dari ini, untuk sementara adalah:

PartialMatchingIndexCount mencerminkan jumlah referensi yang dapat diperiksa menggunakan indeks, tetapi kunci indeks tidak mencakup semua kolom yang diperiksa. Misalnya, elemen ForeignKeyReferenceCheck yang sesuai berisi elemen Cari Prediktif dan elemen Predikat.

Tambahan:

Jika angka ini lebih besar dari 0, ada masalah kinerja potensial, jika pencocokan parsial menghasilkan sejumlah besar baris.

Sean mengatakan Hapus Sara Chipps
sumber
6
Contoh yang berfungsi atau dokumentasi aktual akan sangat bagus. Bounty menawarkan
Tom V - Team Monica
3

Setelah googling lagi, saya berhasil membuat posting yang menyebutkan "Indeks Pencocokan Sebagian" dan Kunci Asing

The 1 Maret 2013 Blog Post di Blog Kode Carlos Klapp berjudulForeign Keys without Indexes memiliki disimpan prosedur yang disebut Util_FKsWithoutIndexesyang terlihat untuk kunci asing yang tidak memiliki indeks yang tepat untuk hubungan FK. (Sepertinya blogger ini mengangkat ini dari SQL Server Central The Ultimate Index-Less Foreign-Key Finder(15 Okt 2009) ) Blog mengatakan sebagai berikut:

Mencari batasan kunci asing yang tidak memiliki indeks yang sepenuhnya cocok.

Indeks pencocokan sebagian terbaik dikeluarkan dengan MatchCounts dan perbandingan kolom

Menghasilkan template CREATE INDEX untuk setiap kunci asing tanpa indeks yang cocok atau indeks yang cocok sebagian.

Kustomisasi sesuai kebutuhan (tambahkan sertakan, jika Anda ingin itu berkerumun, atau jika itu harus menjadi bagian dari kunci utama, atau jika Anda ingin bergabung dengan indeks lain)

FK yang kehilangan indeks pencocokan penuh dapat sangat merusak kinerja DELETES pada tabel yang dirujuk karena pemindaian tabel untuk memeriksa integritas referensial, serta SELECTS pada tabel referensi di mana kolom kunci asing berada di predikat WHERE atau JOIN (Ini akan memengaruhi Anda apakah ada kendala atau tidak). Ini hanya memeriksa kolom N pertama dari indeks di mana N adalah jumlah kolom dalam batasan kunci asing.

Urutan kolom indeks tidak diverifikasi di luar ini (FK dua-col yang memiliki 1 kolom yang cocok pada kolom ke-2 dari indeks 3-col akan dikeluarkan sebagai pencocokan parsial)

Jika basis data Anda tidak memiliki batasan kunci asing, maka alat ini tidak akan berguna bagi Anda.

Banyak basis data memiliki cakupan batasan kunci asing parsial. Ini hanya bekerja pada tabel terkait di mana batasan dinyatakan.

Jika saya memahami ini dengan benar, jika hubungan FK tidak memiliki indeks yang cocok dengan setiap kolom dalam beberapa indeks yang diperlukan, mungkin ada beberapa indeks yang memiliki beberapa kolom. Misalnya, jika hubungan FK memiliki tiga kolom ( a, b, c) tetapi tidak ada indeks dengan tiga kolom yang sama, mungkin ada indeks yang memiliki ( a, b) atau ( a, c) atau ( b, c) dan dapat membantu dengan pertanyaan tapi akan memerlukan beberapa pemindaian indeks ke baris dengan kolom yang hilang.

Jika tidak ada indeks sama sekali yang dapat mendukung kendala FK, maka "Penghitungan Indeks Pencocokan Parsial" akan menjadi nol ( 0), atau setidaknya tidak akan menambah jumlah ini.

RolandoMySQLDBA
sumber
Apakah ini yang ada dalam pikiran Anda? Masih tidak bisa membuatnya bekerja ... dbfiddle.uk/
Joe Obbish
Tidak persis. Coba buat FK dengan (FKey2,FKey3)dan buat indeks FKey2. Silakan coba itu.
RolandoMySQLDBA
Tolong ingat saya bukan orang SQL Server, tapi saya hanya mencoba membantu.
RolandoMySQLDBA
Saya memahami dan menghargai setiap ide untuk dicoba. Saya juga tidak bisa membuat dua kolom satu berfungsi.
Joe Obbish
Anda dapat parit create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), terus indeks FKey2dan coba lagi.
RolandoMySQLDBA