Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa perbedaan antara Pemindaian Tabel dan Pemindaian Indeks Berkelompok?

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 , dan DELETE 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Urutan baris default dalam kueri SELECT - SQL Server 2008 vs SQL 2012

  2. Pencadangan SQL Server 2017 -2

  3. Kunci asing ke kunci komposit

  4. Kembalikan Jenis Pemicu DML pada Tabel di SQL Server

  5. Ubah Password pada SA Login di SQL Server (Contoh T-SQL)