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

Mengapa ini Pemindaian Indeks dan bukan Pencarian Indeks?

Ini menggunakan Scan Indeks terutama karena juga menggunakan Gabung Gabung. Operator Gabung Gabung memerlukan dua aliran input yang keduanya diurutkan dalam urutan yang kompatibel dengan kondisi Gabung.

Dan menggunakan operator Gabung Bergabung untuk mewujudkan INNER JOIN Anda karena percaya bahwa itu akan lebih cepat daripada operator Nested Loop Join yang lebih khas. Dan itu mungkin benar (biasanya demikian), dengan menggunakan dua indeks yang telah dipilihnya, ia memiliki aliran input yang keduanya telah diurutkan sebelumnya sesuai dengan kondisi bergabung Anda (ID Lokasi). Ketika aliran input diurutkan sebelumnya seperti ini, Gabung Gabung hampir selalu lebih cepat daripada dua lainnya (Penggabungan Loop dan Hash).

Kelemahannya adalah apa yang Anda perhatikan:tampaknya memindai seluruh indeks, jadi bagaimana itu bisa lebih cepat jika membaca begitu banyak catatan yang mungkin tidak pernah digunakan? Jawabannya adalah Pemindaian (karena sifatnya yang berurutan) dapat membaca di mana saja dari 10 hingga 100 kali lebih banyak catatan/detik daripada yang dicari.

Now Seeks biasanya menang karena selektif:mereka hanya mendapatkan baris yang Anda minta, sedangkan Scan tidak selektif:mereka harus mengembalikan setiap baris dalam jangkauan. Tetapi karena Pemindaian memiliki banyak kecepatan baca yang lebih tinggi, mereka sering dapat mengalahkan Pencarian selama rasio Baris yang Dibuang ke Baris yang Cocok lebih rendah daripada rasio Scan rows/sec VS. Cari baris/dtk.

Ada pertanyaan?

Oke, saya diminta untuk menjelaskan kalimat terakhir lebih lanjut:

"Baris yang Dibuang" adalah yang dibaca oleh Pemindaian (karena harus membaca semua yang ada di indeks), tetapi akan ditolak oleh operator Gabung Bergabung, karena tidak memiliki kecocokan di sisi lain, mungkin karena Kondisi klausa WHERE telah mengecualikannya.

"Baris yang Cocok" adalah yang dibacanya yang sebenarnya cocok dengan sesuatu di Gabung Gabung. Ini adalah baris yang sama yang akan dibaca oleh Seek jika Scan digantikan oleh Seek.

Anda dapat mengetahui apa yang ada dengan melihat statistik di Paket Kueri. Lihat panah gemuk besar di sebelah kiri Scan Index? Itu menunjukkan berapa banyak baris yang menurut pengoptimal akan dibaca dengan Pemindaian. Kotak statistik Pemindaian Indeks yang Anda posting menunjukkan Baris Sebenarnya yang dikembalikan sekitar 5,4 juta (5.394.402). Ini sama dengan:

TotalScanRows = (MatchingRows + DiscardedRows)

(Dalam istilah saya, anyway). Untuk mendapatkan Baris yang Cocok, lihat "Baris Sebenarnya" yang dilaporkan oleh operator Gabung Gabung (Anda mungkin harus menghapus TOP 100 untuk mendapatkan ini secara akurat). Setelah mengetahui hal ini, Anda bisa mendapatkan baris yang Dibuang dengan:

DiscardedRows = (TotalScanRows - MatchingRows)

Dan sekarang Anda dapat menghitung rasionya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Proses Lengkap untuk Menyalin Tabel dari Satu Database ke Database Lainnya (Ekspor-Impor) di SQL Server

  2. Bagaimana cara menghubungkan Sqlcmd ke server?

  3. Pulihkan cadangan SQL Server 2000 di SQL Server 2012

  4. Cara Menghitung Persegi di SQL Server

  5. Jangan Gunakan sys.sql_dependencies di SQL Server (Sudah Usang)