Saya memiliki kueri SQL yang ingin saya optimalkan:
DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962'
SELECT
Id,
MIN(SomeTimestamp),
MAX(SomeInt)
FROM dbo.MyTable
WHERE Id = @Id
AND SomeBit = 1
GROUP BY Id
MyTable
memiliki dua indeks:
CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes
ON dbo.MyTable (SomeTimestamp ASC)
INCLUDE(Id, SomeInt)
CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes
ON dbo.MyTable (Id, SomeBit)
INCLUDE (TotallyUnrelatedTimestamp)
Ketika saya menjalankan kueri persis seperti yang ditulis di atas, SQL Server memindai indeks pertama, menghasilkan 189.703 bacaan logis dan durasi 2-3 detik.
Ketika saya sebaris @Id
variabel dan menjalankan query lagi, SQL Server mencari indeks kedua, menghasilkan hanya 104 pembacaan logis dan durasi 0,001 detik (pada dasarnya instan).
Saya memerlukan variabel, tetapi saya ingin SQL menggunakan rencana yang baik. Sebagai solusi sementara saya memberikan petunjuk indeks pada permintaan, dan permintaan pada dasarnya instan. Namun, saya mencoba untuk menjauh dari petunjuk indeks bila memungkinkan. Saya biasanya berasumsi bahwa jika optimizer kueri tidak dapat melakukan tugasnya, maka ada sesuatu yang dapat saya lakukan (atau berhenti lakukan) untuk membantunya tanpa secara eksplisit mengatakan apa yang harus dilakukan.
Jadi, mengapa SQL Server datang dengan rencana yang lebih baik ketika saya sebaris variabel?
sumber