Bagaimana cara menggunakan indeks dalam pernyataan pilih?

97

Katakanlah di tabel karyawan, saya telah membuat indeks (idx_name) pada emp_namekolom tabel.

Apakah saya perlu secara eksplisit menentukan nama indeks dalam klausa pilih atau secara otomatis akan digunakan untuk mempercepat kueri.

Jika diperlukan untuk ditentukan dalam klausa pemilihan, Apa sintaks untuk menggunakan indeks dalam kueri pemilihan?

Vivek
sumber

Jawaban:

87

Jika Anda ingin menguji indeks untuk melihat apakah itu berfungsi, berikut sintaksnya:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Pernyataan WITH akan memaksa indeks untuk digunakan.

Jason
sumber
83
Posting ini tidak menjawab pertanyaan tersebut. Jawabannya adalah, singkatnya: Anda tidak perlu menentukan indeks dalam kueri. Ini digunakan (atau tidak) secara otomatis. Anda bisa memaksanya. Lebih jelasnya (kapan dan mengapa melakukan ini) di posting lain di bawah ini.
Rast
34

Pertanyaan bagus,

Biasanya mesin DB harus secara otomatis memilih indeks untuk digunakan berdasarkan rencana eksekusi kueri yang dibuatnya. Namun, ada beberapa kasus yang sangat jarang terjadi ketika Anda ingin memaksa DB menggunakan indeks tertentu.

Untuk dapat menjawab pertanyaan spesifik Anda, Anda harus menentukan DB yang Anda gunakan.

Untuk MySQL, Anda ingin membaca dokumentasi Sintaks Petunjuk Indeks tentang cara melakukannya

Tudor Constantin
sumber
30

Bagaimana cara menggunakan indeks dalam pernyataan pilih?
cara ini:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

Dan masih banyak lagi cara untuk memeriksa ini

Apakah saya perlu menjelaskan secara eksplisit?

  • Tidak, tidak Perlu menentukan secara eksplisit.
  • Mesin DB harus secara otomatis memilih indeks untuk digunakan berdasarkan rencana eksekusi kueri yang dibangunnya dari jawaban @Tudor Constantin.
  • Pengoptimal akan menilai apakah penggunaan indeks Anda akan membuat kueri Anda berjalan lebih cepat, dan jika ya, ia akan menggunakan indeks. dari jawaban @niktrl
VdeX
sumber
13

Secara umum , indeks akan digunakan jika asumsi biaya penggunaan indeks, dan kemudian mungkin harus melakukan pencarian bookmark lebih lanjut lebih rendah daripada biaya hanya memindai seluruh tabel.

Jika kueri Anda berbentuk:

SELECT Name from Table where Name = 'Boris'

Dan 1 baris dari 1000 memiliki nama Boris, hampir pasti akan digunakan. Jika nama semua orang adalah Boris, kemungkinan akan menggunakan pemindaian tabel, karena indeks tidak mungkin menjadi strategi yang lebih efisien untuk mengakses data.

Jika tabelnya lebar (banyak kolom) dan Anda melakukannya:

SELECT * from Table where Name = 'Boris'

Kemudian ia mungkin masih memilih untuk melakukan pemindaian tabel, jika itu adalah asumsi yang masuk akal bahwa akan membutuhkan lebih banyak waktu untuk mengambil kolom lain dari tabel daripada hanya mencari namanya, atau sekali lagi, jika kemungkinan akan mengambil sebuah banyak baris.

Damien_The_Tidak percaya
sumber
9

Pengoptimal akan menilai apakah penggunaan indeks Anda akan membuat kueri Anda berjalan lebih cepat, dan jika ya, ia akan menggunakan indeks.

Tergantung pada RDBMS Anda, Anda dapat memaksa penggunaan indeks, meskipun tidak disarankan kecuali Anda tahu apa yang Anda lakukan.

Secara umum Anda harus mengindeks kolom yang Anda gunakan dalam tabel join dan pernyataan where

niktrs
sumber
5

Dengan menggunakan kolom tempat indeks diterapkan dalam kondisi Anda, itu akan disertakan secara otomatis. Anda tidak harus menggunakannya, tetapi ini akan mempercepat kueri saat digunakan.

SELECT * FROM TABLE WHERE attribute = 'value'

Akan menggunakan indeks yang sesuai.

ChrisBint
sumber
5

Umumnya, saat Anda membuat indeks di tabel, database akan secara otomatis menggunakan indeks tersebut saat mencari data di tabel tersebut. Anda tidak perlu melakukan apapun tentang itu.

Namun, di MSSQL, Anda dapat menentukan index hintyang dapat menentukan bahwa indeks tertentu harus digunakan untuk menjalankan kueri ini. Informasi lebih lanjut tentang ini dapat ditemukan di sini .

Index hintjuga tampaknya tersedia untuk MySQL . Terima kasih kepada Tudor Constantine.

MD Sayem Ahmed
sumber
1

Petunjuk indeks hanya tersedia untuk server database Microsoft Dynamics. Untuk SQL Server tradisional, filter yang Anda tentukan di klausa 'Di mana' harus membujuk mesin untuk menggunakan indeks yang relevan ... Asalkan rencana eksekusi mesin dapat secara efisien mengidentifikasi cara membaca informasi (apakah pemindaian tabel lengkap atau pemindaian terindeks) ) - harus membandingkan keduanya sebelum menjalankan pernyataan yang tepat, sebagai bagian dari pengoptimal kinerja bawaan.

Namun, Anda dapat memaksa pengoptimal untuk memindai dengan menggunakan sesuatu seperti

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Atau untuk mencari indeks tertentu dengan menggunakan sesuatu seperti

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Pilihan ada padamu. Lihat properti indeks tabel di panel objek untuk mengetahui indeks mana yang ingin Anda gunakan. Itu harus cocok dengan filter Anda.

Untuk hasil terbaik, buat daftar filter yang akan mengembalikan hasil paling sedikit terlebih dahulu. Saya tidak tahu apakah saya benar dalam mengatakannya, tetapi sepertinya filter kueri tersebut berurutan; jika Anda mendapatkan urutan yang benar, pengoptimal tidak harus melakukannya untuk Anda dengan membandingkan semua kombinasi, atau setidaknya tidak memulai perbandingan dengan kueri yang lebih mahal.

Cory
sumber