Rencana pelaksanaan menunjukkan indeks yang hilang tetapi permintaan cepat

8

Saat melihat rencana eksekusi yang sebenarnya, itu menunjukkan indeks yang hilang meskipun kueri membutuhkan waktu kurang dari 1 detik.

SELECT
    Account.AccountID,
    Account.Name
FROM
    account      
    LEFT OUTER JOIN accountfeaturesetting afs 
ON afs.accountid = account.accountid   
and afs.featureid = 'Schedules'
 and  
afs.settingid = 'EditReasons'           
WHERE
    ISNULL(afs.Value, '0') = '0'  
    AND EXISTS 
(SELECT 1 FROM program WHERE program.AccountID = account.AccountID
 AND program.Active = 1 
AND (program.ScheduleEditReasonFlags <> 0 
OR program.ScheduleEditReasonFields <> 0))
    AND account.IsMaster = 0
    AND account.BeginDate IS NOT NULL

Rencana eksekusi menunjukkan:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Account] ([IsMaster],[BeginDate])
INCLUDE ([AccountID],[Name])

Apakah kita perlu membuat indeks meskipun permintaan hanya membutuhkan waktu 1 detik? Atas dasar apa suatu indeks harus dibuat?

Saya akan menjalankan kueri ini sebagai pekerjaan harian.

somu
sumber
1
Apakah satu detik cukup cepat?
Erik Darling
Dibutuhkan waktu kurang dari 1 detik
sekitar
4
Oke ... apakah itu cukup cepat?
Erik Darling
Saya pikir sangat cepat karena tabel akun memiliki 900 rows. Dan pengaturan akun memiliki 21385 rows
somu
1
Saya akan mengatakan menambahkan lebih banyak baris seperti 100x lebih dari yang Anda miliki dalam tes db dan Posting Rencana Eksekusi yang sebenarnya. kemudian Posting lagi setelah Anda menambahkan indeks ini dan Anda akan melihat dan mengetahui mengapa orang lain akan merekomendasikan atau tidak untuk menerapkan indeks ini.
Magier

Jawaban:

15

Anda tidak perlu menambahkan indeks sekarang. Semua pesan "indeks hilang" artinya ini mungkin bermanfaat. Mungkin tidak jujur, atau mungkin ada indeks yang lebih membantu.

Seperti kapan Anda perlu menambahkan indeks baru? Baiklah katakanlah Anda memiliki 100 baris di tabel akun tetapi belum benar-benar digunakan. Dalam beberapa bulan Anda mencapai 10.000 baris dan permintaan sekarang mengambil setengah jam atau lebih. Pada titik itu Anda dapat mempertimbangkan untuk menambahkan indeks. Dan ketika saya katakan pertimbangkan, maksud saya mengujinya di lingkungan pengujian dan melihat apakah itu benar-benar meningkatkan keadaan.

Pertimbangan lain termasuk:

  • Berapa banyak indeks yang sudah saya miliki di tabel ini? Jika Anda memiliki 10+ indeks maka saya akan lebih peduli daripada jika Anda mengatakan 2.
  • Seberapa penting permintaan ini? Anda mengatakan Anda menjalankannya setiap malam. Pada 1 detik itu tidak masalah (dengan asumsi Anda hanya menjalankannya sekali). Jika di sisi lain itu bagian dari proses dan dijalankan 1000 kali setiap malam maka itu mungkin lebih merupakan masalah. Jika sampai pada titik di mana butuh waktu cukup lama untuk menyebabkan Anda mengalami masalah (menyebabkan masalah dengan proses lain, atau mengalami saat-saat ketika pengguna berada dalam sistem dll) maka Anda perlu melihat kinerja dan menambahkan indeks.
Kenneth Fisher
sumber
Anda juga perlu bertanya berapa banyak akun yang Anda harapkan. Jika Anda menerima pesanan untuk pesawat jet, Anda mungkin tidak memiliki basis pelanggan sebesar itu, tetapi jika itu adalah situs media sosial, tujuan utama Anda adalah untuk mendapatkan jumlah itu dalam jutaan secepat mungkin. Satu hal lagi - dalam beberapa kasus saya akan cenderung membuat indeks sekarang sehingga saya tidak perlu mencari apa yang membuat aplikasi lambat setahun kemudian ketika jumlah akun lepas landas karena suatu alasan.
msouth