Tôi đang cố gắng cải thiện hiệu suất của truy vấn sau:
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
Hiện tại với dữ liệu thử nghiệm của tôi mất khoảng một phút. Tôi có một số lượng đầu vào hạn chế vào các thay đổi trên tất cả các thủ tục được lưu trữ trong đó truy vấn này nằm trong đó nhưng tôi có thể có thể khiến chúng sửa đổi một truy vấn này. Hoặc thêm một chỉ mục. Tôi đã thử thêm chỉ số sau:
CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed)
Và nó thực sự tăng gấp đôi thời gian truy vấn. Tôi nhận được hiệu ứng tương tự với chỉ số NON-CLUSTERED.
Tôi đã thử viết lại nó như sau mà không có hiệu quả.
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
Tiếp theo tôi đã thử sử dụng một chức năng cửa sổ như thế này.
UPDATE [#TempTable]
SET Received = COUNT(DISTINCT (CASE WHEN Passed=1 THEN GroupId ELSE NULL END))
OVER (PARTITION BY AgentId, RuleId)
FROM [#TempTable]
Lúc này tôi bắt đầu nhận lỗi
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'distinct'.
Vì vậy, tôi có hai câu hỏi. Trước tiên, bạn không thể thực hiện một DISTINCT với mệnh đề QUÁ hay tôi chỉ viết sai? Và thứ hai có ai có thể đề xuất một cải tiến mà tôi chưa thử không? FYI đây là một phiên bản SQL Server 2008 R2 Enterprise.
EDIT: Đây là một liên kết đến kế hoạch thực hiện ban đầu. Tôi cũng cần lưu ý rằng vấn đề lớn của tôi là truy vấn này đang được chạy 30-50 lần.
https://iatedrive.live.com/redir?resid=4C359AF42063BD98%21772
EDIT2: Đây là vòng lặp đầy đủ mà câu lệnh được yêu cầu trong các bình luận. Tôi đang kiểm tra với người làm việc với điều này một cách thường xuyên về mục đích của vòng lặp.
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
nếu cột là nullable. Nếu nó chứa bất kỳ giá trị nào bạn cần trừ 1.