2013-08-28 24 views
6

Tôi đang gặp sự cố với MS SQL Server 2008 là:Truy vấn SQL Server mất nhiều thời gian hơn với tham số hơn với chuỗi không đổi

Khi tôi thực hiện truy vấn bằng chuỗi được mã hóa cứng làm tham số, truy vấn của tôi chạy nhanh nhưng khi tôi sử dụng tham số chuỗi thay vào đó, truy vấn mất nhiều thời gian hơn!
Truy vấn chuỗi không đổi mất 1 giây trong khi truy vấn còn lại mất 11 giây.

Dưới đây là các mã rống lên:

liên tục chuỗi (1 giây):

 SELECT * 
FROM VIEWCONTENTS 
WHERE COUNTRY = 'ZA' 
     AND CONTENTTYPE = 'A' 
     AND TASK = 'R23562'; 

tham số (11 giây):

DECLARE @country AS CHAR(2); 

SET @country = 'ZA'; 

SELECT * 
FROM VIEWCONTENTS 
WHERE COUNTRY = @country 
     AND CONTENTTYPE = 'A' 
     AND TASK = 'R23562' 
+3

Google "tham số sniffing" .... – granadaCoder

+2

Bạn đã so sánh kế hoạch thực hiện chưa? Đồng thời đọc: http://www.sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options –

+0

Là trình tối ưu hóa không biết giá trị của địa phương biến trong truy vấn thứ hai, nhiều khả năng là thay đổi kế hoạch truy vấn để sử dụng quét bảng/chỉ mục thay vì tìm kiếm. – steoleary

Trả lời

0

gì năng suất này?

DECLARE @country AS VARCHAR(2); 
SET @country = 'ZA'; 

SELECT * 
FROM VIEWCONTENTS 
WHERE COUNTRY = @country 
     AND CONTENTTYPE = 'A' 
     AND TASK = 'R23562' 

Làm thế nào về điều này?

DECLARE @country AS CHAR(2); 
DECLARE @country1 AS VARCHAR(2); 
SET @country = 'ZA'; 
SET @country1 = @country; 

SELECT * 
FROM VIEWCONTENTS 
WHERE COUNTRY = @country 
     AND CONTENTTYPE = 'A' 
     AND TASK = 'R23562' 
2

Sử dụng OPTION (biên dịch lại) vào cuối truy vấn của bạn. Vì vậy:

DECLARE @country AS CHAR(2); 

SET @country = 'ZA'; 

SELECT * 
FROM VIEWCONTENTS 
WHERE COUNTRY = @country 
     AND CONTENTTYPE = 'A' 
     AND TASK = 'R23562' 
OPTION (RECOMPILE) 
Các vấn đề liên quan