Paket SQL Server: perbedaan antara Index Scan / Index Seek

89

Dalam rencana Eksekusi SQL Server, apa perbedaan antara Index Scan dan Index Seek

Saya menggunakan SQL Server 2005.

cindi
sumber

Jawaban:

129

Pemindaian indeks adalah tempat SQL server membaca seluruh indeks untuk mencari kecocokan - waktu yang dibutuhkan sebanding dengan ukuran indeks.

Pencarian indeks adalah tempat SQL server menggunakan struktur b-tree dari indeks untuk mencari secara langsung ke rekaman yang cocok (lihat http://mattfleming.com/node/192 untuk mengetahui cara kerjanya) - waktu yang dibutuhkan hanya sebanding dengan jumlah catatan yang cocok.

  • Secara umum pencarian indeks lebih disukai daripada pemindaian indeks (ketika jumlah rekaman yang cocok jauh lebih rendah daripada jumlah total rekaman), karena waktu yang dibutuhkan untuk melakukan pencarian indeks adalah konstan terlepas dari jumlah total rekaman di meja.
  • Namun perlu dicatat bahwa dalam situasi tertentu pemindaian indeks bisa lebih cepat daripada pencarian indeks (terkadang secara signifikan lebih cepat) - biasanya ketika tabel sangat kecil, atau ketika persentase besar catatan cocok dengan predikatnya.
Justin
sumber
3
Apakah tautannya masih aktif? bagi saya itu tidak berhasil. Tolong bantu jika ada tautan yang diperbarui
Ronak Agrawal
2
@RonakAgrawal Sepertinya link tersebut sudah mati - mungkin periksa wikipedia ?
Justin
77

Aturan dasar yang harus diikuti adalah Pemindaian itu buruk, Pencarian itu baik.

Indeks Scan

Ketika SQL Server melakukan pemindaian, ia memuat objek yang ingin dibaca dari disk ke dalam memori, kemudian membaca objek tersebut dari atas ke bawah untuk mencari catatan yang dibutuhkannya.

Pencarian Indeks

Ketika SQL Server melakukan pencarian, ia tahu di mana dalam indeks bahwa datanya akan berada, jadi ia memuat indeks dari disk, langsung menuju ke bagian indeks yang dibutuhkan dan membaca ke mana data yang dibutuhkannya berakhir . Ini jelas merupakan operasi yang jauh lebih efisien daripada pemindaian, karena SQL sudah mengetahui di mana data yang dicari berada.


Bagaimana saya dapat mengubah Rencana Eksekusi untuk menggunakan Pencarian, bukan Pemindaian?

Ketika SQL Server mencari data Anda, mungkin salah satu hal terbesar yang akan membuat SQL Server beralih dari pencarian ke pemindaian adalah ketika beberapa kolom yang Anda cari tidak termasuk dalam indeks yang ingin Anda gunakan. Paling sering ini akan membuat SQL Server kembali melakukan pemindaian indeks berkerumun, karena indeks Tergugus berisi semua kolom di tabel. Ini adalah salah satu alasan terbesar (menurut saya setidaknya) bahwa kita sekarang memiliki kemampuan untuk MENYERTAKAN kolom dalam indeks, tanpa menambahkan kolom tersebut ke kolom indeks yang diindeks. Dengan memasukkan kolom tambahan dalam indeks, kami meningkatkan ukuran indeks, tetapi kami mengizinkan SQL Server untuk membaca indeks, tanpa harus kembali ke indeks berkerumun, atau ke tabel itu sendiri untuk mendapatkan nilai-nilai ini.

Referensi

Untuk informasi mengenai spesifik dari masing-masing operator ini dalam rencana Eksekusi SQL Server, lihat ....

John Sansom
sumber
7

Jawaban singkat:

  • Pemindaian indeks: Sentuh semua baris kecuali kolom tertentu.

  • Pencarian indeks: Sentuh baris dan kolom tertentu.

Mata yang besar
sumber
4

Dengan Pindai Indeks, semua baris dalam indeks dipindai untuk menemukan baris yang cocok. Ini bisa efisien untuk tabel kecil. Dengan Pencarian Indeks, itu hanya perlu menyentuh baris yang benar-benar memenuhi kriteria dan biasanya lebih berkinerja

AdaTheDev
sumber
2

Indeks Pindai terjadi ketika definisi indeks tidak dapat menemukan pada satu baris untuk memenuhi predikat pencarian. Dalam hal ini SQL Server harus memindai beberapa halaman untuk menemukan berbagai baris yang memenuhi predikat pencarian.

Dalam kasus Pencarian Indeks, SQL Server menemukan satu baris pencarian yang cocok dengan predikat menggunakan definisi indeks .

Pencarian Indeks lebih baik dan lebih efektif.

kevchadders
sumber
0

Pemindaian menyentuh setiap baris dalam tabel meskipun itu yang Anda cari atau tidak

Seorang seeker hanya melihat pada baris yang Anda cari.

Pencarian selalu lebih baik daripada pemindaian karena lebih efisien dalam cara mencari data.

Penjelasan yang bagus dapat ditemukan di sini

AutomatedTester
sumber
3
Pencarian tidak selalu lebih baik, misalnya jika tabel relatif kecil dan sebagian besar baris dalam tabel itu perlu dikembalikan, maka pemindaian indeks dapat menjadi jauh lebih efisien.
Justin
1
Hai Justin, menurutku pemindaian tabel terkadang bisa lebih baik. Indexes Seek selalu lebih baik daripada Index Scan kecuali kita berbicara tentang clustered. Namun, terkadang, pemindaian tabel atau Pemindaian Indeks Tergugus mungkin lebih efisien untuk alasan yang Anda sebutkan. Alih-alih mencari indeks dan mendapatkan bidang yang tidak ada dalam indeks dari tabel, terkadang, ms sql akan menggunakan tabel meskipun indeks memiliki kolom kriteria.
Jose Area