【发布时间】:2017-04-16 15:28:55
【问题描述】:
我有一个带有 5 个参数 @State,@StartDate,@EndDate,@AsOfDate,@SICCode 的 SP。如果我执行 SP 并提供参数,它会在 1 秒内返回数据。
然后,如果我添加另一个参数@Coverage,那么执行它需要大约 17 秒。
我查看了带有和不带有@Coverage 参数的缓存计划,看起来它看起来一样。
我使用了调优顾问并创建了所有可能的索引。
如果我运行与 SELECT 语句相同的代码并提供与 WHERE 子句中的参数相同的值 - 那么我得到了大约 1 秒的结果。
那么为什么只有当我添加这个确切的一个参数@Coverage 时才会如此显着地降低性能呢?
如果它是一个参数嗅探,那么我如何确定它是?有什么方法可以检查吗?
ALTER PROCEDURE [dbo].[EarningPlazaCommercial]
@State varchar(50),
@StartDate datetime,
@EndDate datetime,
@AsOfDate datetime,
@SICCode nvarchar(max),
@Coverage varchar(100)
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #PolicyNumbers (PolicyNumber varchar(50))
INSERT INTO #PolicyNumbers SELECT PolicyNumber FROM PlazaInsuranceWPDataSet WHERE SICCode IN (SELECT * FROM [dbo].[StringOfStringsToTable](@SICCode,','))-- ('0161','0173','0179','0181','0191','0722','0752','0761','0782','1440','1441','1442','1521','1522','161','1611','1629','1711','172','1731','1742')
CREATE CLUSTERED INDEX IDX_C_PolicyNumbers_PolicyNumber ON #PolicyNumbers(PolicyNumber)
; WITH Earned_to_date AS (
SELECT Cast(@AsOfDate AS DATE) AS Earned_to_date
), policy_data AS (
SELECT
PolicyNumber,
Coverage
, Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate
, Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate
, WrittenPremium
--, --State
FROM PlazaInsuranceWPDataSet piwp
WHERE EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = piwp.PolicyNumber)
AND Coverage IN (SELECT * FROM [dbo].[StringOfStringsToTable](@Coverage,','))
AND State IN (SELECT * FROM [dbo].[StringOfStringsToTable](@State,','))
)...
这是我正在处理的数据:
【问题讨论】:
-
coverage 列有索引吗?
-
this 有帮助吗?
-
看起来您在
Where子句中进行了 2 个函数拆分。将字符串拆分为存储过程顶部的临时表,然后改为引用临时表。 -
M.Ali 是的,我在 Coverage 列上有索引。谢谢
-
你的 StringOfStringsToTable 函数是什么样的?我有一种感觉,这将成为你表现不佳的罪魁祸首。
标签: sql-server tsql stored-procedures parameter-passing