ฉันพยายามปรับปรุงประสิทธิภาพของข้อความค้นหาต่อไปนี้:
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
ขณะนี้ข้อมูลการทดสอบของฉันใช้เวลาประมาณหนึ่งนาที ฉันมีอินพุตจำนวน จำกัด ในการเปลี่ยนแปลงในโพรซีเดอร์ที่เก็บไว้ทั้งหมดที่มีการค้นหานี้ แต่ฉันสามารถให้พวกเขาแก้ไขเคียวรีนี้ได้ หรือเพิ่มดัชนี ฉันพยายามเพิ่มดัชนีต่อไปนี้:
CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed)
และจริง ๆ แล้วมันเป็นสองเท่าของจำนวนเวลาที่แบบสอบถามใช้ ฉันได้รับผลกระทบเดียวกันกับดัชนีที่ไม่ใช่กลุ่ม
ฉันพยายามเขียนใหม่ดังนี้โดยไม่มีผลกระทบ
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'.
ดังนั้นฉันมีสองคำถาม ก่อนอื่นคุณไม่สามารถทำการนับ COUNT DISTINCT ด้วย OVER clause หรือว่าฉันเพิ่งเขียนมันไม่ถูกต้อง? และทุกคนที่สองสามารถแนะนำการปรับปรุงที่ฉันยังไม่ได้ลองเลย FYI นี่เป็นอินสแตนซ์ของ SQL Server 2008 R2 Enterprise
แก้ไข: นี่คือลิงค์ไปยังแผนปฏิบัติการเดิม ฉันควรทราบด้วยว่าปัญหาใหญ่ของฉันคือแบบสอบถามนี้ถูกเรียกใช้ 30-50 ครั้ง
https://onedrive.live.com/redir?resid=4C359AF42063BD98%21772
แก้ไข 2: นี่คือวงเต็มที่คำสั่งอยู่ในตามที่ร้องขอในความคิดเห็น ฉันกำลังตรวจสอบกับคนที่ทำงานกับเรื่องนี้เป็นประจำเพื่อจุดประสงค์ของการวนซ้ำ
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