Dalam tabel tanpa indeks berkerumun (tabel heap), halaman data tidak ditautkan bersama - jadi melintasi halaman memerlukan mencari ke dalam Peta Alokasi Indeks .
Namun, tabel berkerumun memiliki halaman data yang ditautkan dalam daftar tertaut ganda - membuat pemindaian berurutan sedikit lebih cepat. Tentu saja, sebagai gantinya, Anda memiliki overhead berurusan dengan menjaga agar halaman data tetap di INSERT
, UPDATE
, dan DELETE
. Namun, tabel heap memerlukan penulisan kedua ke IAM.
Jika kueri Anda memiliki RANGE
operator (mis.:SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
), maka tabel berkerumun (berada dalam urutan yang dijamin) akan lebih efisien - karena dapat menggunakan halaman indeks untuk menemukan halaman data yang relevan. Heap harus memindai semua baris, karena tidak dapat mengandalkan pengurutan.
Dan, tentu saja, indeks berkerumun memungkinkan Anda melakukan CLUSTERED INDEX SEEK, yang cukup optimal untuk kinerja...heap tanpa indeks akan selalu menghasilkan pemindaian tabel.
Jadi:
-
Untuk kueri contoh Anda di mana Anda memilih semua baris, satu-satunya perbedaan adalah daftar tertaut ganda yang dipertahankan oleh indeks berkerumun. Ini akan membuat tabel cluster Anda sedikit lebih cepat daripada heap dengan banyak baris.
-
Untuk kueri dengan
WHERE
klausa yang dapat (setidaknya sebagian) dipenuhi oleh indeks berkerumun, Anda akan keluar lebih dulu karena pemesanan - jadi Anda tidak perlu memindai seluruh tabel. -
Untuk kueri yang tidak dipenuhi oleh indeks berkerumun, Anda cukup seimbang...sekali lagi, satu-satunya perbedaan adalah daftar tertaut ganda untuk pemindaian berurutan. Dalam kedua kasus tersebut, Anda kurang optimal.
-
Untuk
INSERT
,UPDATE
, danDELETE
tumpukan mungkin atau mungkin tidak menang. Heap tidak harus menjaga ketertiban, tetapi memerlukan penulisan kedua ke IAM. Saya pikir perbedaan kinerja relatif dapat diabaikan, tetapi juga sangat bergantung pada data.
Microsoft memiliki whitepaper yang membandingkan indeks berkerumun dengan indeks non-cluster yang setara di heap (tidak persis sama seperti yang saya bahas di atas, tetapi tutup). Kesimpulan mereka pada dasarnya adalah menempatkan indeks berkerumun di semua tabel. Saya akan melakukan yang terbaik untuk meringkas hasil mereka (sekali lagi, perhatikan bahwa mereka benar-benar membandingkan indeks non-cluster dengan indeks berkerumun di sini - tapi saya pikir itu relatif sebanding):
INSERT
kinerja:indeks berkerumun menang sekitar 3% karena penulisan kedua diperlukan untuk heap.UPDATE
kinerja:indeks berkerumun menang sekitar 8% karena pencarian kedua diperlukan untuk heap.DELETE
kinerja:indeks berkerumun menang sekitar 18% karena pencarian kedua diperlukan dan penghapusan kedua diperlukan dari IAM untuk heap.- satu
SELECT
kinerja:indeks berkerumun menang sekitar 16% karena pencarian kedua diperlukan untuk heap. - rentang
SELECT
kinerja:indeks berkerumun menang sekitar 29% karena urutan acak untuk tumpukan. - bersamaan
INSERT
:tabel heap menang 30% saat dimuat karena pemisahan halaman untuk indeks berkerumun.