ইনলাইন ভিউ এবং উইথ ক্লজের মধ্যে পার্থক্য?


9

ইনলাইন দর্শনগুলি আপনাকে একটি সাবকিউরি থেকে চয়ন করতে অনুমতি দেয় যেন এটি কোনও আলাদা টেবিল:

SELECT
    *
FROM /* Selecting from a query instead of table */
    (
        SELECT
            c1
        FROM
            t1
        WHERE
            c1 > 0
    ) a
WHERE
    a.c1 < 50;

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

এটা কি ভুল ধারণা? এগুলির মধ্যে কি কোনও প্রযুক্তিগত / পারফরম্যান্সের পার্থক্য রয়েছে?


5
স্ট্যান্ডার্ড এসকিউএল থেকে প্রাপ্ত "অফিসিয়াল" নামগুলি হ'ল ডেরিভড টেবিল (যা ওরাকল নামগুলি ইনলাইন ভিউ করে ) এবং সাধারণ সারণী এক্সপ্রেশন (= WITH...)। আপনি প্রতিটি
ডাইরিভড টেবিলকে

উত্তর:


8

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

  1. WITH রিকার্সিভ সাবকিউরিসগুলি তৈরি করতে, ইনলাইন ভিউ-নোট (যতদূর আমি জানি এটিই সমস্ত আরডিবিএমএসের জন্য যা সিটিই সমর্থন করে) ব্যবহার করতে পারে
  2. ধারাটিতে সাবকিউরিটি WITHসম্ভবত শারীরিকভাবে প্রথমে কার্যকর করা হয়; অনেক ক্ষেত্রে, WITHএবং ইনলাইন ভিউয়ের মধ্যে নির্বাচন করা বিভিন্ন কার্যকরকরণ পরিকল্পনাগুলি বেছে নিতে অপ্টিমাইজার করে তোলে (আমার ধারণা এটি বিক্রেতার নির্দিষ্ট, সম্ভবত এমনকি সংস্করণ নির্দিষ্ট)।
  3. সাবকিউরিটি WITHঅস্থায়ী টেবিল হিসাবে রূপায়িত করা যেতে পারে (অন্য কোনও বিক্রেতা তবে ওরাকল এই বৈশিষ্ট্যটি সমর্থন করে কিনা আমি জানি না)।
  4. সাবকিউরিটি WITHএকাধিকবার, অন্যান্য সাবকোয়রিতে এবং মূল ক্যোয়ারিতে (বেশিরভাগ আরডিবিএমএসের ক্ষেত্রে সত্য) উল্লেখ করা যেতে পারে।

মাইএসকিউএল (সর্বনিম্ন সর্বশেষতম মারিয়াডিবি সংস্করণ) উদ্ভূত সারণীগুলি তৈরি করতে পারে (এবং এমনকি সূচিগুলিও যুক্ত করে)।
ypercubeᵀᴹ

3
আমি এটিকে যুক্ত করতে চাই, পার্শ্ব সুবিধা হিসাবে, সিটিই ব্যবহার করা সাধারণত মানুষের পক্ষে আরও বেশি পঠনযোগ্য।
জোশি বদিও

@ জোশিবিডিও: ব্যক্তিগতভাবে আমি আপনার সাথে একমত, তবে পঠনযোগ্যতা একটি বিষয়গত বিষয়। আমি বরং এটি উল্লেখ করা এড়াতে চাই
a1ex07

এছাড়াও, একটি সিটিই পূর্বে ঘোষিত সিটিইর উল্লেখ করতে পারে reference একটি উত্পন্ন টেবিল LATERALব্যবহার করা না হলে একই স্তরে পূর্বের ঘোষিত উত্সযুক্ত টেবিলটিকে উল্লেখ করতে পারে না ।
লেনার্ট

8

অন্যান্য উত্তরগুলি সিনট্যাক্সের পার্থক্যগুলি বেশ ভালভাবে কভার করে তাই আমি এর মধ্যে যাব না। পরিবর্তে এই উত্তরটি কেবল ওরাকলে সম্পাদন করবে।

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

প্রথমে একটি প্রাথমিক কী সহ একটি টেবিল তৈরি করুন যাতে 1 থেকে 10000 পর্যন্ত পূর্ণসংখ্যা থাকে:

CREATE TABLE N_10000 (NUM_ID INTEGER NOT NULL, PRIMARY KEY (NUM_ID));

INSERT /*+APPEND */ INTO N_10000
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 10000
ORDER BY LEVEL;

COMMIT;

দুটি উত্সযুক্ত টেবিল ব্যবহার করে নিম্নলিখিত কোয়েরি বিবেচনা করুন:

SELECT t1.NUM_ID
FROM 
(
  SELECT n1.NUM_ID
  FROM N_10000 n1
  CROSS JOIN N_10000 n2
) t1
LEFT OUTER JOIN 
(
  SELECT n1.NUM_ID
  FROM N_10000 n1
  CROSS JOIN N_10000 n2
) t2 ON t1.NUM_ID = t2.NUM_ID
WHERE t1.NUM_ID <= 0;

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

ভাল পরিকল্পনা

আমি নিজেকে পুনরাবৃত্তি করতে পছন্দ করি না, সুতরাং আসুন আমরা একটি সিটিই দিয়ে একই ক্যোয়ারী চেষ্টা করি:

WITH N_10000_CTE AS (
  SELECT n1.NUM_ID
  FROM N_10000 n1
  CROSS JOIN N_10000 n2
)
SELECT t1.NUM_ID
FROM N_10000_CTE t1
LEFT JOIN N_10000_CTE t2 ON t1.NUM_ID = t2.NUM_ID
WHERE t1.NUM_ID <= 0;

পরিকল্পনাটি এখানে:

খারাপ পরিকল্পনা

এটা সত্যিই খারাপ পরিকল্পনা। সূচকটি ব্যবহার করার পরিবর্তে, ওরাকল 10000 এক্স 10000 = 100000000 সারিগুলিকে কেবল টেম্প টেবিলের মধ্যে অবশেষে 0 টি সারি ফিরিয়ে আনতে সক্ষম করে। এই পরিকল্পনার ব্যয় 6 এম এর কাছাকাছি যা অন্যান্য প্রশ্নের তুলনায় অনেক বেশি। ক্যোয়ারীটি আমার মেশিনে শেষ হতে 68 সেকেন্ড সময় নিয়েছে।

নোট করুন যে টেম্প টেবিল স্পেসে পর্যাপ্ত মেমরি বা খালি জায়গা না থাকলে ক্যোয়ারীটি ব্যর্থ হতে পারে।

INLINEসিটিই বাস্তবায়ন থেকে অপ্টিমাইজারটিকে অস্বীকার করার জন্য আমি অনিবন্ধিত ইঙ্গিতটি ব্যবহার করতে পারি :

WITH N_10000_CTE AS (
  SELECT /*+ INLINE */ n1.NUM_ID
  FROM N_10000 n1
  CROSS JOIN N_10000 n2
)
SELECT t1.NUM_ID
FROM N_10000_CTE t1
LEFT JOIN N_10000_CTE t2 ON t1.NUM_ID = t2.NUM_ID
WHERE t1.NUM_ID <= 0;

এই ক্যোয়ারী সূচকটি ব্যবহার করতে সক্ষম এবং প্রায় তাত্ক্ষণিকভাবে শেষ হয়। ক্যোয়ারির ব্যয় আগের মতোই, ১১। সুতরাং দ্বিতীয় কোয়েরির জন্য, ওরাকল দ্বারা ব্যবহৃত হিউরিস্টিকটির ফলস্বরূপ এটি 11 এর আনুমানিক ব্যয় সহ একটি কোয়েরির পরিবর্তে 6 এম ব্যয় করে একটি কোয়েরিকে বেছে নিয়েছিল।


1

এসকিউএল সার্ভারের জন্য, WITH CTEঅস্থায়ী নামের ফলাফল সেটটি নির্দিষ্ট করে তবে কেবল প্রথমটির জন্য এটি প্রয়োজনীয় CTE। অর্থাত

WITH CTE AS (SELECT .... FROM), 
CTE2 AS (SELECT .... FROM)

SELECT CTE.Column, CTE2.Column
FROM CTE
INNER JOIN CTE2 on CTE.Column = CTE2.Column

তবে এটি কোনও সাবকোয়ারি বা পারস্পরিক সম্পর্কযুক্ত subquery নয়। এসটিউএল সার্ভারে সাব-কোয়েরিতে আপনি যা করতে পারবেন না এমন কোনও সিটিইতে আপনি কিছু করতে পারেন যেমন কোনও সিটিইতে উল্লিখিত টেবিলগুলি আপডেট করুন। এখানে একটি সিটিই দিয়ে একটি সারণী আপডেট করার উদাহরণ

একটি subquery কিছু হবে

SELECT
   C1,
   (SELECT C2 FROM SomeTable) as C2
FROM Table

অথবা একটি সম্পর্কিত সম্পর্কযুক্ত সাব-কোয়েরি হ'ল আপনি যদি আপনার ওপিতে সরবরাহ করেছেন তবে আপনি যদি a.c1 এর উপর ভিত্তি করে আপনার ফলাফলগুলিকে রেফারেন্স / যোগদান / সীমাবদ্ধ করতে চান।

সুতরাং, তারা অবশ্যই একই জিনিস নয়, যদিও অনেক ক্ষেত্রে আপনি একই ফলাফল অর্জনের জন্য এই পদ্ধতিগুলির একটি বা একাধিক ব্যবহার করতে পারেন। এটি কেবলমাত্র শেষ ফলাফলটি তার উপর নির্ভর করে।


1

withঅরাকলে ক্লজ এবং সাবকিউয়ের মধ্যে প্রধান পার্থক্য হ'ল আপনি একাধিকবার ক্লজের মধ্যে একটি প্রশ্নটি উল্লেখ করতে পারেন। তারপরে আপনি এটির সাহায্যে কিছু অপ্টিমাইজেশন করতে পারেন যেমন materializeইঙ্গিতটি ব্যবহার করে এটি একটি টেম্প টেবিলে পরিণত করা । আপনি এটিকে withক্লজের অভ্যন্তরে উল্লেখ করে পুনরাবৃত্ত অনুসন্ধানগুলিও করতে পারেন । আপনি কোনও ইনলাইন ভিউ দিয়ে এটি করতে পারবেন না।

আরও তথ্য এখানে এবং এখানে পাওয়া যাবে


সাধারণ বস্তুগতভাবে ইঙ্গিত প্রয়োজন হয় না। ডিফল্টরূপে ওরাকল অপটিমাইজার সিটিই বাস্তবায়িত করার জন্য অর্থবোধ করে কিনা তা স্থির করে - তবে আপনি ইঙ্গিত MATERIALIZEসম্মানের সাথে অপ্টিমাইজার মূল্যায়ন ওভাররাইট করতে পারেন । INLINEবিপরীত জন্য।
ওয়ার্নফ্রিড ডমসচাইট

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

0

আপনার কেবল এসকিউএল সার্ভারে সিটিইর সাথে সতর্কতা অবলম্বন করা উচিত কেবলমাত্র ওরাকল নয়, এমন কিছু ক্ষেত্রে রয়েছে যেগুলি সাবকিউয়ের সাথে তুলনা করে সিটিই ব্যবহার করে, ক্রস অ্যাপ্লিকেশন ইত্যাদির ক্ষেত্রে কোয়েরিগুলি আরও খারাপ কাজ করে etc.

সর্বদা ভালো লেগেছে যে কোনটি সবচেয়ে ভাল কাজ করে তা নির্ধারণ করার জন্য বিভিন্ন লোড শর্তে যে কোনও ক্যোয়ারী পরীক্ষা করা গুরুত্বপূর্ণ।

ওরাকল সহ @ এসসিমন এর অনুরূপ, কখনও কখনও এমএস এসকিউএল সার্ভার সূচক ব্যবহারের ক্ষেত্রে আপনার প্রত্যাশা মতো করে না doesn't

আপনি যদি একই ডেটা একাধিকবার ব্যবহার করতে যাচ্ছেন তবে সিটিই আরও কার্যকর হতে পারে, আপনি যদি কেবল একবার এটি ব্যবহার করেন তবে প্রায়শই বড় ডেটাসেটগুলিতে একটি subquery দ্রুত হয়।

যেমন (আমার subquery) থেকে * নির্বাচন করুন অন্য কিছু যোগ দিন ...

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