নীচের লাইন : ধারাটিতে মানদণ্ড যুক্ত করা WHERE
এবং ক্যোয়ারিকে চারটি পৃথক ক্যোয়ারিতে বিভক্ত করা, প্রতিটি ক্ষেত্রের জন্য একটি এসকিউএল সার্ভারকে একটি সমান্তরাল পরিকল্পনা সরবরাহ করার অনুমতি দিয়েছিল এবং ক্লোজে অতিরিক্ত পরীক্ষা ছাড়াই কোয়েরিটি 4X তত দ্রুত চালানো হয়েছিল WHERE
। পরীক্ষাগুলি ব্যতীত ক্যোয়ারিকে চার ভাগে বিভক্ত করা তা করেনি। উভয়ই প্রশ্নগুলি বিভক্ত না করে পরীক্ষা যোগ করেনি। পরীক্ষাটি অনুকূল করা মোট রান সময়কে 3 মিনিটে (মূল 3 ঘন্টা থেকে) হ্রাস করেছে।
আমার মূল ইউডিএফটি ১,১,73, r৩১ টি সারি প্রসেস করতে 3 ঘন্টা 16 মিনিট সময় নিয়েছিল, যার মধ্যে 1.216 গিগাবাইট এনভারচার ডেটা পরীক্ষা করা হয়েছিল। মার্টিন স্মিথ তার উত্তরে প্রদত্ত সিএলআর ব্যবহার করে কার্যকর করার পরিকল্পনাটি এখনও সমান্তরাল হয়নি এবং এই কার্যটিতে 3 ঘন্টা 5 মিনিট সময় লেগেছিল।
এই WHERE
মানদণ্ডটি UPDATE
সমান্তরাল দিকে এগিয়ে যেতে সহায়তা করতে পারে তা পড়ে, আমি নিম্নলিখিতগুলি করেছি। ফিল্ডটির রেজেসের সাথে কোনও মিল আছে কিনা তা দেখতে আমি সিএলআর মডিউলে একটি ফাংশন যুক্ত করেছি:
[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);
}
যদি সমস্ত ক্ষেত্র একক বিবৃতিতে পরীক্ষা করা হয়, এসকিউএল সার্ভার কাজের সমান্তরাল করে না
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/2 ঘন্টা ধরে কার্যকর করার সময় এবং এখনও চলছে। হত্যা পরিকল্পনা:
যাইহোক, ক্ষেত্রগুলি পৃথক বিবৃতিতে পৃথক হলে একটি সমান্তরাল কাজের পরিকল্পনা ব্যবহৃত হয়, এবং আমার সিপিইউ ব্যবহার সমান্তরাল পরিকল্পনার সাথে সিরিয়াল পরিকল্পনার 12% থেকে 100% হয় সমান্তরাল পরিকল্পনা (8 কোর) এর সাথে।
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
ধারা। আমি তারপর Regex পরীক্ষা প্রতিস্থাপিত WHERE
সঙ্গে দফা Aho-Corasick অ্যালগরিদম একটি CLR হিসাবে প্রয়োগ করা। এটি মোট সময়টি 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
নির্মাণ কাজ নিশ্চিত করা হয় না হিসাবে আপনি আশা। উদাহরণ আইটেম সংযুক্ত করুন (মাইক্রোসফ্ট থেকে প্রতিক্রিয়া দেখুন)। সুতরাং, এসকিউএলসিএলআর স্যুইচ করাতে সঠিক ফলাফলের গ্যারান্টি যুক্ত করার অতিরিক্ত সুবিধা রয়েছে যা সর্বদা দুর্দান্ত।