नीचे पंक्ति : WHERE
खंड में मानदंड जोड़ना और क्वेरी को चार अलग-अलग प्रश्नों में विभाजित करना, प्रत्येक क्षेत्र के लिए एक SQL सर्वर ने एक समानांतर योजना प्रदान करने की अनुमति दी और क्वेरी को अतिरिक्त रूप से WHERE
उपबंध किए बिना 4X को तेजी से चलाया । परीक्षण के बिना प्रश्नों को चार में विभाजित करने से ऐसा नहीं हुआ। प्रश्नों को विभाजित किए बिना न तो परीक्षण को जोड़ा। परीक्षण के अनुकूलन से कुल रन समय 3 मिनट (मूल 3 घंटे से) कम हो गया।
मेरे मूल यूडीएफ को 1,174,731 पंक्तियों को संसाधित करने में 3 घंटे 16 मिनट का समय लगा, जिसमें 1.216 जीबी नावरच डेटा का परीक्षण किया गया। मार्टिन स्मिथ द्वारा अपने जवाब में प्रदान की गई CLR का उपयोग करते हुए, निष्पादन योजना अभी भी समानांतर नहीं थी और कार्य में 3 घंटे और 5 मिनट का समय लगा।
पढ़ा है कि WHERE
मानदंड एक UPDATE
समानांतर करने में मदद कर सकता है , मैंने निम्नलिखित किया। मैंने CLR मॉड्यूल में एक फ़ंक्शन जोड़ा, यह देखने के लिए कि क्या फ़ील्ड का regex से मेल है:
[SqlFunction(IsDeterministic = true,
IsPrecise = true,
DataAccess = DataAccessKind.None,
SystemDataAccess = SystemDataAccessKind.None)]
public static SqlBoolean CanReplaceMultiWord(SqlString inputString, SqlXml replacementSpec)
{
string s = replacementSpec.Value;
ReplaceSpecification rs;
if (!cachedSpecs.TryGetValue(s, out rs))
{
var doc = new XmlDocument();
doc.LoadXml(s);
rs = new ReplaceSpecification(doc);
cachedSpecs[s] = rs;
}
return rs.IsMatch(inputString.ToString());
}
और, में internal class ReplaceSpecification
, मैंने रेगेक्स के खिलाफ परीक्षण को निष्पादित करने के लिए कोड जोड़ा
internal bool IsMatch(string inputString)
{
if (Regex == null)
return false;
return Regex.IsMatch(inputString);
}
यदि सभी फ़ील्ड एक ही कथन में परीक्षण किए जाते हैं, तो SQL सर्वर कार्य को समानांतर नहीं करता है
UPDATE dbo.DeidentifiedTest
SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml, @X),
DE461 = dbo.ReplaceMultiWord(DE461, @X),
DE87 = dbo.ReplaceMultiWord(DE87, @X),
DE15 = dbo.ReplaceMultiWord(DE15, @X)
WHERE InProcess = 1
AND (dbo.CanReplaceMultiWord(IndexedXml, @X) = 1
OR DE15 = dbo.ReplaceMultiWord(DE15, @X)
OR dbo.CanReplaceMultiWord(DE87, @X) = 1
OR dbo.CanReplaceMultiWord(DE15, @X) = 1);
4 1/2 घंटे और अभी भी चल रहा है। निष्पादन योजना:
हालाँकि, यदि फ़ील्ड्स को अलग-अलग स्टेटमेंट में अलग किया जाता है, तो एक समानांतर कार्य योजना का उपयोग किया जाता है, और मेरे सीपीयू का उपयोग धारावाहिक योजनाओं के साथ 12% से समानांतर योजनाओं (8 कोर) के साथ 100% हो जाता है।
UPDATE dbo.DeidentifiedTest
SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml, @X)
WHERE InProcess = 1
AND dbo.CanReplaceMultiWord(IndexedXml, @X) = 1;
UPDATE dbo.DeidentifiedTest
SET DE461 = dbo.ReplaceMultiWord(DE461, @X)
WHERE InProcess = 1
AND dbo.CanReplaceMultiWord(DE461, @X) = 1;
UPDATE dbo.DeidentifiedTest
SET DE87 = dbo.ReplaceMultiWord(DE87, @X)
WHERE InProcess = 1
AND dbo.CanReplaceMultiWord(DE87, @X) = 1;
UPDATE dbo.DeidentifiedTest
SET DE15 = dbo.ReplaceMultiWord(DE15, @X)
WHERE InProcess = 1
AND dbo.CanReplaceMultiWord(DE15, @X) = 1;
46 मिनट निष्पादित करने का समय। रो के आंकड़ों से पता चला कि लगभग 0.5% रिकॉर्ड्स में कम से कम एक रेगेक्स मैच था। निष्पादन योजना:
अब, समय पर मुख्य ड्रैग WHERE
क्लॉज था । मैंने तब CLR के रूप में लागू अहो-कोरासिक एल्गोरिथ्म केWHERE
साथ क्लॉज में रेगेक्स टेस्ट को बदल दिया । इससे कुल समय 3 मिनट 6 सेकंड कम हो गया।
इसके लिए निम्न परिवर्तनों की आवश्यकता थी। अहो-कोरासिक एल्गोरिथ्म के लिए विधानसभा और कार्यों को लोड करें। WHERE
क्लॉज को बदलें
WHERE InProcess = 1 AND dbo.ContainsWordsByObject(ISNULL(FieldBeingTestedGoesHere,'x'), @ac) = 1;
और पहले से पहले निम्नलिखित जोड़ें UPDATE
DECLARE @ac NVARCHAR(32);
SET @ac = dbo.CreateAhoCorasick(
(SELECT NAMES FROM dbo.NamesMultiWord FOR XML RAW, root('root')),
'en-us:i'
);
SELECT @var = REPLACE ... ORDER BY
निर्माण कार्य की गारंटी नहीं है, जैसा कि आप उम्मीद करते हैं। उदाहरण कनेक्ट आइटम (Microsoft से प्रतिक्रिया देखें)। इसलिए, SQLCLR पर स्विच करने से सही परिणाम की गारंटी का अतिरिक्त फायदा होता है, जो हमेशा अच्छा होता है।