ওয়াইল্ডকার্ড যুক্ত করতে (বা শীর্ষস্থানীয়) এসকিউএল সার্ভারের ক্যোয়ারিতে বিশাল ধীরগতি


52

আমি আমার 20 মিলিয়ন প্রাণীর একটি চিড়িয়াখানা পেয়েছি যা আমি আমার এসকিউএল সার্ভার 2005 ডাটাবেসে ট্র্যাক করি। এর মধ্যে প্রায় 1% কালো এবং তাদের প্রায় 1% হ্যান্ডস are আমি সমস্ত কালো রাজহাঁসের বিবরণ পেতে চাইছিলাম এবং তাই ফলাফলের পৃষ্ঠাগুলি স্যাম্প করতে চাইনি:

select top 10 * 
from animal 
where colour like 'black'  
and species like 'swan'

(হ্যাঁ, অবিশ্বাস্যভাবে সেই ক্ষেত্রগুলি ফ্রি টেক্সট তবে সেগুলি উভয়ই সূচিবদ্ধ। দেখা যাচ্ছে যে আমাদের কাছে এমন কোনও প্রাণী নেই কারণ কোয়েরিতে প্রায় 300 মিলিসেকেন্ডে একটি খালি সেট দেয়। এটি 'দ্বিগুণ' না হয়ে '=' ব্যবহার করলে প্রায় দ্বিগুণ গতি হত তবে আমার পূর্বনির্দেশটি আমার টাইপিংটি বাঁচাতে চলেছে।

এতে প্রধান চিড়িয়াখানা মনে করে যে তিনি কিছু কিছু রাজহাঁসকে 'ব্ল্যাকিশ' বলে haveুকেছে তাই আমি সেই অনুসারে কোয়েরিটি সংশোধন করব:

select top 10 * 
from animal  
where colour like 'black%' 
and species like 'swan'

দেখা যাচ্ছে যে সেগুলির মধ্যে কোনওটিই নেই (এবং আসলে 'কালো' প্রাণী ছাড়া কোনও 'কৃষ্ণ%' প্রাণী নেই) তবে ক্যোয়ারীটি এখন খালি ফিরে আসতে 30 সেকেন্ড সময় নেয়।

দেখে মনে হচ্ছে এটি কেবল 'শীর্ষ' এবং '%' এর সংমিশ্রণে সমস্যা সৃষ্টি করে কারণ এটি

select count(*) 
from animal  
where colour like 'black%' 
and species like 'swan'

0 খুব দ্রুত এবং এমনকি প্রদান করে

select * 
from animal 
where colour like 'black%' 
and species like 'swan'

এক সেকেন্ডের ভগ্নাংশে খালি ফিরে আসে।

'শীর্ষ' এবং '%' কেন বিশেষত একটি খালি ফলাফলের সেটটিতে এমন নাটকীয় ক্ষতির কারণ হতে পারে তার কারও কি ধারণা আছে?

সম্পাদনা: পরিষ্কার করার জন্য, আমি কোনও ফ্রি টেক্সট ইনডেক্স ব্যবহার করছি না, আমি কেবল বুঝিয়েছি যে ক্ষেত্রগুলি প্রবেশের বিন্দুতে ফ্রি টেক্সট, অর্থাৎ ডাটাবেসে সাধারণকরণযোগ্য নয়। বিভ্রান্তির জন্য দুঃখিত, আমার পক্ষে খারাপ কথা বলা ing

উত্তর:


76

এটি ব্যয় ভিত্তিক অপটিমাইজারের সিদ্ধান্ত decision

এই পছন্দটিতে ব্যবহৃত আনুমানিক ব্যয়গুলি ভুল কারণ এটি বিভিন্ন কলামের মানগুলির মধ্যে পরিসংখ্যানগত স্বাধীনতা অনুমান করে।

এটি সারি লক্ষ্যগুলি গন রোগে বর্ণিত সমস্যার সাথে সমান যেখানে সমান এবং বিজোড় সংখ্যাগুলি নেতিবাচকভাবে সম্পর্কযুক্ত।

এটি পুনরুত্পাদন করা সহজ।

CREATE TABLE dbo.animal(
    id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    colour varchar(50) NOT NULL,
    species varchar(50) NOT NULL,
    Filler char(10) NULL
);

/*Insert 20 million rows with 1% black and 1% swan but no black swans*/
WITH T
     AS (SELECT TOP 20000000 ROW_NUMBER() OVER (ORDER BY @@SPID) AS RN
         FROM   master..spt_values v1,
                master..spt_values v2,
                master..spt_values v3)
INSERT INTO dbo.animal
            (colour,
             species)
SELECT CASE
         WHEN RN % 100 = 1 THEN 'black'
         ELSE CAST(RN % 100 AS VARCHAR(3))
       END,
       CASE
         WHEN RN % 100 = 2 THEN 'swan'
         ELSE CAST(RN % 100 AS VARCHAR(3))
       END
FROM   T 

/*Create some indexes*/
CREATE NONCLUSTERED INDEX ix_species ON  dbo.animal(species);
CREATE NONCLUSTERED INDEX ix_colour ON  dbo.animal(colour);

এখন চেষ্টা করুন

SELECT TOP 10 *
FROM   animal
WHERE  colour LIKE 'black'
       AND species LIKE 'swan' 

এটি নীচে পরিকল্পনা দেয় যা আটকানো হয়েছে 0.0563167

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

পরিকল্পনাটি idকলামে দুটি সূচকের ফলাফলের মধ্যে একীভূত সংযোজন করতে সক্ষম । ( একত্রীকরণের আরও বিশদ এখানে অ্যালগরিদমে যোগদান করুন )।

সংযুক্তি সংযুক্ত করার জন্য উভয় ইনপুট সংযুক্ত কী দ্বারা অর্ডার করা প্রয়োজন।

নন ক্ল্লাস্টার্ড সূচকগুলি যথাক্রমে (species, id)এবং (colour, id)যথাক্রমে অর্ডার করা হয় (নুনউইনক নন ক্লাস্টার ইনডেক্সগুলি সর্বদা স্পষ্টরূপে যোগ না করা হলে কী এর শেষের দিকে সারি লোকেটার যুক্ত থাকে)। কোনও ওয়াইল্ডকার্ড ছাড়াই ক্যোয়ারী একটি সমতা অনুসন্ধান করছে species = 'swan'এবং করছে colour ='black'। যেহেতু প্রতিটি সন্ধানটি কেবল শীর্ষস্থানীয় কলামটি থেকে একটি সঠিক মান পুনরুদ্ধার করছে ম্যাচিং সারিগুলিকে অর্ডার করা হবে idতাই এই পরিকল্পনাটি সম্ভব।

ক্যোয়ারী প্ল্যান অপারেটরগুলি বাম থেকে ডানে চালিত করে । বাম অপারেটর তার বাচ্চাদের কাছ থেকে সারিগুলির জন্য অনুরোধ করছে, যার ফলস্বরূপ তাদের বাচ্চাদের কাছ থেকে সারিগুলি অনুরোধ করা হয় (এবং এরপরে পাতার নোডগুলি পৌঁছানো অবধি)। TOPপুনরুক্তিকারীর একবার 10 গৃহীত হয়েছে তার সন্তান থেকে আর কোনো সারি অনুরোধ করা বন্ধ করবে।

এসকিউএল সার্ভারের সূচীতে পরিসংখ্যান রয়েছে যা এটিকে জানায় যে সারিগুলির 1% প্রতিটি অনুমানের সাথে মেলে। এটি অনুমান করে যে এই পরিসংখ্যানগুলি স্বতন্ত্র (অর্থাত্ ইতিবাচক বা নেতিবাচকভাবে সম্পর্কিত নয়) যাতে এটি একবারে প্রথম স্নাতকের সাথে মিলিত 1000 সারি প্রসেস করে তবে এটি দ্বিতীয়টির সাথে 10 টি মিলবে এবং প্রস্থান করতে পারে। (উপরের পরিকল্পনাটি আসলে 1000 এর পরিবর্তে 987 দেখায় তবে যথেষ্ট কাছে)।

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

তুলনা করা

SELECT TOP 10 *
FROM   animal
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan' 

যা নীচে পরিকল্পনা দেয় যা আটকানো হয় 0.567943

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

পেছনের ওয়াইল্ডকার্ড যুক্ত করার ফলে এখন একটি সূচি স্ক্যান হয়েছে। 20 মিলিয়ন সারি টেবিলের স্ক্যানের জন্য পরিকল্পনার ব্যয়টি এখনও বেশ কম।

যোগ করা querytraceon 9130আরও কিছু তথ্য দেখায়

SELECT TOP 10 *
FROM   animal
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan'       
OPTION (QUERYTRACEON 9130)  

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

এটি দেখা যায় যে এসকিউএল সার্ভার গণনা করে যে এটি প্রিডিকেটের সাথে 10 টি মিলবে এবং TOPসারিগুলির অনুরোধ করা বন্ধ করতে পারে তার আগে এটি প্রায় 100,000 সারি স্ক্যান করতে হবে।

আবার এটি স্বাধীনতা অনুমান হিসাবে বিবেচনা করে 10 * 100 * 100 = 100,000

অবশেষে একটি সূচক ছেদ পরিকল্পনাটি চেষ্টা করতে এবং জোর করতে দেয়

SELECT TOP 10 *
FROM   animal WITH (INDEX(ix_species), INDEX(ix_colour))
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan' 

এটি আমার জন্য আনুমানিক ব্যয় 3.4625 সমান্তরাল পরিকল্পনা দেয়

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

এখানে মূল পার্থক্য হ'ল colour like 'black%'প্রিডিকেট এখন একাধিক বিভিন্ন রঙের সাথে মেলে। এর অর্থ হ'ল সেই প্রাকটিকের সাথে মিলে যাওয়া সূচক সারিগুলি যাতে আর বাছাইয়ের গ্যারান্টিযুক্ত হয় না id

উদাহরণস্বরূপ সূচকটি সন্ধান করা like 'black%'নিম্নলিখিত সারিগুলি ফেরত দিতে পারে

+------------+----+
|   Colour   | id |
+------------+----+
| black      | 12 |
| black      | 20 |
| black      | 23 |
| black      | 25 |
| blackberry |  1 |
| blackberry | 50 |
+------------+----+

প্রতিটি রঙের মধ্যে আইডির অর্ডার দেওয়া হয় তবে বিভিন্ন রঙের আইডিসটি ভাল নাও হতে পারে।

ফলস্বরূপ এসকিউএল সার্ভার আর ইনডেক্স সংযোগ মোড় (কোনও ব্লকিং বাছাই করা অপারেটর যোগ না করে) সম্পাদন করতে পারে না এবং পরিবর্তে এটি একটি হ্যাশ জয়েন সম্পাদন করতে পছন্দ করে। হ্যাশ জয়েন্ট বিল্ড ইনপুটটিতে অবরুদ্ধ হচ্ছে তাই এখন ব্যয়টি প্রতিফলিত হয় যে বিল্ড ইনপুট থেকে সমস্ত মিলিত সারিগুলি কেবল প্রথম পরিকল্পনার মতোই 1000 স্ক্যান করতে হবে তা ধরে নেওয়ার চেয়ে প্রক্রিয়া করা দরকার।

তদন্ত ইনপুটটি অবশ্য অবরুদ্ধ নয় এবং এখনও এটি সঠিকভাবে অনুমান করে যে এটি থেকে 987 টি সারি প্রক্রিয়াজাতকরণের পরে এটি অনুসন্ধান বন্ধ করতে সক্ষম হবে।

(নন-ব্লকিং বনাম বনাম পুনরুদ্ধারকারীদের সম্পর্কে আরও তথ্য এখানে)

অতিরিক্ত আনুমানিক সারিগুলির বর্ধিত ব্যয় এবং হ্যাশকে আংশিক ক্লাস্টারড ইনডেক্স স্ক্যানটিতে যোগ দেওয়া সস্তা দেখায়।

অবশ্যই বাস্তবে "আংশিক" ক্লাস্টারড ইনডেক্স স্ক্যানটি মোটেই আংশিক নয় এবং পরিকল্পনাগুলির তুলনা করার সময় এটি অনুমান করা 100,000 এর চেয়ে পুরো 20 মিলিয়ন সারি পেরিয়ে যাওয়া দরকার।

TOP(বা এটি সম্পূর্ণরূপে অপসারণ) এর মান বাড়ানো অবশেষে একটি টিপিং পয়েন্টের সাথে মুখোমুখি হয় যেখানে সিআই স্ক্যানটি যে সারির সংখ্যাটি অনুমান করার প্রয়োজন হবে সেই পরিকল্পনাটি আরও ব্যয়বহুল দেখায় এবং এটি সূচক ছেদ পরিকল্পনায় ফিরে আসে। আমার জন্য দুটি পরিকল্পনার মধ্যে কাট অফ পয়েন্ট TOP (89)বনাম TOP (90)

আপনার পক্ষে এটি পৃথক হতে পারে কারণ এটি ক্লাস্টারড সূচকটি কত প্রশস্ত তার উপর নির্ভর করে।

সরানো হচ্ছে TOPএবং সি আই স্ক্যান অত্যাচার

SELECT *
FROM   animal WITH (INDEX = 1)
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan' 

88.0586আমার উদাহরণ সারণীর জন্য আমার মেশিনে কাস্ট করা হয়।

যদি এসকিউএল সার্ভার সচেতন ছিল যে চিড়িয়াখানায় কোনও কালো রাজহাঁস নেই এবং কেবল এটির জন্য 10,000,000 সারি পড়ার চেয়ে পূর্ণ স্ক্যান করা দরকার তবে এই পরিকল্পনাটি চয়ন করা হবে না।

আমি বহু কলামের পরিসংখ্যান animal(species,colour)এবং তার উপর animal(colour,species)ফিল্টার করা পরিসংখ্যান চেষ্টা করেছি animal (colour) where species = 'swan'কিন্তু এর কোনওটিই এটি নিশ্চিত করতে সাহায্য করে না যে কালো রাজহাঁসের অস্তিত্ব নেই এবং TOP 10স্ক্যানের জন্য আরও 100,000 সারি প্রসেসের প্রয়োজন হবে।

এটি "অন্তর্ভুক্তি অনুমান" এর কারণেই যেখানে এসকিউএল সার্ভার মূলত ধরে নিয়েছে যে আপনি যদি কিছু অনুসন্ধান করছেন তবে এটি সম্ভবত উপস্থিত রয়েছে।

২০০৮++ তে একটি ডকুমেন্টেড ট্রেস ফ্ল্যাগ রয়েছে যা সারি গোলগুলি বন্ধ করে দেয়। এর প্রভাব হ'ল এই ধারণাটি ছাড়াই এই পরিকল্পনাটি TOPতৈরি করা হয়েছে যে শিশু অপারেটররা সমস্ত মিলে যাওয়া সারিগুলি না পড়ে তাড়াতাড়ি শেষ করতে দেয়। এই ট্রেস পতাকাটি জায়গায় রেখে আমি স্বাভাবিকভাবেই আরও সর্বোত্তম সূচক ছেদ পরিকল্পনাটি পাই।

SELECT TOP 10 *
FROM   animal
WHERE  colour LIKE 'black%'
       AND species LIKE 'swan'
OPTION (QUERYTRACEON 4138)       

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

এই পরিকল্পনাটি এখন সঠিকভাবে উভয় সূচী অনুসন্ধানে 200 হাজার সারি পড়ার জন্য ব্যয় করেছে তবে মূল দেখার জন্য ব্যয় হয়েছে (আনুমানিক 2 হাজার বনাম প্রকৃত 0. এটি TOP 10সর্বাধিক 10 এ সীমাবদ্ধ করবে তবে ট্রেস পতাকা এটি বিবেচনায় নেওয়া আটকাবে) । তবুও প্ল্যানটি সিআই এর সম্পূর্ণ স্ক্যানের তুলনায় উল্লেখযোগ্যভাবে সস্তা ব্যয় করা হয়েছে তাই নির্বাচন করা হয়েছে।

অবশ্যই এই পরিকল্পনা সমন্বয়, যার জন্য অনুকূল নাও হতে পারে হয় সাধারণ। যেমন সাদা রাজহাঁস।

animal (colour, species)আদর্শভাবে বা একটি যৌগিক সূচক কোয়েরিকে animal (species, colour)উভয় পরিস্থিতির জন্য অনেক বেশি দক্ষ হতে দেয়।

সংমিশ্রিত সূচকের সর্বাধিক দক্ষ ব্যবহার করার জন্য এটিকেও LIKE 'swan'পরিবর্তন করতে হবে = 'swan'

নীচের সারণীতে চারটি আদেশের জন্য কার্যকর করার পরিকল্পনায় দেখানো অনুসন্ধানের পূর্বাভাস এবং অবশিষ্টাংশের পূর্বাভাস দেখায়।

+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+
|                 WHERE clause                 |       Index       |                         Seek Predicate                         |              Residual Predicate              |
+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+
| colour LIKE 'black%' AND species LIKE 'swan' | ix_colour_species | colour >= 'black' AND colour < 'blacL'                         | colour like 'black%' AND species like 'swan' |
| colour LIKE 'black%' AND species LIKE 'swan' | ix_species_colour | species >= 'swan' AND species <= 'swan'                        | colour like 'black%' AND species like 'swan' |
| colour LIKE 'black%' AND species = 'swan'    | ix_colour_species | (colour,species) >= ('black', 'swan')) AND colour < 'blacL'    | colour LIKE 'black%' AND species = 'swan'    |
| colour LIKE 'black%' AND species = 'swan'    | ix_species_colour | species = 'swan' AND (colour >= 'black' and colour <  'blacL') | colour like 'black%'                         |
+----------------------------------------------+-------------------+----------------------------------------------------------------+----------------------------------------------+

