লাইক সূচক ব্যবহার করে, CHARINDEX না?


22

এই প্রশ্নটি আমার পুরানো প্রশ্নের সাথে সম্পর্কিত । নীচের ক্যোয়ারীটি কার্যকর করতে 10 থেকে 15 সেকেন্ড সময় নিয়েছিল:

SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE (Charindex('123456789',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0) 

কিছু নিবন্ধে আমি দেখেছি যে ব্যবহার করে CASTএবং CHARINDEXসূচীকরণ থেকে কোনও উপকার হবে না। এছাড়াও কিছু নিবন্ধ আছে যা বলেছে যেগুলি ব্যবহারের LIKE '%abc%'সময় সূচীকরণের ফলে কোনও লাভ হবে না LIKE 'abc%':

http://bytes.com/topic/sql-server/answers/81467- using-charindex-vs- Like- कहीं /programming/ -একটি-প্রশ্নের http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568

আমার ক্ষেত্রে আমি ক্যোয়ারীটি আবার লিখতে পারি:

SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
FROM [company].dbo.[customer]
WHERE [company].dbo.[customer].[Phone no]  LIKE '%123456789%'

এই কোয়েরিটি আগেরটির মতো একই আউটপুট দেয়। আমি কলামের জন্য একটি অবিবাহিত সূচক তৈরি করেছি Phone no। আমি যখন এই কোয়েরিটি সম্পাদন করি এটি মাত্র 1 সেকেন্ডে চলে । এটি আগের 14 সেকেন্ডের সাথে তুলনা করে একটি বিশাল পরিবর্তন ।

LIKE '%123456789%'ইনডেক্সিং থেকে কীভাবে উপকার পাবেন?

তালিকাভুক্ত নিবন্ধগুলি কেন বলছে যে এটির কার্যকারিতা উন্নতি হবে না?

আমি কোয়েরিটি ব্যবহার করতে আবার লিখতে চেষ্টা করেছি CHARINDEX, তবে কর্মক্ষমতা এখনও ধীর। কেন জিজ্ঞাসাটি CHARINDEXযেমন প্রকাশিত হয় ততই সূচিকাগুলি থেকে কেন উপকৃত হয় না LIKE?

ব্যবহার করে জিজ্ঞাসা করুন CHARINDEX:

SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
 FROM [Company].dbo.[customer]
 WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 ) 

হত্যা পরিকল্পনা:

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

ব্যবহার করে জিজ্ঞাসা করুন LIKE:

SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id]
 FROM [Company].dbo.[customer]
 WHERE[Company].dbo.[customer].[Phone no] LIKE '%9000413237%'

হত্যা পরিকল্পনা:

ক্যোয়ারী লাইক পছন্দ করুন

উত্তর:


28

কীভাবে '% 123456789%' লাইক ইনডেক্সিং থেকে উপকৃত হয়?

শুধুমাত্র অল্প পরিমাণে. ক্যোয়ারী প্রসেসর পুরো টেবিলের (ক্লাস্টারড ইনডেক্স) পরিবর্তে ম্যাচগুলির সন্ধানে সম্পূর্ণ নন-ক্ল্লাস্টার্ড সূচকটি স্ক্যান করতে পারে । ননক্লাস্টারড ইনডেক্সগুলি সাধারণত যে টেবিলের উপরে তৈরি হয় তার চেয়ে ছোট হয়, তাই অবিচ্ছিন্ন সূচকগুলি স্ক্যান করা দ্রুততর হতে পারে।

অবক্ষয়টি হ'ল যে কোয়েরির জন্য প্রয়োজনীয় যে কোনও কলাম যা অবিচ্ছিন্ন সূচী সংজ্ঞায় অন্তর্ভুক্ত নেই সেগুলি প্রতি সারি বেস টেবিলের মধ্যে দেখতে হবে।

অপ্টিমাইজারটি ব্যয় প্রাক্কলনের উপর ভিত্তি করে সারণী (ক্লাস্টারড ইনডেক্স) স্ক্যান করার এবং লকআপস সহ ননক্র্লাস্টারড ইনডেক্স স্ক্যান করার মধ্যে একটি সিদ্ধান্ত নেয়। অপ্টিমাইজারটি আপনার বা নির্বাচনের পূর্বাভাসের প্রত্যাশায় কতগুলি সারি নির্ভর করবে তার উপর আনুমানিক ব্যয় অনেকাংশে নির্ভর করে।LIKECHARINDEX

