আমি একটি সংরক্ষণাগার ডাটাবেস বজায় রেখেছি যা বিভক্ত ভিউগুলিতে historicalতিহাসিক ডেটা সঞ্চয় করে। পার্টিশন কলামটি একটি তারিখের সময়। ভিউয়ের নীচে প্রতিটি টেবিল এক মাসের ডেটা সঞ্চয় করে।
আমরা ডেটটাইম কলামে প্রতিটি টেবিলে চেক সীমাবদ্ধতার সাথে ইভেন্টগুলিকে সীমাবদ্ধ করি। এটি অপ্টিমাইজারটিকে ইভেন্টের ডেটটাইম কলামে ফিল্টারকারী ক্যোয়ারীগুলির জন্য সন্ধান করা সারণী সীমাবদ্ধ করার অনুমতি দেয়।
চেক সীমাবদ্ধতার নামগুলি এসকিউএল সার্ভার দ্বারা উত্পাদিত হয়েছিল, তাই তাদের নামটি দেখে তারা কী করে তা জানা শক্ত।
আমি চাই সীমাবদ্ধতার নামগুলিতে 'CK_TableName_Partition' ফর্মটি থাকা উচিত।
আমি এই কোয়েরিটি ব্যবহার করে এবং sql_text কলাম থেকে ডেটা অনুলিপি করে একটি নতুন নাম স্ক্রিপ্ট তৈরি করতে পারি। WHOLE ক্লজটি চেক সীমাবদ্ধতার সাথে মেলে যার নামগুলি দেখে মনে হয় তারা এসকিউএল সার্ভার দ্বারা তৈরি হয়েছিল:
SELECT
checks.name AS check_name,
tabs.name AS table_name,
skemas.name AS schema_name,
cols.name AS column_name,
N'
EXECUTE sys.sp_rename
@objname = N''' + skemas.name + N'.' + checks.name + N''',
@newname = N''CK_' + tabs.name + N'_Partition'',
@objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols ON
tabs.object_id = cols.object_id AND
cols.column_id = checks.parent_column_id
WHERE checks.name LIKE (
N'CK__' + SUBSTRING(tabs.name, 1, 9) +
N'__' + SUBSTRING(cols.name, 1, 5) +
N'__' + REPLACE(N'xxxxxxxx', N'x', N'[0-9A-F]') COLLATE Latin1_General_BIN2
)
ORDER BY table_name;
আউটপুটটি দেখতে এটির মতো দেখাচ্ছে:
check_name table_name schema_name column_name sql_text
CK__tbAcquisi__Acqui__5C4299A5 tbAcquisitions_201301 Archive AcquisitionDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbAcquisi__Acqui__5C4299A5', @newname = N'CK_tbAcquisitions_201301_Partition', @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__76026BA8 tbAcquisitions_201302 Archive AcquisitionDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbAcquisi__Acqui__76026BA8', @newname = N'CK_tbAcquisitions_201302_Partition', @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__7D6E8346 tbAcquisitions_201303 Archive AcquisitionDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbAcquisi__Acqui__7D6E8346', @newname = N'CK_tbAcquisitions_201303_Partition', @objtype = 'OBJECT';
...
CK__tbRequest__Reque__60132A89 tbRequests_201301 Archive RequestDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbRequest__Reque__60132A89', @newname = N'CK_tbRequests_201301_Partition', @objtype = 'OBJECT';
CK__tbRequest__Reque__1392CE8F tbRequests_201302 Archive RequestDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbRequest__Reque__1392CE8F', @newname = N'CK_tbRequests_201302_Partition', @objtype = 'OBJECT';
CK__tbRequest__Reque__1AFEE62D tbRequests_201303 Archive RequestDT EXECUTE sys.sp_rename @objname = N'Archive.CK__tbRequest__Reque__1AFEE62D', @newname = N'CK_tbRequests_201303_Partition', @objtype = 'OBJECT';
ক্যোয়ারির ফলাফলটি সঠিক বলে মনে হচ্ছে এবং সার্ভারটি এটি দ্রুত কার্যকর করে।
কিন্তু কার্যকর করার পরিকল্পনার মূল নোডের একটি সতর্কতা রয়েছে:
মতপ্রকাশে রূপান্তর টাইপ করুন (CONVERT_IMPLICIT (এনভারচার (128), [ও]। [নাম], 0)) কোয়েরি প্ল্যান পছন্দে "কার্ডিনালাইটিসিমিটি" প্রভাবিত করতে পারে
এই প্রসঙ্গে এর অর্থ কী? এই জাতীয় জটিল ফিল্টারটি কি অপ্টিমাইজারকে বিভ্রান্ত করছে? এটা কি আমার কিছু চিন্তা করা উচিত?
COLLATE
কেবলমাত্র পরিসীমা প্রকাশের জন্য সঠিকভাবে কাজ করতে পারে তবে আপনি প্রতিস্থাপন N'[0-9A-F]')
করতে N'[0123456789ABCDEF]'
এবং ড্রপ করতে পারেনCOLLATE Latin1_General_BIN2
COLLATE Latin1_General_BIN2
অভিব্যক্তি তোলেchecks.name
unsargable। আপনার নির্দিষ্ট ক্যোয়ারির জন্য নিশ্চিত না হলেও এটি যদি কার্ডিনালিটির অনুমানের ক্ষেত্রে কোনও তফাত তৈরি করে।