Indeks Berganda vs Indeks Multi-Kolom

646

Saya baru saja menambahkan Indeks ke tabel di SQL Server 2005 dan itu membuat saya berpikir. Apa perbedaan antara membuat 1 indeks dan menentukan beberapa kolom dibandingkan memiliki 1 indeks per kolom yang ingin Anda indeks.

Adakah alasan tertentu mengapa satu harus digunakan di atas yang lain?

Sebagai contoh

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Melawan

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
GateKiller
sumber

Jawaban:

319

Saya setuju dengan Cade Roux .

Artikel ini akan membuat Anda berada di jalur yang benar:

Satu hal yang perlu diperhatikan, indeks berkerumun harus memiliki kunci unik (kolom identitas yang saya sarankan) sebagai kolom pertama. Pada dasarnya itu membantu memasukkan data Anda di akhir indeks dan tidak menyebabkan banyak disk IO dan Page splits.

Kedua, jika Anda membuat indeks lain pada data Anda dan mereka dibangun dengan cerdas mereka akan digunakan kembali.

mis. bayangkan Anda mencari tabel pada tiga kolom

negara bagian, wilayah, pos.

  • Anda terkadang mencari berdasarkan negara bagian saja.
  • Anda terkadang mencari berdasarkan negara bagian dan wilayah.
  • Anda sering mencari berdasarkan negara, wilayah, pos.

Kemudian indeks dengan negara bagian, county, zip. akan digunakan dalam ketiga pencarian ini.

Jika Anda mencari dengan zip saja cukup banyak maka indeks di atas tidak akan digunakan (oleh SQL Server) karena zip adalah bagian ketiga dari indeks itu dan pengoptimal kueri tidak akan melihat indeks itu sebagai bermanfaat.

Anda kemudian dapat membuat indeks pada Zip saja yang akan digunakan dalam contoh ini.

Ngomong-ngomong, kita dapat mengambil keuntungan dari kenyataan bahwa dengan pengindeksan Multi-Kolom, kolom indeks pertama selalu dapat digunakan untuk pencarian dan ketika Anda mencari hanya dengan 'menyatakan' itu efisien tetapi belum seefisien indeks Kolom Tunggal pada 'status' '

Saya kira jawaban yang Anda cari adalah bahwa itu tergantung pada klausa tempat Anda dari pertanyaan yang sering digunakan dan juga oleh grup Anda.

Artikel itu akan banyak membantu. :-)

orang jahat
sumber
2
Jadi apakah hal terbaik untuk dilakukan adalah menentukan indeks untuk negara bagian, county, dan zip di samping indeks individu untuk setiap kolom?
Maxim Zaslavsky
12
@ jball. Apakah saya kehilangan sesuatu di sini? Sepertinya artikel ini sebagian besar tentang perbedaan antara batasan versi SQL Server. Mungkinkah artikel telah dipindahkan?
Ian R. O'Brien
@Ian itu memang terlihat seperti sesuatu yang telah hilang dalam waktu 3 tahun sejak saya menyortir tautan asli dari sekarang lebih dari 4 tahun yang lalu. Saya dapat memberitahu Anda bahwa posting blog memiliki judul yang benar seperti yang ditautkan oleh evilhomer, tetapi sepertinya blog tindak lanjut dalam seri ini tidak lagi mudah ditemukan dari posting pertama itu. Anda harus melihat-lihat arsip blog Kimberly untuk melihat apakah Anda dapat menemukan yang lain di seri.
jball
1
1) "Pada dasarnya [Indeks Clustered dengan kolom IDENTITY sebagai yang pertama] membantu memasukkan data Anda di akhir indeks" sudah benar. "dan tidak menyebabkan banyak disk IO dan Page splits" benar-benar salah dalam sistem multi-pengguna. Yang benar adalah, ia menjamin pertengkaran tinggi (konkurensi rendah) dalam sistem multi-pengguna. 2) Indeks Clustered harus menjadi Kunci Relasional, yaitu. bukan sebuah IDENTITY, GUID, etc. 3) "Lalu indeks dengan negara bagian, county, zip. Akan digunakan dalam ketiga pencarian ini." salah, dan bertentangan dengan "kolom pertama dapat digunakan". 2nd & subs cols dalam indeks tidak dapat digunakan untuk pencarian.
PerformanceDBA
81