তালিকাভুক্ত নিবন্ধগুলি কেন বলছে যে এটির কার্যকারিতা উন্নতি হবে না?

ওয়াইল্ডকার্ড দিয়ে শুরু না হওয়াLIKE শর্তের জন্য , এসকিউএল সার্ভার পুরো জিনিসটি স্ক্যান না করে সূচকের আংশিক স্ক্যান করতে পারে । উদাহরণস্বরূপ, কেবলমাত্র সূচক রেকর্ড এবং (সঠিক সীমানা মান কোলেশন উপর নির্ভর করে) পরীক্ষা করে সঠিকভাবে মূল্যায়ন করা যেতে পারে ।LIKE 'A%>= 'A'< 'B'

এই ধরণের ক্যোয়ারী বি-ট্রি সূচকগুলির সন্ধানের ক্ষমতাটি ব্যবহার করতে পারে: আমরা সরাসরি >= 'A'বি-ট্রি ব্যবহার করে প্রথম রেকর্ডে যেতে পারি , তারপরে < 'B'পরীক্ষায় ব্যর্থ হওয়া রেকর্ডে পৌঁছা পর্যন্ত সূচি কী ক্রমে এগিয়ে স্ক্যান করতে পারি । যেহেতু আমাদের কেবল LIKEপরীক্ষাগুলি অল্প সংখ্যক সারিতে প্রয়োগ করা দরকার , তাই কার্য সম্পাদনটি সাধারণত আরও ভাল।

বিপরীতে, LIKE '%Aআংশিক স্ক্যানে রূপান্তরিত করা যায় না কারণ আমরা জানি না কোথায় শুরু করব বা শেষ করব; যে কোনও রেকর্ড শেষ হতে পারে 'A', তাই আমরা পুরো সূচকটি স্ক্যান করতে এবং প্রতিটি সারি পৃথকভাবে পরীক্ষা করে উন্নত করতে পারি না।

আমি কোয়েরিটি ব্যবহার করতে আবার লিখতে চেষ্টা করেছি CHARINDEX, তবে কর্মক্ষমতা এখনও ধীর। CHARINDEXLIKE কোয়েরি যেমন প্রকাশিত হয় তত সূচকে কেন উপকার হয় না?

কোয়েরি অপ্টিমাইজারের উভয় ক্ষেত্রে সারণী (ক্লাস্টারড ইনডেক্স) স্ক্যান করা এবং ননক্র্লাস্টারড ইনডেক্স (লকআপস সহ) স্ক্যান করার মধ্যে একই পছন্দ রয়েছে।

ব্যয়ের ব্যয় নির্ধারণের উপর ভিত্তি করে পছন্দ দুটি করা হয় । এটি এমন হয় যে এসকিউএল সার্ভার দুটি পদ্ধতির জন্য একটি পৃথক অনুমান উত্পাদন করতে পারে। জন্য LIKEক্যোয়ারী ফর্ম, অনুমান বিশেষ পংক্তি পরিসংখ্যান ব্যবহার করার জন্য একটি যুক্তিসঙ্গতভাবে সঠিক অনুমান উত্পাদন করতে সক্ষম হতে পারে। CHARINDEX > 0ফর্ম একটি অনুমান উপর ভিত্তি করে একটি অনুমান উৎপন্ন হয়।

অপ্টিমাইজারের জন্য একটি ক্লাস্টারড ইনডেক্স স্ক্যান CHARINDEXএবং এর জন্য লুকআপগুলির সাথে একটি নন- ক্লাস্টারড ইনডেক্স স্ক্যান চয়ন করতে বিভিন্ন অনুমান যথেষ্ট LIKE। আপনি যদি CHARINDEXকোয়েরিকে কোনও ইঙ্গিত সহ অবিবাহিত সূচকটি ব্যবহার করতে বাধ্য করেন তবে আপনি একই পরিকল্পনা পাবেন LIKEএবং সম্পাদনাটি একই রকম হবে:

SELECT
    [Customer name],
    [Sl_No],
    [Id]
FROM dbo.customer WITH (INDEX (f))
WHERE 
    CHARINDEX('9000413237', [Phone no]) >0;

