অক্ষরের দৈর্ঘ্যের সীমাবদ্ধতা কাটিয়ে উঠুন


13

এই পড়া দ্বারা মত চরিত্র দৈর্ঘ্য সীমাবদ্ধতা এখানে, এটা দেখে মনে হচ্ছে আমি একটি টেক্সট আর ~ 4000 অক্ষর একটি মত ধারা পাঠাতে পারেন।

আমি একটি নির্দিষ্ট ক্যোয়ারির জন্য ক্যোয়ারী প্ল্যান ক্যাশে থেকে ক্যোয়ারী প্ল্যান আনার চেষ্টা করছি।

SELECT *
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?'

যদি এর ভিতরে থাকা ক্যোয়ারী LIKE4000 টিরও বেশি দীর্ঘ হয় তবে আমার ক্যোয়ারী ক্যাশে পরিকল্পনায় থাকলেও আমি 0 টি ফলাফল পাই। (আমি কমপক্ষে একজন এররার আশা করছিলাম)।

এই সমস্যাটি সমাধান করার বা অন্যভাবে এটি করার কোনও উপায় আছে কি? আমার ক্যোয়ারী রয়েছে যা 10000চরগুলি দীর্ঘ হতে পারে এবং দেখে মনে হয় আমি এর সাথে সেগুলি খুঁজে পাই না LIKE


2
পাঠ্যটি সম্ভবত ভেঙে ফেলুন ... যেহেতু একে অপরের মতো আপনার কাছে অনেকগুলি প্রশ্ন থাকা উচিত নয়:where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
স্কিমসন

4
আপনার কাছে কি এমন ক্যোয়ারী পাঠ্য রয়েছে যা 4,000 অক্ষরের জন্য অভিন্ন এবং তারপরে পৃথক?
মার্টিন স্মিথ

@ মার্টিনস্মিথ হ্যাঁ, আমার কাছে এরকম প্রশ্ন রয়েছে।
ড্যান দিনু

উত্তর:


9

এটি খাঁটি টি-এসকিউএল-তে সমাধান করা যায় না বলে মনে হয় না এবং "সন্ধানের জন্য" স্ট্রিংয়ের (অর্থাৎ সর্বোচ্চ 8000 বা 4000 অক্ষর) 8000 বাইটের বেশি ব্যবহার করার অনুমতি দেয় CHARINDEXনা । এটি নিম্নলিখিত পরীক্ষাগুলিতে দেখা যাবে:PATINDEXVARCHARNVARCHAR

SELECT 1 WHERE CHARINDEX(N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 7000),
                         N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 6000)) > 0

SELECT 1 WHERE PATINDEX(N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 7000),
                        N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 6000)) > 0

এই উভয় প্রশ্নেরই নিম্নলিখিত ত্রুটিটি ফিরে আসে:

এমএসজি 8152, স্তর 16, রাজ্য 10, লাইন এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স
স্ট্রিং বা বাইনারি ডেটা কেটে যাবে।

এবং, 7000এই কোয়েরির যে কোনও একটিতে হ্রাস করার ফলে 3999ত্রুটি থেকে মুক্তি পাওয়া যায়। 4000উভয় ক্ষেত্রে একটি মানও ত্রুটি ঘটবে ( N'Z'শুরুতে অতিরিক্ত চরিত্রের কারণে )।

যাইহোক, এসকিউএলসিআরআর ব্যবহার করে এটি সম্পন্ন করা যায়। এটি স্কেলার ফাংশন তৈরি করা মোটামুটি সহজ যা দুটি ধরণের ইনপুট পরামিতি গ্রহণ করে NVARCHAR(MAX)

নিম্নলিখিত উদাহরণটি এসকিউএল # এসকিউএলসিআরআর লাইব্রেরির ফ্রি সংস্করণ (যা আমি তৈরি করেছি, তবে স্ট্রিং_সন্টেইনসটি আবার ফ্রি সংস্করণে উপলব্ধ :-) ব্যবহার করে এই ক্ষমতাটি চিত্রিত করে ।

সেটআপ

-- DROP TABLE #ContainsData;
CREATE TABLE #ContainsData
(
  ContainsDataID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Col1 NVARCHAR(MAX) NOT NULL
);

