【发布时间】:2015-04-18 16:37:39
【问题描述】:
我需要一些 dDatabase 开发方面的帮助。
我的主表中有 200 万条记录。我的存储过程在视图上运行,视图检索大约 100 万条记录。我的存储过程获得 309 条记录。
我们仅在 2 天前获得了这些数据,我的存储过程需要 25 秒 - 1 分钟来检索记录,直到昨晚,突然之间似乎需要大约 25 分钟才能获得结果,从那时起。
服务器上的 RAM 已增加,以查看这是否会提高性能,但这没有影响。以下是我的基本查询。有人可以调查一下,让我知道如何提高性能。
DECLARE @ReportStartDate DATETIME,
@ReportEndDate DATETIME,
@IsInternalUser INT,
@UserId INT,
@FFY INT
SET @UserId = 2
SET @FFY = -1
SET @Quarter = -1
/* Checks if the user is a Internal user or external user */
SELECT @IsInternalUser = rpt.ufn_IsInternalUser(@UserId)
/*Get reporting dates */
SELECT
@ReportStartDate = (CASE WHEN MIN(FromDate) >= GETDATE()
THEN GETDATE()
ELSE MIN(FromDate) END),
@ReportEndDate = (CASE WHEN MAX(ToDate) >= GETDATE()
THEN GETDATE()
ELSE MAX(ToDate) END)
FROM
rpt.FFYDate
WHERE
FFY = (CASE WHEN @FFY = -1 THEN FFY ELSE @FFY END)
AND QuarterNumber = (CASE WHEN @Quarter = -1 THEN QuarterNumber ELSE @Quarter END)
/*Final Query*/
SELECT
LC.AwardIdentifier, LC.ProgramName, LC.AwardStartDate,
LC.AwardEndDate,
COUNT(DISTINCT LC.ClientID), LC.RecipientName, LC.ServiceTarget,
(CASE
WHEN (@ReportStartDate >= LC.AwardStartDate AND @ReportEndDate <= LC.AwardEndDate) THEN ((DATEDIFF(MONTH, @ReportStartDate, @ReportEndDate)) * LC.ServiceTarget / (DATEDIFF(Month, LC.AwardStartDate, LC.AwardEndDate))) --WITHIN AWARD DATES
WHEN (@ReportStartDate <= LC.AwardStartDate AND @ReportEndDate <= LC.AwardEndDate) THEN ((DATEDIFF(MONTH, LC.AwardStartDate, @ReportEndDate)) * LC.ServiceTarget / (DATEDIFF(Month, LC.AwardStartDate, LC.AwardEndDate))) --OVERLAP WITH AWARD DATES
ELSE 0
END) AS ClientTarget
FROM
rpt.VwCSATIntakeCoverageReport_Legacy LC
LEFT JOIN
UserRoleEntity URE ON URE.EntityId = (CASE WHEN ure.EntityTypeCode = 'AWARD' THEN LC.AwardID WHEN ure.EntityTypeCode ='SITEAWARD' THEN LC.SiteAwardId END)
LEFT JOIN
CDPUserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId
WHERE
(LC.InterviewDate BETWEEN @ReportStartDate AND @ReportEndDate)
AND (@IsInternalUser = 1 -- Interanl User
OR (UR.CDPUserId = @UserId AND UR.ID IS NOT NULL)) -- External User
GROUP BY
LC.AwardIdentifier, LC.ProgramName, LC.AwardStartDate,
LC.AwardEndDate, LC.RecipientName, LC.ServiceTarget
我的技术主管对此进行了调查,并说问题可能出在 COUNT(DISTINCT LC.ClientID) 和由此产生的 group by 上,并要求我对此发表评论(并在顶部选择中添加“不同”。我尝试添加 @987654323 @ 声明在我的最终选择查询之上,并尝试在顶部执行COUNT(DISTINCT LC.ClientID),但性能没有改变。
这需要在本周投入生产,任何帮助将不胜感激!谢谢!
【问题讨论】:
-
执行计划的瓶颈是什么?
-
我可能会研究参数嗅探。缓存的查询计划对于您现在正在运行的内容可能很糟糕。表上有哪些索引(如果有)?
标签: sql sql-server performance stored-procedures