কেন কনটেনটেশন অপারেটর তার ইনপুটগুলির চেয়ে কম সারি অনুমান করে?


20

নিম্নলিখিত ক্যোয়ারী পরিকল্পনার স্নিপেটে, এটি স্পষ্ট বলে মনে হয় যে Concatenationঅপারেটরের জন্য সারি অনুমান হওয়া উচিত ~4.3 billion rows, বা তার দুটি ইনপুটগুলির জন্য সারি অনুমানের যোগফল।

তবে এর একটি প্রাক্কলন ~238 million rowsউত্পাদিত হয়, যা একটি উপ-অনুকূল Sort/ Stream Aggregateকৌশল তৈরি করে যা কয়েকশ গিগাবাইট ডেটা টেম্পিডবিতে ছড়িয়ে দেয়। এই ক্ষেত্রে একটি যৌক্তিকভাবে সামঞ্জস্যপূর্ণ অনুমান একটি উত্পাদন করতে পারে Hash Aggregate, স্পিল সরানো, এবং নাটকীয়ভাবে কোয়েরি কর্মক্ষমতা উন্নত।

এটি কি এসকিউএল সার্ভার 2014 এ একটি বাগ? ইনপুটগুলির চেয়ে কম অনুমান যুক্তিসঙ্গত হতে পারে এমন কোনও বৈধ পরিস্থিতি আছে কি? কি workarouts উপলব্ধ হতে পারে?

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

এখানে পূর্ণ জিজ্ঞাসা পরিকল্পনা (বেনামে) is আমার কাছে এই সার্ভারটিতে সিসাদমিন অ্যাক্সেস নেই QUERYTRACEON 2363বা অনুরূপ ট্রেস ফ্ল্যাগগুলি থেকে আউটপুট সরবরাহ করার জন্য , তবে তারা যদি সহায়ক হয় তবে কোনও অ্যাডমিনের কাছ থেকে এই আউটপুটগুলি পেতে সক্ষম হতে পারে।

ডাটাবেসটি সামঞ্জস্যের পর্যায়ে রয়েছে 120, এবং তাই নতুন এসকিউএল সার্ভার 2014 কার্ডিনালিটি অনুমান ব্যবহার করছে।

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

উত্তর:


21

এই সংযুক্ত আইটেমটিতে ক্যাম্পবেল ফ্রেজারের উদ্ধৃতি দিতে :

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

এটির সামান্য প্রসারিত করার জন্য: আমি যেভাবে এটি ব্যাখ্যা করতে চাই তা হল প্রাথমিক কার্ডিনালিটি অনুমান (ব্যয়ভিত্তিক অপ্টিমাইজেশন শুরু হওয়ার আগে সঞ্চালিত) আরও "সামঞ্জস্যপূর্ণ" কার্ডিনালিটির অনুমান তৈরি করে, যেহেতু পুরো প্রাথমিক গাছটি প্রক্রিয়াজাত হয়, প্রতিটি পরবর্তীটি সহ প্রাক্কলন সরাসরি পূর্বেরটির উপর নির্ভর করে।

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

যা যা বলেছিল, এসকিউএল সার্ভার ২০১৪-তে প্রবর্তিত নতুন কার্ডিনালিটি প্রাক্কলনকারী (সিই) এর কিছু বিশদ পরিবর্তন রয়েছে যা মূল সিইর ক্ষেত্রে এর চেয়ে কিছুটা কম সাধারণ করে তোলে ।

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

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

যদি সারি গণনাগুলি যথাযথ মতো কিছু হয় তবে এটি একটি কোয়েরির মতো যা কলামস্টোর থেকে উপকৃত হতে পারে seems বেশিরভাগ সাধারণ সুবিধা বাদ দিয়ে, আপনি ব্যাচ মোড অপারেটরগুলির জন্য গতিশীল মেমরি অনুদানের সুবিধা নিতে সক্ষম হবেন ( ট্রেস পতাকা 9389 এর প্রয়োজন হতে পারে)।


7

SQL সার্ভার 2012 (11.0.6020) একটি বোঝা যাচ্ছে যে নেতারা বরং সহজ পরীক্ষা বিছানা নির্মাণের আমাকে দুই হ্যাশ মিলেছে প্রশ্নের একটি মাধ্যমে ঘনিভূত হচ্ছে একটি পরিকল্পনা পুনঃ করার অনুমতি দেয় UNION ALL। আমার পরীক্ষা-শয্যা আপনি যে ভুল অনুমানটি দেখেন তা প্রদর্শন করে না। সম্ভবত এটি একটি এসকিউএল সার্ভার 2014 সিই সমস্যা।

আমি একটি ক্যোয়ারির জন্য 133.785 সারিগুলির একটি অনুমান পাই যা আসলে ২৮০ টি সারি দেয়, তবে আশা করা যায় যে আমরা আরও নীচে দেখব:

