为什么对于非存储过程缓存了错误的SQL Server执行计划

时间:2018-01-25 13:44:39

标签: sql-server tsql

我在这个问题上看到的许多质量保证都涉及存储过程。我正在使用C#和ADO.NET来执行SQL Server select查询(而不是存储过程)。

查询使用了很多IO并且速度很慢,因此我创建了一个新索引。现在,如果我使用OPTION(RECOMPILE)运行相同的查询,我会得到一个具有少量IO的快速响应。

但是,如果我在OPTION(RECOMPILE)语句中不包含select,我将继续获得缓慢,高IO的结果。我试图使用DBCC FREEPROCCACHE清除执行计划缓存无济于事。我还跑了UPDATE STATISTICS

每次运行查询时,似乎都会重新创建糟糕的计划。我应该只更改代码以包含OPTION(RECOMPILE),还是还有其他内容?

这是查询。我正在从SSMS中运行它。

SET STATISTICS IO ON;

DECLARE @request_date datetime

SELECT @request_date='1/24/2017'
SELECT TOP 300 
pr.[mr_entry_id], 
mr.[source_code] AS accession_no, 
mr.[patient_id], 
pr.[rx_location], 
CASE WHEN pr.[product_id] IS NULL THEN 'Compound' ELSE 'Product' END AS product_type, 
mr.[description], 
SUBSTRING(r.[fname],1,1) + ' ' + r.[lname] AS requested_by, 
rs.[short_name] AS status, mr.[category], 
CASE WHEN mr.[date_recorded] >= '12/16/2009' THEN pr.[date_requested] ELSE NULL END AS date_recorded, 
CASE WHEN mr.[date_recorded] >= '12/16/2009' THEN v.[lname] + ', ' + v.[fname] ELSE '' END AS requester, 
mr.[request_finalized_date], 
SUBSTRING(u.[fname],1,1) + ' ' + u.[lname] AS clinician, 
pr.[is_onfile], 
pr.[is_outside_prescription] 
FROM [rx_request] pr 
INNER JOIN [mr_entry] mr ON pr.[mr_entry_id] = mr.[id] 
INNER JOIN [request_status] rs ON (rs.rc_id = 25000 and pr.[status_id] = rs.[status_id]) 
LEFT OUTER JOIN [vmis_user] v ON pr.[requester] = v.[id] 
LEFT OUTER JOIN [client] rc ON mr.[request_rc_id] = rc.[id] 
LEFT OUTER JOIN [vmis_user] u ON mr.[request_clinician_id] = u.[id] 
LEFT OUTER JOIN [vmis_user] r ON mr.[request_finalized_id] = r.[id] 
WHERE mr.[class] = 'Medication' 
AND mr.[is_request] = 1 
AND mr.[finalized_date] BETWEEN @request_date AND DATEADD(d,1,@request_date) 
AND rs.[rc_id] = 25000 
AND mr.[is_finalized] = 1 
OPTION(RECOMPILE)

0 个答案:

没有答案