15

এই আকর্ষণীয়টি আবিষ্কার করে, আমি কিছু অনুসন্ধান করেছি এবং এই প্রশ্নোত্তরকে হোঁচট খেয়েছি কীভাবে (এবং কেন) শীর্ষস্থানীয় কার্যকর করার পরিকল্পনার উপর প্রভাব ফেলবে?

মূলত, টপ ব্যবহার করে অপারেটরগুলির অনুসরণের ব্যয় পরিবর্তন করে (একটি অলৌকিক পদ্ধতিতে), যার ফলে ওভারাল পরিকল্পনাটিও পরিবর্তিত হয় (আপনি যদি টপ 10 এর সাথে এবং ছাড়া এক্সিকিপ্ল্যানস অন্তর্ভুক্ত করেন তবে এটি দুর্দান্ত হবে) যার ফলে ওভাররাল এক্সিকিউশনটি বেশ পরিবর্তন হয় প্রশ্ন।

আশাকরি এটা সাহায্য করবে.

উদাহরণস্বরূপ, আমি এটি একটি ডেটাবেজে চেষ্টা করেছি এবং: - যখন শীর্ষে ডাকা হয় না, সমান্তরালতা ব্যবহৃত হয় - শীর্ষে, সমান্তরালতা ব্যবহার হয় না

