Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Permintaan yang sama - rencana eksekusi yang berbeda

Kueri 2 menggunakan variabel.

Pada saat batch dikompilasi, SQL Server tidak mengetahui nilai variabel sehingga kembali ke heuristik yang sangat mirip dengan OPTIMIZE FOR (UNKNOWN)

Untuk > itu akan mengasumsikan bahwa 30% dari baris akan cocok (atau 3000 baris dalam data contoh Anda). Hal ini dapat dilihat pada gambar rencana pelaksanaan seperti di bawah ini. Ini secara signifikan melebihi dan di atas 12 baris (0,12%) yang merupakan titik kritis untuk kueri ini apakah menggunakan pemindaian indeks berkerumun atau pencarian indeks dan pencarian kunci yang tidak berkerumun.

Anda harus menggunakan OPTION (RECOMPILE) untuk membuatnya memperhitungkan nilai variabel aktual seperti yang ditunjukkan pada rencana ketiga di bawah ini.

Skrip

CREATE TABLE #Sale
(
    SaleId INT IDENTITY(1, 1)
        CONSTRAINT PK_Sale PRIMARY KEY,
    Test1 VARCHAR(10) NULL,
    RowVersion rowversion NOT NULL
        CONSTRAINT UQ_Sale_RowVersion UNIQUE
)

/*A better way of populating the table!*/
INSERT INTO #Sale (Test1)
SELECT TOP 10000 NULL 
FROM master..spt_values v1, master..spt_values v2

GO

SELECT *
FROM #Sale
WHERE RowVersion > 0x000000000001C310-- Query #1


DECLARE @LastVersion rowversion = 0x000000000001C310

SELECT *
FROM #Sale
WHERE RowVersion > @LastVersion-- Query #2


SELECT *
FROM #Sale
WHERE RowVersion > @LastVersion
OPTION (RECOMPILE)-- Query #3

DROP TABLE #Sale


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mencadangkan Database SQL Server menggunakan T-SQL

  2. Nama kolom atau jumlah nilai yang diberikan tidak sesuai dengan definisi tabel

  3. Apa itu Data &Informasi dan Volume Data

  4. Ganti nama Batasan CHECK di SQL Server menggunakan T-SQL

  5. Pengelompokan SQL berdasarkan bulan dan tahun