다음 쿼리의 성능을 향상 시키려고합니다.
UPDATE [#TempTable]
SET Received = r.Number
FROM [#TempTable]
INNER JOIN (SELECT AgentID,
RuleID,
COUNT(DISTINCT (GroupId)) Number
FROM [#TempTable]
WHERE Passed = 1
GROUP BY AgentID,
RuleID
) r ON r.RuleID = [#TempTable].RuleID AND
r.AgentID = [#TempTable].AgentID
현재 테스트 데이터는 약 1 분이 걸립니다. 이 쿼리가있는 모든 저장 프로 시저에 대한 변경 사항에 제한적인 입력이 있지만이 쿼리를 수정하도록 할 수 있습니다. 또는 색인을 추가하십시오. 다음 색인을 추가하려고했습니다.
CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed)
실제로 쿼리 시간이 두 배로 늘어났습니다. NON-CLUSTERED 인덱스와 동일한 효과를 얻습니다.
아무런 효과없이 다음과 같이 다시 작성해 보았습니다.
WITH r AS (SELECT AgentID,
RuleID,
COUNT(DISTINCT (GroupId)) Number
FROM [#TempTable]
WHERE Passed = 1
GROUP BY AgentID,
RuleID
)
UPDATE [#TempTable]
SET Received = r.Number
FROM [#TempTable]
INNER JOIN r
ON r.RuleID = [#TempTable].RuleID AND
r.AgentID = [#TempTable].AgentID
다음으로 이와 같은 창 기능을 사용하려고했습니다.
UPDATE [#TempTable]
SET Received = COUNT(DISTINCT (CASE WHEN Passed=1 THEN GroupId ELSE NULL END))
OVER (PARTITION BY AgentId, RuleId)
FROM [#TempTable]
이 시점에서 오류가 발생하기 시작했습니다.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'distinct'.
두 가지 질문이 있습니다. 먼저 OVER 절로 COUNT DISTINCT를 수행 할 수 없거나 잘못 쓴 것입니까? 두 번째로 아직 시도하지 않은 개선 사항을 제안 할 수 있습니까? 참고로 이것은 SQL Server 2008 R2 Enterprise 인스턴스입니다.
편집 : 다음은 원래 실행 계획에 대한 링크입니다. 또한 내 큰 문제는이 쿼리가 30-50 번 실행된다는 것입니다.
https://onedrive.live.com/redir?resid=4C359AF42063BD98%21772
EDIT2 : 주석에서 요청한대로 명령문이있는 전체 루프입니다. 나는 루프의 목적과 관련하여 정기적 으로이 작업을하는 사람과 확인하고 있습니다.
DECLARE @Counting INT
SELECT @Counting = 1
-- BEGIN: Cascading Rule check --
WHILE @Counting <= 30
BEGIN
UPDATE w1
SET Passed = 1
FROM [#TempTable] w1,
[#TempTable] w3
WHERE w3.AgentID = w1.AgentID AND
w3.RuleID = w1.CascadeRuleID AND
w3.RulePassed = 1 AND
w1.Passed = 0 AND
w1.NotFlag = 0
UPDATE w1
SET Passed = 1
FROM [#TempTable] w1,
[#TempTable] w3
WHERE w3.AgentID = w1.AgentID AND
w3.RuleID = w1.CascadeRuleID AND
w3.RulePassed = 0 AND
w1.Passed = 0 AND
w1.NotFlag = 1
UPDATE [#TempTable]
SET Received = r.Number
FROM [#TempTable]
INNER JOIN (SELECT AgentID,
RuleID,
COUNT(DISTINCT (GroupID)) Number
FROM [#TempTable]
WHERE Passed = 1
GROUP BY AgentID,
RuleID
) r ON r.RuleID = [#TempTable].RuleID AND
r.AgentID = [#TempTable].AgentID
UPDATE [#TempTable]
SET RulePassed = 1
WHERE TotalNeeded = Received
SELECT @Counting = @Counting + 1
END
count
는 컬럼이 널 입력 가능 과 같지 않습니다 . 널이 포함되어 있으면 1을 빼야합니다.