সাবকিউরি কেন সমান্তরালতা ব্যবহার করে এবং যোগদান করে না?


16

এসকিউএল সার্ভার যখন এই কোয়েরিটি সাবকিউরি ব্যবহার করে তবে এটি যোগদানের সময় ব্যবহার করে না কেন চলতে গিয়ে সমান্তরালতা ব্যবহার করে? যোগদানের সংস্করণটি সিরিয়ালে চলে এবং এটি প্রায় 30 গুণ বেশি সময় নেয়।

সংস্করণে যোগদান করুন: sec 30 সেকেন্ড

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

সাবকিউরি সংস্করণ: <1 সেকেন্ড

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

সম্পাদনা: ক্যোয়ারী পরিকল্পনার এক্সএমএল সংস্করণ:

যোগদান সংস্করণ

সাবজুরি সংস্করণ

উত্তর:


12

মন্তব্যগুলিতে ইতিমধ্যে ইঙ্গিত হিসাবে এটি দেখে মনে হচ্ছে আপনার নিজের পরিসংখ্যান আপডেট করার প্রয়োজন আছে।

জোড়ার মধ্য থেকে বেরিয়ে আসা আনুমানিক সারিগুলির সংখ্যা locationএবং testrunsদুটি পরিকল্পনার মধ্যে চূড়ান্ত।

পরিকল্পনার অনুমানগুলিতে যোগদান করুন: 1

পরিকল্পনা 1

সাব ক্যোয়ারী পরিকল্পনার অনুমান: 8,748

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

যোগদানের মধ্য থেকে আসা সারিগুলির আসল সংখ্যা 14,276।

অবশ্যই এটি নিখুঁতভাবে কোনও স্বজ্ঞাত ধারণা দেয় না যে যোগদানের সংস্করণটি অনুমান করে যে 3 টি সারি এসে locationএকটি একক যোগদান করা সারি তৈরি করবে যখন সাব কোয়েরি অনুমান করে যে সেই সারিগুলির মধ্যে একটিও একই যোগ থেকে 8,748 উত্পাদন করবে তবে তবুও আমি সক্ষম হয়েছি এটি পুনরুত্পাদন করতে।

পরিসংখ্যান তৈরি করার সময় হিস্টোগ্রামগুলির মধ্যে কোনও ক্রস ওভার না থাকলে এটি ঘটতে পারে বলে মনে হয়। যোগদান সংস্করণ একটি একক সারি ধরে। এবং উপ-ক্যোয়ারীর একক সাম্যতার সন্ধান একই অংকিত সারিগুলিকে অজানা ভেরিয়েবলের বিপরীতে সমতা হিসাবে ধরে নেয়।

টেস্টরুনগুলির কার্ডিনালিটিটি 26244। ধরে নিলাম যে তিনটি পৃথক অবস্থানের আইডিতে জনবসতিযুক্ত রয়েছে তারপরে নিম্নলিখিত কোয়েরি অনুমান করে যে 8,748সারিগুলি ফিরে আসবে ( 26244/3)

declare @i int

SELECT *
FROM   testruns AS tr
WHERE  tr.location_id = @i

প্রদত্ত টেবিলে locationsকেবল 3 টি সারি রয়েছে এমন পরিসংখ্যান তৈরি করা সহজ (যদি আমরা কোনও বিদেশী কী না ধরে থাকি) যেখানে পরিসংখ্যান তৈরি হয় এবং তারপরে ডেটাটি এমনভাবে পরিবর্তিত করা হয় যেগুলি ফিরে আসার সারিগুলির প্রকৃত সংখ্যাকে নাটকীয়ভাবে প্রভাবিত করে তবে এটি অপর্যাপ্ত হয় পরিসংখ্যানের স্বতঃ আপডেট ট্রিপ করুন এবং থ্রেশহোল্ডটি পুনরায় কম্পাইল করুন।

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

আপনার পরিকল্পনায় প্রদর্শিত প্রকৃত বনাম আনুমানিক সারিগুলি পুনরুত্পাদন করার একটি সম্ভাব্য দৃশ্য নীচে রয়েছে।

CREATE TABLE location
  (
     id       INT CONSTRAINT locationpk PRIMARY KEY,
     location VARCHAR(MAX) /*From the separate filter think you are using max?*/
  )

/*Temporary ids these will be updated later*/
INSERT INTO location
VALUES      (101, 'Coventry'),
            (102, 'Nottingham'),
            (103, 'Derby')

CREATE TABLE testruns
  (
     location_id INT
  )

CREATE CLUSTERED INDEX IX ON testruns(location_id)

/*Add in 26244 rows of data split over three ids*/
INSERT INTO testruns
SELECT TOP (5984) 1
FROM   master..spt_values v1, master..spt_values v2
UNION ALL
SELECT TOP (5984) 2
FROM   master..spt_values v1, master..spt_values v2
UNION ALL
SELECT TOP (14276) 3
FROM   master..spt_values v1, master..spt_values v2

/*Create statistics. The location_id histograms don't intersect at all*/
UPDATE STATISTICS location(locationpk) WITH FULLSCAN;    
UPDATE STATISTICS testruns(IX) WITH FULLSCAN;

/* UPDATE location.id. Three row update is below recompile threshold*/
UPDATE location
SET    id = id - 100

তারপরে নিম্নলিখিত প্রশ্নগুলি চালানো একই আনুমানিক বনাম প্রকৃত তাত্পর্য দেয়

SELECT *
FROM   testruns AS tr
WHERE  tr.location_id = (SELECT id
                         FROM   location
                         WHERE  location = 'Derby')

SELECT *
FROM   testruns AS tr
       JOIN location loc
         ON tr.location_id = loc.id
WHERE  loc.location = ( 'Derby' ) 

যদি লোকেশনে কোনও অনন্য বাধা যুক্ত হয় তবে এটি স্পষ্ট হয়ে যায় যে "=" ঠিক এক সারিতে ফিরে আসবে। তারপরে আপনার উদাহরণে ক্যোয়ারী প্ল্যানগুলি অভিন্ন হয়ে উঠবে (স্ক্যান -> সিক্স): সারণীর অবস্থান পরিবর্তন করুন সীমাবদ্ধতা U_Location_Location অনন্য অবিচ্ছিন্ন (অবস্থান) যুক্ত করুন;
ক্রোকুসেক

@ ক্রোকুসেক হ্যাঁ এরপরে আপনি কী বোঝাতে চেয়েছিলেন তা বুঝতে পেরে আমার মন্তব্য মুছে ফেলা হয়েছে! এতে কি যোগসূত্রের সংস্করণটির জন্য সাবকোরির সমান হওয়ার জন্য সারিগুলির আনুমানিক সংখ্যা বাড়িয়েছে? এই মুহুর্তে পিসিতে না পরীক্ষা?
মার্টিন স্মিথ

@ ক্রোকুসেক ইয়েপ সেই সিঙ্গলটনের ক্ষেত্রে সাব ক্যোয়ারী হিসাবে যোগ দেওয়ার বাইরে একই আনুমানিক সারিগুলির মতো দেখাচ্ছে।
মার্টিন স্মিথ

হ্যাঁ. আইডেন্টিকাল ক্যোয়ারী প্ল্যান, উভয় অনুমান 8748, উভয় প্রবক্তা 14276. বিটিডাব্লু, আমি ভেবেছিলাম লোকেশনটির প্রাক-গণনা করা এই পার্থক্যটি সমাধান করবে তবে তা হয় না।
ক্রোকুসেক

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