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 ID
kolom berkerumun Indeks dan Throwtime
memiliki indeks nonclustered. Dalam hal ini, kami perhatikan bahwa pemesanan dengan throwtime
alih-alih ID
mengubah 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
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 .