IF OBJECT_ID('dbo.Union1') IS NOT NULL
DROP TABLE dbo.Union1;
CREATE TABLE dbo.Union1
(
    Union1_ID INT NOT NULL
        CONSTRAINT PK_Union1
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , Union1_Text VARCHAR(255) NOT NULL
    , Union1_ObjectID INT NOT NULL
);

IF OBJECT_ID('dbo.Union2') IS NOT NULL
DROP TABLE dbo.Union2;
CREATE TABLE dbo.Union2
(
    Union2_ID INT NOT NULL
        CONSTRAINT PK_Union2
        PRIMARY KEY CLUSTERED
        IDENTITY(2,2)
    , Union2_Text VARCHAR(255) NOT NULL
    , Union2_ObjectID INT NOT NULL
);

INSERT INTO dbo.Union1 (Union1_Text, Union1_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;

INSERT INTO dbo.Union2 (Union2_Text, Union2_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
GO

SELECT *
FROM dbo.Union1 u1
    INNER HASH JOIN sys.objects o ON u1.Union1_ObjectID = o.object_id
UNION ALL
SELECT *
FROM dbo.Union2 u2
    INNER HASH JOIN sys.objects o ON u2.Union2_ObjectID = o.object_id;

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

জো স্যাক এখানে একটি আকর্ষণীয় পড়া আছে

একটির জন্য UNION ALL, এটি বলা নিরাপদ যে আমরা ইউনিয়নের প্রতিটি উপাদান দ্বারা ফিরে আসা সারির মোট সংখ্যাটি দেখতে পাব, তবে এসকিউএল সার্ভার যেহেতু দুটি উপাদানগুলির জন্য সারি অনুমান ব্যবহার করছে UNION ALL, আমরা দেখতে পাচ্ছি এটি উভয় থেকে মোট আনুমানিক সারি যুক্ত করেছে কনটেস্টেশন অপারেটরের জন্য অনুমানের সাথে প্রশ্নগুলি আসে।

উপরের আমার উদাহরণে, প্রতিটি অংশের জন্য সারিগুলির আনুমানিক সংখ্যা UNION ALL.8 66.৮৯27।, যা যখন যোগফল হয় ১৩৩.8585৫ সমান, যা আমরা কনকনেটেশন অপারেটরের জন্য সারিগুলির আনুমানিক সংখ্যার জন্য দেখতে পাই।

উপরের ইউনিয়ন ক্যোয়ারির জন্য প্রকৃত বাস্তবায়ন পরিকল্পনাটি দেখে মনে হচ্ছে:

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

আপনি "আনুমানিক" বনাম "আসল" সারিগুলির সংখ্যা দেখতে পারেন। আমার ক্ষেত্রে, দুটি হ্যাশ ম্যাচ অপারেটরদের দ্বারা ফিরে আসা "আনুমানিক" সারি সংযুক্ত করা কনকন্টেশন অপারেটরের দেখানো পরিমাণের সমান।

পল হোয়াইটের পোস্টে আপনি যেভাবে আপনার প্রশ্নের বিবরণ দেখিয়েছেন সে অনুযায়ী আমি 23৩৩ টি ট্রেস থেকে আউটপুট নেওয়ার চেষ্টা করব। অথবা, আপনি ব্যবহার করার চেষ্টা করুন পারে OPTION (QUERYTRACEON 9481)ক্যোয়ারী করা ফিরে সংস্করণ 70 সিই প্রত্যাবর্তন যদি যে "সংশোধন করা হয়েছে" বিষয়টি দেখতে।


1
ধন্যবাদ। আমি অবশ্যই দেখেছি "যুক্তিযুক্ত হওয়া দুটি ফলাফলের সাথে যোগ দেওয়ার পরিসংখ্যানের অভাবের আশেপাশের কারণগুলি" পরবর্তী যোগদান বা সংহতকরণের (যা ইউনিয়নের পরে ঘটে) বড় প্রভাব ফেলে। এসকিউএল ২০১৪ আসলে আমার অভিজ্ঞতায় এসকিউএল ২০১২ এর চেয়ে ভাল এটি পরিচালনা করে। এখানে আমি অতীতে ব্যবহার করেছি এমন একটি সাধারণ পরীক্ষার স্ক্রিপ্ট: উদাহরণস্বরূপ: gist.github.com/anonymous/1497112d8b25ab8fb782a04569959c68 তবে, আমি মনে করি না যে কোন কনটেকটনেশন অপারেটরের মান সংযোজন সম্পর্কিত একই ধরণের তথ্যের প্রয়োজন হবে প্রয়োজন হতে পারে.
জেফ প্যাটারসন

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