রানটাইমে প্রক্রিয়া করা সারিগুলির সংখ্যা উভয় পদ্ধতির জন্য একই হবে, LIKEফর্মটি এই ক্ষেত্রে আরও সঠিক অনুমান উত্পাদন করে, সুতরাং ক্যোয়ারী অপ্টিমাইজার আরও ভাল পরিকল্পনা চয়ন করে।

আপনি যদি নিজেকে নিজেকে LIKE %thing%প্রায়শই অনুসন্ধানের প্রয়োজন মনে করেন তবে আপনি এসকিউএল সার্ভারে ট্রিগ্রাম ওয়াইল্ডকার্ড স্ট্রিং অনুসন্ধানে লিখেছেন এমন কোনও কৌশল বিবেচনা করতে পারেন ।


16

এসকিউএল সার্ভার চেষ্টা আকারে স্ট্রিং কলামগুলিতে সাবস্ট্রিংয়ের পরিসংখ্যান বজায় রাখে যা LIKEক্যোয়ারী দ্বারা ব্যবহারযোগ্য কিন্তু এর দ্বারা নয় CHARINDEX

এ সম্পর্কে আরও জানতে স্ট্রিং সংক্ষিপ্তসার পরিসংখ্যান বিভাগটি দেখুন।

কয়েকটি গুরুত্বপূর্ণ সতর্কতামূলক বিষয় হ'ল ওয়াইল্ডকার্ডগুলির যে কোনও অব্যাহতি মূলশব্দের চেয়ে মালিকানা বর্গক্ষেত্র বন্ধন কৌশল দ্বারা করা উচিত ESCAPEএবং 80 টি অক্ষরের বেশি দীর্ঘ স্ট্রিংয়ের জন্য কেবল প্রথম এবং শেষ 40 টি অক্ষর ব্যবহৃত হয়।

WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 ) 

কেবলমাত্র একটি অসমতাটির জন্য প্রমিত অনুমানটি ব্যবহার করবে যে 30% সারি ফিরে আসবে।

LIKEQUERY (আপনার ক্ষেত্রে) সম্ভবতঃ অনুমান অনেক কম সারি সম্পৃক্ত ম্যাচ হবে।

নোট করুন যে শীর্ষস্থানীয় ওয়াইল্ডকার্ড এখনও একটি সূচী অনুসন্ধানকে বাধা দেয়। একটি সম্পূর্ণ সূচকটি এখনও স্ক্যান করা হয়েছে তবে এটি ক্লাস্টারড সূচকের চেয়ে স্বল্পতর একটি আলাদা ব্যবহার করে। সংক্ষিপ্ত সূচক ক্যোয়ারী দ্বারা ব্যবহৃত সমস্ত কলাম কভার করে না তাই দ্বিতীয় পরিকল্পনায় অনুপস্থিত কলামগুলি পুনরুদ্ধার করার জন্য কী-র অনুসন্ধান প্রয়োজন।

এই পরিকল্পনাটি 30% প্রাক্কলনের সাথে বেছে নেওয়ার পক্ষে অত্যন্ত সম্ভাবনা নেই। এসকিউএল সার্ভার পুরো ক্লাস্টারড ইনডেক্সটি স্ক্যান করা এবং এটি অনেকগুলি অনুসন্ধান এড়াতে সস্তা বলে বিবেচনা করবে। অতিরিক্ত উদাহরণের জন্য টিপিং পয়েন্টে এই নিবন্ধটি দেখুন ।


আমি আপনার ব্যাখ্যা দিয়ে পরিষ্কার নয়। আপনি কি বলছেন যে লাইক ব্যবহার করা চরিনডেক্সের চেয়ে ভাল?
আইটি গবেষক

3
@ আইটিসিয়ারচার - হ্যাঁ, সম্ভাব্য, কম্বলটি কয়টি সারিটির শর্তের সাথে মিলবে তার অনুমানের পরিবর্তে ( 30%এটি LIKEসরবরাহিত প্যাটার্ন এবং স্ট্রিং সারসংক্ষেপের পরিসংখ্যান দেখতে পারে এবং আরও সঠিক অনুমান করতে পারে। সজ্জিত যে এটি একটি আলাদা এবং আরও উপযুক্ত পরিকল্পনা চয়ন করতে পারে।
মার্টিন স্মিথ

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