আমি কি এসএসকিউএল সার্ভারে নির্ভরশীল বাইরের সাথে বাসা বাঁধতে পারি?


9

আমি এটি সম্পর্কে মিশ্র তথ্য শুনেছি এবং একটি প্রমিত বা বিশেষজ্ঞের মতামতের জন্য আশা করছি।

আমার যদি একাধিক LEFT OUTER JOINগুলি থাকে তবে প্রতিটি শেষের উপর নির্ভর করে বাসা বাঁধাই ভাল?

একটি কল্পিত উদাহরণ স্বরূপ, JOINকরতে MyParentউপর নির্ভর করে JOINকরা MyChild: http://sqlfiddle.com/#!3/31022/5

SELECT
    {columns}
FROM
    MyGrandChild AS gc
LEFT OUTER JOIN
    MyChild AS c
        ON c.[Id] = gc.[ParentId]
LEFT OUTER JOIN
    MyParent AS p
        ON p.[id] = c.[ParentId]

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

Http://sqlfiddle.com/#!3/31022/7 এর সাথে তুলনা করুন

SELECT
    {columns}
FROM
    MyGrandChild AS gc
LEFT OUTER JOIN
    (
    MyChild AS c            
    LEFT OUTER JOIN
        MyParent AS p
            ON p.[id] = c.[ParentId]
    )
    ON c.[Id] = gc.[ParentId]

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

যেমন উপরে দেখানো হয়েছে এসএস 2 কে 8 এ বিভিন্ন ক্যোয়ারী পরিকল্পনা তৈরি করে


আমি নেস্টেড যোগদানগুলিতে ব্যবহার করতে পছন্দ করি: michaeljswart.com/2012/09/When-i-use-nested-joins যদিও এটি স্টাইলের বিষয় হতে পারে।
মাইকেল জে স্বার্ট

@ মিশেলজেয়ার্ট আপনার ব্লগটি কেবল তখন নির্ভর করে যখন আলোচিত হয় আলোচনা করা JOINহয়INNER JOIN
ম্যাথু

1
আপনি কীভাবে "আরও ভাল" সংজ্ঞা দিতে চান? ব্যক্তিগতভাবে, আমি পড়ার পক্ষে প্রথমটি আরও সহজ মনে করি - আমার মন সম্পর্কের বিপরীত প্রবণতার চেষ্টা করে না। পর পর ON ... ONদু'বার (প্রথম বন্ধনী থাকা বা না হওয়া) খুব বিভ্রান্তিকর।
অ্যারন বারট্র্যান্ড

4
যখন আমি কিছু করার দুটি পদ্ধতির মধ্যে পারফরম্যান্সের কোনও পার্থক্য খুঁজে না পেয়েছি, তখন পরবর্তী প্রশ্নটি আমি নিজেকে জিজ্ঞাসা করি: যদি আমি আজ বাসে ধাক্কা খেয়েছি বা আজ রাতে লটারি জিতেছি, তবে যে সংস্করণটি আমার কোডটি আগামীকাল গ্রহণ করবে তার দ্বারা খুব সহজেই বোঝা যাবে এবং বজায় রাখা হবে ?
অ্যারন বার্ট্র্যান্ড

1
use planইঙ্গিতটি কাজ করে কিন্তু তদ্বিপরীত নয় প্রথম থেকে দ্বিতীয় ক্যোয়ারী পরিকল্পনা রোপণ।
মার্টিন স্মিথ

উত্তর:


3

এটি একেবারে কোনও প্রাসঙ্গিক উত্তর নয় তবে আমি লক্ষ্য করেছি যে এসকিউএল ফিডলে দেখানো নেস্টেড লুপগুলি অনুসন্ধানের পরিকল্পনাগুলির জন্য USE PLANইঙ্গিতটি ব্যবহার করে কোয়েরি 2 থেকে ক্যোয়ারি 1 তে পরিকল্পনাটি প্রয়োগ করা সম্ভব হয়েছিল তবে বিপরীত ক্রিয়াকলাপের চেষ্টা ব্যর্থ হয়ে ব্যর্থ হয়েছে with

ক্যোয়ারী প্রসেসর ক্যোয়ারী প্ল্যান তৈরি করতে পারেনি কারণ ইউএসই প্ল্যান ইঙ্গিতটিতে এমন পরিকল্পনা রয়েছে যা কোয়েরির জন্য বৈধ হওয়ার জন্য যাচাই করা যায়নি। ব্যবহারের পরিকল্পনা ইঙ্গিতটি সরান বা প্রতিস্থাপন করুন। সফল পরিকল্পনার জোর সম্ভাবনার সর্বোত্তম সম্ভাবনার জন্য, যাচাই করুন যে ইউএসই প্ল্যান ইঙ্গিততে সরবরাহ করা পরিকল্পনাটি একই প্রশ্নের জন্য এসকিউএল সার্ভার দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছে।

অপ্টিমাইজার রূপান্তর নিয়ম অক্ষম করা ReorderLOJN আগের সফল পরিকল্পনার ইঙ্গিতটিকে সফল হতে বাধা দেয়।

