অভিব্যক্তিতে প্রকারের রূপান্তরটি ক্যোয়ারী পরিকল্পনার পছন্দে "কার্ডিনালটিসটিমেট" প্রভাবিত করতে পারে?


10

আমি একটি সংরক্ষণাগার ডাটাবেস বজায় রেখেছি যা বিভক্ত ভিউগুলিতে 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)) কোয়েরি প্ল্যান পছন্দে "কার্ডিনালাইটিসিমিটি" প্রভাবিত করতে পারে

এই প্রসঙ্গে এর অর্থ কী? এই জাতীয় জটিল ফিল্টারটি কি অপ্টিমাইজারকে বিভ্রান্ত করছে? এটা কি আমার কিছু চিন্তা করা উচিত?


2
COLLATE Latin1_General_BIN2অভিব্যক্তি তোলে checks.nameunsargable। আপনার নির্দিষ্ট ক্যোয়ারির জন্য নিশ্চিত না হলেও এটি যদি কার্ডিনালিটির অনুমানের ক্ষেত্রে কোনও তফাত তৈরি করে।
মার্টিন স্মিথ

2
ধরে নেওয়া বাইনারিটি COLLATEকেবলমাত্র পরিসীমা প্রকাশের জন্য সঠিকভাবে কাজ করতে পারে তবে আপনি প্রতিস্থাপন N'[0-9A-F]')করতে N'[0123456789ABCDEF]'এবং ড্রপ করতে পারেনCOLLATE Latin1_General_BIN2
মার্টিন স্মিথ

উত্তর:


16

ক্যোয়ারির ফলাফলটি সঠিক বলে মনে হচ্ছে এবং সার্ভারটি এটি দ্রুত কার্যকর করে।

কিন্তু কার্যকর করার পরিকল্পনার মূল নোডের একটি সতর্কতা রয়েছে:

মতপ্রকাশে রূপান্তর টাইপ করুন (CONVERT_IMPLICIT (এনভারচার (128), [ও]। [নাম], 0)) কোয়েরি প্ল্যান পছন্দে "কার্ডিনালাইটিসিমিটি" প্রভাবিত করতে পারে

এই প্রসঙ্গে এর অর্থ কী? এই জাতীয় জটিল ফিল্টারটি কি অপ্টিমাইজারকে বিভ্রান্ত করছে? এটা কি আমার কিছু চিন্তা করা উচিত?

সতর্কতা তথ্যযুক্ত। যদি আপনার জিজ্ঞাসাটি ধীরে ধীরে সম্পাদিত হয়, বা আপনি দেখেছেন যে কার্ডিনালটির অনুমানগুলি ভুল ছিল, সতর্কতা আপনাকে কোনও সম্ভাব্য কারণ কোথায় সন্ধান করবে সে সম্পর্কে তথ্য দেবে।

সতর্কতাটি কোলেশন পরিবর্তনের জন্য ব্যবহৃত নিখুঁত রূপান্তর দ্বারা ট্রিগার করা হয়েছে। যদি কোলেশনটি ব্যবহার করা সঠিক ফলাফল পাওয়ার সহজতম উপায় হয় তবে তা যেমন নির্দ্বিধায় তা বোধ করবেন না। বিকল্পভাবে, কেন এটির প্রয়োজন তা সম্পর্কে যদি আপনি আরও ব্যাখ্যা করেন তবে কেউ আপনাকে পরামর্শ দেবে।

একপাশে, REPLACEপ্রতিস্থাপন করা যেতে পারে:

REPLICATE(N'[0-9A-F]', 8);

(এই উত্তরটি প্রশ্নের মন্তব্যের সংক্ষিপ্তসার।)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.