Apakah urutan kolom dalam indeks PK penting?
Ya itu.
Secara default, batasan kunci utama ditegakkan dalam SQL Server oleh indeks berkerumun unik. Indeks berkerumun mendefinisikan urutan logis dari baris dalam tabel. Mungkin ada sejumlah halaman indeks tambahan yang ditambahkan untuk mewakili tingkat atas dari indeks b-tree, tetapi level terendah (daun) dari indeks berkerumun hanyalah urutan logis dari data itu sendiri.
Agar lebih jelas tentang hal itu, baris pada halaman tidak secara fisik disimpan dalam urutan kunci indeks berkerumun. Ada struktur tipuan terpisah di dalam halaman yang menyimpan pointer ke setiap baris. Struktur ini diurutkan berdasarkan kunci indeks berkerumun. Juga, setiap halaman memiliki pointer ke halaman sebelumnya dan berikutnya pada tingkat yang sama dalam urutan kunci indeks berkerumun.
Dengan kunci primer yang dikelompokkan (RowNumber, DataDate)
, baris secara logis diurutkan pertama RowNumber
dan kemudian oleh DataDate
- jadi semua baris di mana RowNumber = 1
secara logis dikelompokkan bersama, lalu baris di mana RowNumber = 2
dan seterusnya.
Ketika Anda menambahkan data baru (dengan RowNumbers
dari 1 ke n) baris baru secara logis berada di dalam halaman yang ada, jadi SQL Server kemungkinan harus melakukan banyak pekerjaan pemisahan halaman untuk membuat ruang. Semua aktivitas ini menghasilkan banyak pekerjaan tambahan (termasuk mencatat perubahan) tanpa hasil.
Halaman split juga memulai sekitar 50% kosong, sehingga pemisahan yang berlebihan dapat menghasilkan kepadatan halaman yang rendah (lebih sedikit baris daripada optimal per halaman) juga. Tidak hanya berita buruk untuk membaca dari disk (kepadatan lebih rendah = lebih banyak halaman untuk dibaca), halaman dengan kepadatan lebih rendah juga memakan lebih banyak ruang dalam memori saat di-cache.
Mengubah indeks clustered ke (DataDate, RowNumber
) berarti bahwa data baru (dengan, mungkin, lebih tinggi DataDates
dari yang disimpan saat ini) ditambahkan ke akhir logis dari indeks clustered pada halaman baru. Ini akan menghapus overhead yang tidak perlu dari halaman pemisah dan menghasilkan waktu pemuatan yang lebih cepat. Data yang kurang terfragmentasi juga berarti bahwa aktivitas baca-depan (membaca halaman dari disk tepat sebelum dibutuhkan untuk permintaan yang sedang berlangsung) dapat lebih efisien.
Jika tidak ada yang lain, kueri Anda lebih cenderung mencari DataDate
daripada RowNumber
. Indeks berkerumun aktif (DataDate, RowNumber
) mendukung indeks mencari DataDate
(dan kemudian RowNumber
). Pengaturan yang ada hanya mendukung pencarian pada RowNumber
(dan hanya kemudian, mungkin, pada DataDate
). Anda mungkin dapat menghapus indeks nonclustered yang ada DataDate
saat kunci primer diubah. Indeks berkerumun akan lebih luas daripada indeks nonclustered menggantikannya, jadi Anda harus menguji untuk memastikan bahwa kinerja tetap dapat diterima.
Saat mengimpor data baru bcp
, Anda mungkin mendapatkan kinerja yang lebih tinggi jika data dalam file impor diurutkan berdasarkan kunci indeks yang dikelompokkan (idealnya (DataDate, RowNumber
)) dan Anda menentukan bcp
opsi:
-h "ORDER(DataDate,RowNumber), TABLOCK"
Untuk kinerja pemuatan data terbaik, Anda dapat mencoba mencapai sisipan yang minim log. Untuk informasi lebih lanjut, lihat: