INNER যোগদানের সিনট্যাক্স বনাম কোয়েরি ফলাফলের ভিতরে নেস্ট করেছে


10

TLDR; আপনি যদি দুটি কার্যনির্বাহী পরিকল্পনাগুলি দেখে থাকেন তবে এর থেকে সহজ উত্তর কি আরও ভাল? আমি উদ্দেশ্যমূলকভাবে সূচি তৈরি করি নি তাই কী ঘটছে তা দেখতে এটি আরও সহজ।

আমার আগের প্রশ্নটি অনুসরণ করে যেখানে আমরা বিভিন্ন যোগদানের শৈলীর মধ্যে ক্যোয়ারি পারফরম্যান্সের পার্থক্য পেয়েছি (যেমন নেস্টেড বনাম প্রথাগত), আমি বুঝতে পেরেছি যে নেস্টেড সিনট্যাক্সও কোয়েরির আচরণকে পরিবর্তন করে if নিম্নলিখিত 2 টি প্রশ্ন বিবেচনা করুন।

SELECT  a.*, m.*, n.*
FROM    dbo.Autos a
LEFT JOIN dbo.Models m
  JOIN dbo.Manufacturers n  -- <-- Nested INNER JOIN
  ON n.ManufacturerID = m.ManufacturerID
ON m.ModelID = a.ModelID

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

মডেল টেবিলে নেই এমন একটি মডেলআইডি সহ একটি স্বয়ংক্রিয় সারি অন্তর্ভুক্ত করার জন্য এটি উত্পাদনকারীদের যোগদান করতে হবে না।

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

Traditionalতিহ্যবাহী বাক্য গঠন ব্যবহার করে, আমাদের যেমন উত্পাদনগুলি তেমন একটি বাহ্যিক সংযুক্তিতে পরিবর্তিত করতে হবে ... তবে এটি ক্যোয়ারী পরিকল্পনাকে পরিবর্তন করে।

SELECT a.*, m.*, n.*
FROM dbo.Autos a
LEFT JOIN dbo.Models m
ON m.ModelID = a.ModelID
LEFT JOIN dbo.Manufacturers n -- <-- Now LEFT OUTER JOIN
ON n.ManufacturerID = m.ManufacturerID

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

উত্তর:


12

আপনি যদি দুটি কার্যনির্বাহী পরিকল্পনাগুলি দেখে থাকেন তবে এর থেকে সহজ উত্তর কি আরও ভাল? আমি উদ্দেশ্যমূলকভাবে সূচি তৈরি করি নি তাই কী ঘটছে তা দেখতে এটি আরও সহজ।

দ্বিতীয় পরিকল্পনার একটি কম অনুমান ব্যয় রয়েছে, সুতরাং সেই সীমিত অর্থে এটি 'আরও ভাল'।

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

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

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

আমি বুঝতে পেরেছি যে নেস্টেড সিনট্যাক্সও কোয়েরির আচরণকে পরিবর্তন করে।

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

বন্ধনী ব্যবহার করে একই এএনএসআই সিনট্যাক্স ব্যবহার করে ক্যোয়ারী লেখা যেতে পারে :

SELECT
    A.*,
    M.*,
    N.* 
FROM dbo.Autos AS A
LEFT JOIN
(
    dbo.Manufacturers AS N
    JOIN dbo.Models AS M
        ON M.ManufacturerID = N.ManufacturerID
) ON M.ModelID = A.ModelID;

এই ফর্মটি স্পষ্টভাবে দেখায় যে যৌক্তিক প্রয়োজন বাম দিক থেকে যোগদানের হয় Autosকরার ফল ভেতরের যোগদান Manufacturersকরতে Models। Alচ্ছিক বন্ধনী ছাড়ার ফলে আপনি যে ফর্মটি 'নেস্টেড' বলেছেন সেটিকে দেয়:

SELECT
    A.*,
    M.*,
    N.* 
FROM dbo.Autos AS A
LEFT JOIN dbo.Manufacturers AS N
JOIN dbo.Models AS M
    ON M.ManufacturerID = N.ManufacturerID
    ON M.ModelID = A.ModelID;

এটি আলাদা বাক্য গঠন নয় - এটি কেবল optionচ্ছিক বন্ধনী বাদ দিচ্ছে এবং কিছুটা পুনরায় ফর্ম্যাট করা।

মার্টিন যেমন উল্লেখ করেছেন, এক্ষেত্রে অভ্যন্তরীণ যোগ দিয়ে ডান বাহ্যিক সংযুক্তি ব্যবহার করে যৌক্তিক প্রয়োজনীয়তা প্রকাশ করাও সম্ভব:

SELECT
    A.*,
    M.*,
    N.* 
FROM dbo.Manufacturers AS N
JOIN dbo.Models AS M
    ON M.ManufacturerID = N.ManufacturerID
RIGHT JOIN dbo.Autos AS A
    ON A.ModelID = M.ModelID;

উপরের তিনটি ক্যোয়ারী ফর্ম একই এএনএসআই সংশ্লেষে যুক্ত হয়। তিনটিই সরবরাহ করা ডেটা সেট সহ একই শারীরিক সম্পাদন পরিকল্পনা উত্পাদন করে:

সাধারণ বাস্তবায়ন পরিকল্পনা

আপনার আগের প্রশ্নের আমার উত্তরে আমি যেমন উল্লেখ করেছি, ঠিক একই যৌক্তিক প্রয়োজনীয়তা প্রকাশ করে এমন প্রশ্নগুলি সর্বদা একই কার্যকরকরণ পরিকল্পনা তৈরি করে না। আপনি কোন যৌক্তিক ক্যোয়ারী ফর্মটি ব্যবহার করতে পছন্দ করেন তা মূলত শৈলীর প্রশ্ন। একটি নির্দিষ্ট স্টাইল এবং সাধারণভাবে 'আরও ভাল' ক্যোয়ারী পরিকল্পনার মধ্যে কোনও সম্পর্ক নেই। আমি যদি নতুন ক্যোয়ারীটি আসলভাবে যুক্তিযুক্তভাবে আসলটির মতো না হয় তবে একটি বিশেষ পরিকল্পনা পাওয়ার জন্য কোনও ক্যোয়ারির পুনরায় লেখার বিরুদ্ধে আমি সাধারণত পরামর্শ দেব।

এসকিউএল স্ট্যান্ডার্ডটি FROMক্লজ সাবকিউরিয়াকেও মঞ্জুরি দেয় , সুতরাং একই ক্যোয়ারী স্পেসিফিকেশন লেখার আরও একটি উপায় হ'ল:

SELECT * 
FROM dbo.Autos AS A
LEFT JOIN
(
    SELECT
        N.ManufacturerID,
        ManufacturerName = N.Name,
        M.ModelID,
        ModelName = M.Name
    FROM dbo.Manufacturers AS N
    JOIN dbo.Models AS M
        ON M.ManufacturerID = N.ManufacturerID
) AS R1
    ON R1.ModelID = A.ModelID;

Traditionalতিহ্যবাহী বাক্য গঠনটি ব্যবহার করে, আমাদের যুক্তটিকে `নির্মাতাগুলিতে একটি বহিরাগত যোগদান করতে হবে, ঠিক তেমন ... তবে এটি ক্যোয়ারি প্ল্যানে পরিবর্তন করে।

এটি সম্ভবত ক্যোয়ারী, যে ক্ষেত্রে এটা টেকনিক্যালি একটি বৈধ বিকল্প নয় অর্থ পরিবর্তন (কিন্তু দেখতে ypercube এর মন্তব্য আপনার প্রশ্নে)।

এএনএসআই জোড় সিনট্যাক্সের (alচ্ছিক) প্রথম বন্ধনীগুলি আরও জটিলভাবে যুক্ত হওয়ার প্রয়োজনীয়তার জন্য যথাযথভাবে এখানে রয়েছে, সুতরাং যেখানে প্রয়োজন সেখানে সেগুলি ব্যবহার করতে আপনার ভয় পাবেন না।

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