সুতরাং, আবারও, আপনার সম্পাদনের পরিকল্পনাগুলি দেখানো আরও তথ্য সরবরাহ করবে।

আপনার দিনটি শুভ হোক


-1

আমি বিশ্বাস করি এটি এমএসএসকিউএল 2005 এর অন্তর্নিহিত প্রকৃতির কারণে এবং কোয়েরি অপ্টিমাইজারটি সিদ্ধান্ত নিয়েছে যে কোন এক্সিকিউশন পরিকল্পনাটি সবচেয়ে দক্ষ।

আপনি যদি কোনও এসকিউএল ভেরিয়েবল ব্যবহার করেন তবে নেস্টেড লুপগুলির পরিবর্তে হ্যাশ মিলগুলি ব্যবহার করার জন্য ক্যোরি অপটিমাইজারটিকে 'ট্রিক' করা উচিত যার ফলে সমান্তরালতা অনেক বেশি মাত্রায় দেখা দেবে।

চেষ্টা করুন:

DECLARE @topn INT = 10
SELECT TOP (@topn) *
FROM    animal
WHERE   colour LIKE 'black%' 
AND species LIKE 'swan'

5
একটি চলকতে TOPমান অবলম্বন করার অর্থ এটি TOP 100পরিবর্তে ধরে নেওয়া হবে TOP 10। দুটি পরিকল্পনার মধ্যে টিপিং পয়েন্টটি নির্ভর করে এটি নির্ভর করতে পারে বা নাও করতে পারে।
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.