Iya. Saya sarankan Anda memeriksa artikel Kimberly Tripp tentang pengindeksan .

Jika indeks "meliputi", maka tidak perlu menggunakan apa pun kecuali indeks. Di SQL Server 2005, Anda juga bisa menambahkan kolom tambahan ke indeks yang bukan bagian dari kunci yang dapat menghilangkan perjalanan ke seluruh baris.

Memiliki beberapa indeks, masing-masing pada satu kolom dapat berarti bahwa hanya satu indeks yang digunakan sama sekali - Anda harus merujuk pada rencana eksekusi untuk melihat apa efek yang ditawarkan berbagai skema pengindeksan.

Anda juga dapat menggunakan panduan tuning untuk membantu menentukan indeks apa yang akan membuat kueri atau beban kerja yang diberikan melakukan yang terbaik.

Cade Roux
sumber
7
Kimberly Tripp tahu apa yang dia bicarakan. Saya sedang berbicara tentang miliknya dan dia tahu hal ini dari dalam ke luar. Saran bagus.
evilhomer
@CadeRoux Jika sebagian besar klausa tempat saya memiliki 2 kolom dalam hubungan '&', apakah lebih baik memiliki indeks multi-kolom pada keduanya atau indeks satu kolom pada keduanya
Jebakan
2
@RachitGupta Satu indeks dengan kedua kolom
Cade Roux
40

Indeks multi-kolom dapat digunakan untuk permintaan referensi semua kolom:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Ini dapat dilihat secara langsung menggunakan indeks multi-kolom. Di sisi lain, paling banyak satu indeks kolom tunggal dapat digunakan (itu harus mencari semua catatan memiliki Column1 = 1, dan kemudian memeriksa Column2 dan Column3 di masing-masing).

MobyDX
sumber
24
Ini benar. Namun, memiliki kolom-kolom ini sebagai indeks tunggal masing-masing masih akan mempercepat hal-hal secara dramatis. Biasanya salah satu nilai di kolom akan mengurangi himpunan yang dihasilkan begitu banyak sehingga tidak masalah untuk mencari sisanya tanpa indeks dan pengoptimal yang baik dalam memilih nilai ini.
TToni
16

Satu hal yang sepertinya terlewatkan adalah transformasi bintang. Indeks Persimpangan operator menyelesaikan predikat dengan menghitung set baris yang dipukul oleh masing-masing predikat sebelum I / O dilakukan pada tabel fakta. Pada skema bintang Anda akan mengindeks setiap kunci dimensi individu dan pengoptimal kueri dapat menyelesaikan baris mana yang akan dipilih oleh perhitungan persimpangan indeks. Indeks pada kolom individual memberikan fleksibilitas terbaik untuk ini.

ConcernedOfTunbridgeWells
sumber
+1 untuk penjelasan terkait yang baik tentang bagaimana indeks (biasa) digunakan, relevan dengan pertanyaan.
RobM
7

Jika Anda memiliki kueri yang akan sering menggunakan kumpulan kolom yang relatif statis, membuat indeks penutup tunggal yang mencakup semuanya akan meningkatkan kinerja secara dramatis.

Dengan meletakkan beberapa kolom dalam indeks Anda, pengoptimal hanya perlu mengakses tabel secara langsung jika kolom tidak ada dalam indeks. Saya banyak menggunakan ini dalam pergudangan data. Kelemahannya adalah melakukan hal ini dapat menghabiskan banyak biaya, terutama jika data sangat fluktuatif.

Membuat indeks pada kolom tunggal berguna untuk operasi pencarian yang sering ditemukan dalam sistem OLTP.

Anda harus bertanya pada diri sendiri mengapa Anda mengindeks kolom dan bagaimana mereka akan digunakan. Jalankan beberapa paket permintaan dan lihat kapan mereka sedang diakses. Penyetelan indeks adalah naluri sebanyak sains.

Bob Probst
sumber