Mengapa panduan rencana saya tidak digunakan?


9

Kami baru-baru ini mengalami masalah titik kritis dan beberapa permintaan laporan kami yang digunakan untuk menyelesaikan eksekusi dalam beberapa detik sekarang membutuhkan waktu lebih dari 2 menit karena pengoptimal kueri mengabaikan indeks non-clustered pada kolom pencarian. Contoh kueri di bawah ini:

select top 100 *
from   [dbo].[t_Call]
where  ID > 0 
  and  throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id

The IDkolom berkerumun Indeks dan Throwtimememiliki indeks nonclustered. Dalam hal ini, kami perhatikan bahwa pemesanan dengan throwtimealih-alih IDmengubah rencana kueri dan indeks nonclustered digunakan. Kami juga berencana untuk mengarsipkan beberapa data lama (saat ini memiliki 20 juta baris !!). Tetapi membuat perubahan dalam aplikasi ini akan memakan waktu dan saya perlu menemukan cara untuk membuat laporan berjalan cukup cepat, tanpa membuat perubahan pada tingkat aplikasi (oh well, begitulah hidup!).

Masukkan panduan paket. Saya membuat panduan rencana di bawah ini dengan petunjuk kueri indeks yang tidak bercabang dan untuk beberapa alasan, indeks yang tidak bercabang masih tidak digunakan. Apakah saya melewatkan sesuatu?

EXEC sp_create_plan_guide 
@name = N'[prod2reports_callthrowtime]', 
@stmt = N'select top 100 *
          from   [dbo] . [t_Call]
          where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL', 
@module_or_batch = N'select top 100 *
                     from   [dbo] . [t_Call]
                     where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID', 
@params = N'@0 int, @1 datetime, @2 datetime', 
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
                   INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO

Bagaimana tampilan indeks yang tidak berkerumun? Alasan server mengabaikannya adalah karena tidak berpikir itu akan ada gunanya. Entah Anda memiliki rencana yang salah atau indeks yang salah
Allan S. Hansen

3
Sebagai tambahan, TOLONG TOLONG ubah throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'ke throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';- silakan lihat posting blog ini dan juga yang ini .
Aaron Bertrand

@ AaronBertrand Terima kasih banyak. Ya saya menyarankan perubahan itu juga dan mereka akan membuatnya dalam rilis berikutnya.
RK Kuppala

Jawaban:


11

Kueri harus cocok dengan PERSIS, termasuk spasi. Saya sarankan Anda mendapatkan kueri dari cache, dan membuatnya dari itu daripada memasukkannya dengan cara lain.


0

BACA ARTIKEL TERKAIT LAGI

Menulis panduan rencana untuk memaksa penggunaan indeks Anda hampir pasti bukan yang Anda inginkan, karena akan memaksa pencarian bookmark yang tidak efisien. Menurut artikel Anda, solusi yang tepat untuk kinerja paling efisien dari kueri ini adalah mengubah indeks Anda menjadi indeks non-clustered yang meliputi , dengan kata lain, tambahkan semua kolom dari tabel Anda ke indeks, atau (lebih disukai ) cukup tambahkan kolom yang Anda butuhkan untuk kueri ini, dan kemudian ubah pilih untuk hanya menarik kolom itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.