Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cùng một truy vấn - các kế hoạch thực thi khác nhau

Truy vấn 2 sử dụng một biến.

Tại thời điểm lô được biên dịch, SQL Server không biết giá trị của biến vì vậy chỉ rơi trở lại heuristics rất giống với OPTIMIZE FOR (UNKNOWN)

Đối với > nó sẽ giả định rằng 30% số hàng sẽ kết thúc khớp (hoặc 3000 hàng trong dữ liệu mẫu của bạn). Điều này có thể được nhìn thấy trong hình ảnh kế hoạch thực hiện như dưới đây. Con số này cao hơn đáng kể so với 12 hàng (0,12%) là điểm tới hạn cho truy vấn này trong việc nó sử dụng quét chỉ mục theo nhóm hay tìm kiếm chỉ mục không phân cụm và tìm kiếm khóa.

Bạn sẽ cần sử dụng OPTION (RECOMPILE) để làm cho nó tính đến giá trị biến thực tế như được hiển thị trong kế hoạch thứ ba bên dưới.

Tập lệnh

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. Kỹ thuật đảo ngược để lập sơ đồ cơ sở dữ liệu trong Visio với SQL Server 2008

  2. Phải khai báo biến vô hướng @Id?

  3. Vui lòng giúp cải thiện số liệu thống kê của SQL Server!

  4. Dấu ngoặc nhọn trong T-SQL

  5. Bảng ẩn trong cơ sở dữ liệu SQL Server?