我在这个问题上看到的许多质量保证都涉及存储过程。我正在使用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)