Apakah ada aturan yang keras dan cepat untuk memutuskan kolom apa dan urutan mana yang harus dimasukkan dalam indeks Non-clustered. Saya baru saja membaca posting ini https://stackoverflow.com/questions/1307990/why-use-the-include-clause-when-creating-an-index dan saya menemukan itu untuk kueri berikut:
SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5
Poster menyarankan untuk membuat indeks seperti ini:
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee(EmployeeID, DepartmentID)
INCLUDE (Lastname)
inilah pertanyaan saya mengapa kita tidak dapat membuat indeks seperti ini
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, DepartmentID, LastName)
atau
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)
dan apa yang menyebabkan poster memutuskan untuk memasukkan kolom LastName. Kenapa tidak kolom lain? dan bagaimana memutuskan dalam urutan apa kita harus menyimpan kolom di sana?
sql-server
sql-server-2005
sql-server-2008
index
Komunitas
sumber
sumber
Jawaban:
Saran indeks oleh marc_s salah. Saya telah menambahkan komentar. (Dan jawaban saya juga diterima!)
Indeks untuk kueri ini adalah
Indeks biasanya
Dimana:
DI MANA, BERGABUNG, MEMESAN OLEH, GROUP BY, dll.
sumber
NonKeyColList
pesanan tidak masalah.KeyColList
urutan harus dalam urutan frekuensi yang Anda harapkan akan digunakan dalam permintaan. Lihat catatan saya pada jawaban saya di bawah, tetapi itu sepertiLast Name, First Name, Middile Initial
di buku telepon. Anda perlu bidang pertama untuk menemukan bidang kedua.JNK dan gbn telah memberikan jawaban yang bagus, tetapi juga layak mempertimbangkan gambaran besarnya - tidak hanya berfokus pada satu permintaan. Meskipun kueri khusus ini mungkin mendapat manfaat dari indeks (# 1):
Indeks ini tidak membantu sama sekali jika permintaan sedikit berubah, seperti:
Ini membutuhkan indeks (# 2):
Bayangkan Anda memiliki 1.000 karyawan di Departemen 5. Dengan menggunakan indeks # 1, untuk menemukan semua Smiths, Anda harus mencari semua 1.000 baris di Departemen 5, karena kolom yang disertakan bukan bagian dari kunci. Dengan menggunakan indeks # 2, Anda dapat mencari langsung ke Departemen 5, LastName Smith.
Dengan demikian, Indeks # 2 lebih bermanfaat untuk melayani berbagai pertanyaan yang lebih luas - tetapi biayanya adalah kunci indeks yang lebih membengkak, yang akan membuat halaman indeks yang tidak berdaun lebih besar. Setiap sistem akan berbeda, jadi tidak ada aturan umum di sini.
Sebagai catatan, ada baiknya menunjukkan bahwa jika EmployeeID adalah kunci pengelompokan untuk tabel ini - dengan asumsi indeks berkerumun - maka Anda tidak perlu memasukkan EmployeeID - itu ada di semua indeks non-cluster, artinya indeks # 2 bisa saja menjadi
sumber
Saya tidak yakin bagaimana Anda mendapatkan yang pertama. Bagi saya, untuk permintaan itu, saya akan menggunakan:
Tidak ada "Aturan keras dan cepat" untuk hampir semua hal dalam SQL.
Tetapi, untuk contoh Anda, satu-satunya bidang yang akan digunakan indeks adalah
DepartmentID
karena berada dalamWHERE
klausa.Kolom lain hanya perlu mudah diakses dari sana. Anda memilih berdasarkan pada
DepartmentID
kemudianINCLUDE
memiliki bidang-bidang di simpul daun indeks.Anda tidak ingin menggunakan contoh Anda yang lain karena mereka tidak akan berfungsi untuk indeks ini.
Pikirkan indeks seperti buku telepon. Sebagian besar buku telepon dipesan dengan Nama Belakang, Nama Depan, Nama Awal Menengah. Jika Anda tahu nama depan seseorang, tetapi bukan nama belakangnya, buku telepon itu tidak berguna karena Anda tidak dapat mencari nama depan berdasarkan urutan indeks buku telepon itu.
The
INCLUDE
bidang seperti nomor telepon, alamat, dll informasi lainnya untuk setiap entri dalam buku.EDIT:
Untuk lebih memperjelas mengapa tidak menggunakan:
Indeks ini hanya berguna jika Anda memiliki
EmployeeID
atau KEDUAEmployeeID
danLastName
dalamWHERE
klausa Anda . Ini cukup OPPOSITE dari apa yang Anda butuhkan untuk permintaan ini.sumber
Saya pikir Anda mungkin masih dapat menggunakan indeks (employee_id, department_id), tetapi Anda harus memasukkan baris 'dummy' dalam frasa tempat, seperti: "employee_id = employee_id)
Gunakan trik "lama"?
pilih * dari emp Karyawan di
mana emp.employee_id = emp.employee_id
dan emp.department_id = 5
(Jadi saya tidak fokus pada bagian sertakan di sini Nama belakang, tetapi pada kunci ya / tidak digunakan.)
Salam Hormat,
Miguell
sumber