Saya mengalami situasi aneh di mana menambahkan OPTION (RECOMPILE)
permintaan saya menyebabkannya berjalan dalam setengah detik, sementara menghilangkannya menyebabkan permintaan mengambil lebih dari lima menit.
Ini adalah kasus ketika kueri dieksekusi dari Query Analyzer atau dari program C # saya via SqlCommand.ExecuteReader()
. Memanggil (atau tidak menelepon) DBCC FREEPROCCACHE
atau DBCC dropcleanbuffers
tidak ada bedanya; Hasil kueri selalu dikembalikan secara instan dengan OPTION (RECOMPILE)
dan lebih dari lima menit tanpanya. Kueri selalu dipanggil dengan parameter yang sama [demi pengujian ini].
Saya menggunakan SQL Server 2008.
Saya cukup nyaman dengan menulis SQL tetapi tidak pernah menggunakan OPTION
perintah dalam permintaan sebelumnya dan tidak terbiasa dengan seluruh konsep cache rencana sampai memindai posting di forum ini. Pemahaman saya dari posting adalah bahwa itu OPTION (RECOMPILE)
adalah operasi yang mahal. Tampaknya menciptakan strategi pencarian baru untuk kueri. Jadi mengapa kemudian, bahwa pertanyaan selanjutnya yang menghilangkan OPTION (RECOMPILE)
begitu lambat? Tidakkah seharusnya pertanyaan selanjutnya menggunakan strategi pencarian yang dihitung pada panggilan sebelumnya yang termasuk petunjuk kompilasi?
Apakah sangat tidak biasa memiliki permintaan yang memerlukan petunjuk kompilasi pada setiap panggilan tunggal?
Maaf untuk pertanyaan entry-level tapi saya tidak bisa benar-benar membuat kepala atau ekor dari ini.
UPDATE: Saya telah diminta untuk mengirim kueri ...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
Saat menjalankan tes dari Query Analyzer, saya menambahkan baris berikut:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Saat memanggilnya dari program C # saya, parameter dilewatkan melalui SqlCommand.Parameters
properti.
Untuk keperluan diskusi ini, Anda dapat mengasumsikan bahwa parameter tidak pernah berubah sehingga kami dapat mengesampingkan parameter yang berbau tidak optimal sebagai penyebabnya.
X = @X OR @X IS NULL
ke X=@X
dan melakukan pencarian Lihat di sini atau mendorong predikat lebih jauh terhadap tampilan dengan fungsi jendela
RECOMPILE
. Dalam setiap kejadian, tangkap rencana eksekusi dan lihat perbedaannya.