मैं निम्नलिखित क्वेरी के प्रदर्शन को बेहतर बनाने की कोशिश कर रहा हूं:
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'.
इसलिए मेरे दो सवाल हैं। पहले क्या आप OVER क्लॉज के साथ COUNT DISTINCT नहीं कर सकते या क्या मैंने इसे गलत तरीके से लिखा था? और दूसरा क्या कोई सुधार का सुझाव दे सकता है जो मैंने पहले ही नहीं आजमाया है? FYI करें यह SQL Server 2008 R2 एंटरप्राइज़ उदाहरण है।
EDIT: यहाँ मूल निष्पादन योजना की एक कड़ी है। मुझे यह भी ध्यान रखना चाहिए कि मेरी बड़ी समस्या यह है कि यह क्वेरी 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. घटाना होगा