আরও বেশি পরিমাণে ডেটা নিয়ে পরীক্ষা করে দেখা যায় যে এসকিউএল সার্ভার অবশ্যই প্রাকৃতিকভাবে রূপান্তর (A LOJ B) LOJ Cকরতে সক্ষম A LOJ (B LOJ C)তবে এটির বিপরীতটি সত্য বলে আমি কোনও প্রমাণ পাইনি।

একটি খুব সঙ্কল্পিত কেস যেখানে প্রথম ক্যোয়ারী দ্বিতীয়টির চেয়ে ভাল সম্পাদন করে

DROP TABLE  MyGrandChild , MyChild,  MyParent

CREATE TABLE MyParent
(Id int)

CREATE TABLE MyChild
(Id int PRIMARY KEY
,ParentId int,
Filler char(8000) NULL)

CREATE TABLE MyGrandChild
(Id int
,ParentId int)

INSERT INTO MyChild
                      (Id, ParentId)
SELECT TOP (100000) ROW_NUMBER() OVER (ORDER BY @@SPID),
                     ROW_NUMBER() OVER (ORDER BY @@SPID)    
FROM master..spt_values  v1, master..spt_values                  

INSERT INTO MyGrandChild
                      (Id, ParentId)
OUTPUT INSERTED.Id INTO MyParent
SELECT TOP (3000) Id, Id AS ParentId
FROM MyChild
ORDER BY Id

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

SELECT gc.Id       AS gcId,
       gc.ParentId AS gcpId,
       c.Id        AS cId,
       c.ParentId  AS cpId,
       p.Id        AS pId
FROM   MyGrandChild AS gc
       LEFT OUTER JOIN MyChild AS c
         ON c.[Id] = gc.[ParentId]
       LEFT OUTER JOIN MyParent AS p
         ON p.[Id] = c.[ParentId]

SELECT gc.Id       AS gcId,
       gc.ParentId AS gcpId,
       c.Id        AS cId,
       c.ParentId  AS cpId,
       p.Id        AS pId
FROM   MyGrandChild AS gc
       LEFT OUTER JOIN( MyChild AS c
                        LEFT OUTER JOIN MyParent AS p
                          ON p.[Id] = c.[ParentId])
         ON c.[Id] = gc.[ParentId] 

যা পরিকল্পনা দেয়

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

আমার জন্য ক্যোয়ারি 1 এর ক্যোয়ারি 2 এর জন্য 108 এমএস বনাম 1,163 এমএসের একটি অতিবাহিত সময় ছিল।

প্রশ্ন ঘ

Table 'Worktable'. Scan count 0, logical reads 0 
Table 'MyChild'. Scan count 0, logical reads 9196
Table 'MyGrandChild'. Scan count 1, logical reads 7
Table 'MyParent'. Scan count 1, logical reads 5

প্রশ্ন 2

Table 'MyParent'. Scan count 1, logical reads 15000
Table 'MyChild'. Scan count 0, logical reads 9000 
Table 'MyGrandChild'. Scan count 1, logical reads 7

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

ক্যোরি 2 আরও ভাল সঞ্চালন করে এমন পাল্টা উদাহরণ দিয়ে আসা সম্পূর্ণভাবে সম্ভব। উভয়ই চেষ্টা করে দেখুন এবং কার্যকর করার পরিকল্পনাগুলি দেখুন।


-1

"নেস্টেড জয়েন" নামে আর কোনও JOIN প্রকার নেই। এটি JOIN লেখার অন্য একটি প্রকরণ যা পাঠযোগ্যতার সুবিধার্থে হতে পারে। আপনি এগুলি কেবল বুঝতে উদ্দেশ্য হিসাবে "সাব কোয়েরি" হিসাবে দেখতে পারেন।

আপনি যদি কোড পাঠযোগ্যতার বিষয়ে বেশি উদ্বেগ প্রকাশ করেন তবে আমার গ্রহণযোগ্যতাটি হ'ল, এটি তাদের পছন্দসই যা তারা পছন্দনীয়।

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

প্রকৃতপক্ষে, কল্পনা করুন যে এসকিউএল সার্ভার দ্বিতীয় অংশটি করার সিদ্ধান্ত নিলে দ্বিতীয় উপায়ে "নেস্টেড জয়েন", "মাইচাইল্ড এএস সি লেফট আউটয়ার মাইপারেন্ট এএস পি তে যুক্ত হন। [আইডি] = সি। [প্যারেন্টআইড]" এবং এই টেবিলটি ঘটে সারণীগুলি যা পরের বাম যোগে বাতিল করতে চলেছে। সেক্ষেত্রে এসকিউএল সার্ভার এই দু'জনকে যুক্ত করে এবং ফলাফলটি পরবর্তী জোনে পাস করার জন্য অপ্রয়োজনীয় সংস্থান ব্যয় করেছে।

আপনি অনুরূপ জিজ্ঞাসা এবং যথাযথ উত্তর এখানে দেখতে পারেন। 'নেস্টেড জয়েন' সিনট্যাক্স বোঝা


1
তাহলে কেন তারা FORCE JOIN ORDERইঙ্গিতটি ব্যবহার না করেই বিভিন্ন প্রশ্নের পরিকল্পনা তৈরি করে ?
ম্যাথু

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