INSERT INTO #ContainsData ([Col1])
VALUES (N'Q' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 15000)),
       (N'W' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 20000)),
       (N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 70000));

-- verify the lengths being over 8000
SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM   #ContainsData tmp;

পরীক্ষা-নিরীক্ষা

SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM   #ContainsData tmp
WHERE  SQL#.String_Contains(tmp.[Col1], REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 15100)) = 1;
-- IDs returned: 2 and 3

SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM   #ContainsData tmp
WHERE  SQL#.String_Contains(tmp.[Col1], REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 26100)) = 1;
-- IDs returned: 3

দয়া করে মনে রাখবেন যে স্ট্রিং_ কনটেনগুলি একটি সংবেদনশীল (কেস, অ্যাকসেন্ট, কানা এবং প্রস্থ) তুলনা ব্যবহার করছে।


2

যেহেতু আপনি বিকল্প পদ্ধতির জন্যও বলেছিলেন, নির্দিষ্ট পরিকল্পনার সন্ধান করার আরেকটি উপায় হ'ল plan_hashআপনার অনুসন্ধানকে নিম্নরূপে পরিবর্তন করে এর সন্ধান করা:

SELECT *
FROM sys.dm_exec_cached_plans AS cp 
INNER JOIN sys.dm_exec_query_stats qs
    ON cp.plan_handle = qs.plan_handle
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE qs.query_hash = 0xE4026347B5F49802

QueryHashসন্ধানের জন্য মানটি পেতে আমি দ্রুততম উপায়টি হ'ল প্রশ্নের ক্যোয়ারিকে কোয়েরি উইন্ডোতে পেস্ট করুন এবং তারপরে আনুমানিক নির্বাহ পরিকল্পনাটি প্রদর্শন করুন। এক্সএমএল আউটপুট পড়ুন এবং উপাদানটির QueryHashবৈশিষ্ট্যটি অনুসন্ধান করুন StmtSimpleএবং এটি আপনাকে যা প্রয়োজন তা দেবে। উপরের ক্যোয়ারীতে ক্যোরিহ্যাশ মানটি প্লাগ করুন এবং আশা করি আপনি যা খুঁজছেন তা আপনার উচিত।

এখানে কিছু স্ক্রিনশট প্রদর্শন করা হচ্ছে যাতে QueryHashআমি কীভাবে এটি খারাপভাবে ব্যাখ্যা করছি সে ক্ষেত্রে কীভাবে মান পেতে হয় showing

আনুমানিক কার্যকর কার্যকরকরণ পরিকল্পনা প্রদর্শন করুন

এখানে চিত্র বর্ণনা লিখুন

এক্সিকিউশন প্ল্যান এক্সএম দেখান ...

এখানে চিত্র বর্ণনা লিখুন

ক্যোরিহ্যাশ মানটির জন্য অনুসন্ধান করুন

এখানে চিত্র বর্ণনা লিখুন

স্পষ্টতই কৌশলটি কাজ করবে না যদি আপনি যে ক্যোয়ারীটি সন্ধান করছেন তা যদি আপনি যে অনুমানের জন্য নির্ধারিত কার্যনির্বাহী পরিকল্পনাটি প্রদর্শন করছেন তার চেয়ে আলাদা হয় তবে সিএলআর রুটিনগুলির সাথে আসা সমস্ত সংজ্ঞার চেয়ে দ্রুত হতে পারে এবং সেগুলি সঠিকভাবে কাজ করতে পারে।


0

আপনার যদি ক্যোয়ারী পাঠ্যে অ্যাক্সেস থাকে (যার অর্থ আপনি সেগুলি সংশোধন করতে পারেন), আপনি আগ্রহী তাদের অনন্য মন্তব্য যুক্ত করতে পারেন:

select /* myUniqueQuery123 */ whatever from somewhere ...

তারপরে myUniqueQuery123পুরো ক্যোয়ারী পাঠ্যের পরিবর্তে প্ল্যান ক্যাশে অনুসন্ধান করুন:

... where st.text like '%myUniqueQuery123%'

পুনশ্চ. পরীক্ষিত না

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