আমি নিম্নলিখিত কোয়েরিটির কার্যকারিতা উন্নত করার চেষ্টা করছি:
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 টি ডিসটিন্ট করতে পারবেন না বা আমি কেবল এটি ভুল লিখেছি? এবং দ্বিতীয়ত কেউ কি এমন উন্নতির পরামর্শ দিতে পারে যা আমি ইতিমধ্যে চেষ্টা করেছিলাম না? FYI এটি একটি এসকিউএল সার্ভার 2008 আর 2 এন্টারপ্রাইজ দৃষ্টান্ত।
সম্পাদনা: এখানে আসল বাস্তবায়ন পরিকল্পনার লিঙ্ক is আমার আরও উল্লেখ করা উচিত যে আমার বড় সমস্যাটি এই কোয়েরিটি 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
কলামটি nlalable হয়। এটিতে যদি কোনও নাল থাকে তবে আপনার 1 টি বিয়োগ করা উচিত