সিটিই এবং সাবকোয়্যারির মধ্যে পার্থক্য?


143

এই পোস্ট থেকে নিম্নলিখিত পদ্ধতিতে ROW_NUMBER কীভাবে ব্যবহার করবেন?

উত্তরগুলির দুটি সংস্করণ রয়েছে যেখানে একটি একই সমস্যা সমাধানের জন্য sub-queryএকটি ব্যবহার করে এবং অন্যটি ব্যবহার করে CTE

এখন, CTE (Common Table Expression)একটি 'সাব-ক্যুয়ারী'-এর ওভার ব্যবহার করে কী সুবিধা হবে (সুতরাং, ক্যোয়ারীটি আসলে কী করছে তা আরও পাঠযোগ্য )

CTEওভার ব্যবহারের একমাত্র সুবিধা sub-selectহ'ল আমি আসলে এটির নাম রাখতে পারি sub-queryযখন কোনও সিটিই একটি সাধারণ (অ-পুনরাবৃত্ত) সিটিই হিসাবে ব্যবহৃত হয় তখন সেই দুজনের মধ্যে কি অন্য কোনও পার্থক্য রয়েছে ?


ভাল আলোচনার সাথে ডেরিভেটিভ প্রশ্ন: stackoverflow.com/q/11169550/781695
ব্যবহারকারী

7
আইএমও, যে কেউ সিটিই মনে করে কম পাঠযোগ্য যে ইন্টারভিউভেন সাবকুইরিজের একটি বিশাল ব্লকটি এন্টারপ্রাইজ ডেটা ম্যানেজমেন্ট সিস্টেমের বেশিরভাগ অংশে বিভ্রান্ত করত দাঁত-আকৃতির প্রশ্নগুলির আবর্জনার স্তূপ দেখতে পায়নি। বৃহত্তর, তুচ্ছ তাত্পর্যপূর্ণ প্রশ্নগুলি সাধারণত সাবকোয়ারির চেয়ে পরে বা নতুন চোখের দ্বারা পড়া নাটকীয়ভাবে সহজ এবং কমপক্ষে পোস্টগ্র্যাসের ক্ষেত্রে অনেক ক্ষেত্রে ম্যাজিকভাবে আরও ভাল অভিনয় করা হয় । ([কারণে আমি এখনো বুঝতে [(আছে stackoverflow.com/questions/33731068/... ), বিপরীত সম্ভাবনা বেশি মনে হয়।)
zxq9

উত্তর:


102

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

ইন জেনারেল ; একটি সিটিই পুনরাবৃত্তভাবে ব্যবহার করা যেতে পারে; একটি সাব-কোয়েরি করতে পারে না। এটি তাদের গাছের কাঠামোর সাথে বিশেষভাবে উপযুক্ত করে তোলে।


1
দুঃখিত, আমার প্রশ্নে আমার আরও পরিষ্কার হওয়া উচিত ছিল। সিটিই লাইক সাবকোয়ারি ব্যবহৃত হয় সেই প্রসঙ্গে সিটিই এবং সাবকিউয়ের মধ্যে পার্থক্য কী হবে?
নাচ

2
@ মার্ক গ্র্যাভেল: যদিও আমরা প্রোফাইলারের আচরণের গ্যারান্টিযুক্ত না হওয়ায়, সিটিইর আচরণের তুলনায়, যা (মূল্যায়নের ক্ষেত্রে) আমরা তার থেকেও বেশি কিছু করতে পারি।
ক্যাস্পার ওয়ান

1
নিশ্চিত নয় যে এই বিবৃতিটি সিটিএস এবং সাবকোয়ারির পার্থক্যের দিকে তাকিয়ে লোকদের জন্য কতটা অর্থবোধ করে - A CTE can be used recursively; a sub-query cannot। একটি উদাহরণ দুর্দান্ত ছিল।
অনিকেত ঠাকুর

88

সাধারণ টেবিল এক্সপ্রেশন (যখন এটি পুনরাবৃত্ত অনুসন্ধানগুলির জন্য ব্যবহার না করে ) এর প্রধান সুবিধা হ'ল এনক্যাপসুলেশন, আপনি যে জায়গাতে এটি ব্যবহার করতে চান তা সাব-কোয়েরি ঘোষণা করার পরিবর্তে আপনি একবার এটি সংজ্ঞায়িত করতে সক্ষম হবেন, তবে একাধিক উল্লেখ রয়েছে এটা।

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


"কোনও সিটিইকে টেম্প টেবিল ভেরিয়েবল হিসাবে ভাবেন" এর অর্থ কি সিটিই ডিস্কে বা মেমরিতে সঞ্চয় করা আছে?
নাচ

সংজ্ঞা অনুসারে আপনি একাধিক ক্যোয়ারিতে সিটিই বা সাবকিউরি ব্যবহার করতে পারবেন না। আমি নিশ্চিত যে অপ্টিমাইজারটি সাবকিউরিটি একইভাবে হ্যান্ডল করে যেভাবে এটি সিটিই হ্যান্ডেল করবে (ফলাফলটি 1 বারের মধ্যে একবারে কতবার ব্যবহৃত হয় নির্বিশেষে, সেটাকে একবার নির্ধারণ করে)
অ্যালেক্সকিউস

@ অ্যালেক্সকিউজ: আমি মনে করি আমি সিটিইর প্রসঙ্গটি যথেষ্ট পরিমাণে ব্যাখ্যা করেছি, তবে আরও স্পষ্ট করার জন্য আমি আরও যুক্ত করেছি।
ক্যাস্পার ওয়ান

@ অ্যালেক্সকিউজ: সিটিই বা সাবকোয়ারি একাধিক জায়গায় ব্যবহার করা যেতে পারে এমন কোনও জড়িত বিষয়টিও নেই। যদিও সিটিই এবং অপ্টিমাইজারের মধ্যে পার্থক্যটি হ'ল সিটিইর আচরণের নিশ্চয়তা রয়েছে, তবে অপ্টিমাইজারের আচরণ নয়।
ক্যাস্পার ওয়ান

এবং আমি স্বীকার করব যে এমন কোনও প্রান্তের ঘটনা ঘটতে পারে যেখানে অপটিমাইজার চোকস এবং সাবকিউরিটি একাধিকবার মূল্যায়ন করা হয়, তবে আমি এর আগে যাইনি। তারপরে আবার, আমি যেখানেই পারি সিটিই ব্যবহার করি;)
অ্যালেক্সকুস

15

CTEএর পুনরাবৃত্তি জন্য সবচেয়ে দরকারী:

WITH hier(cnt) AS (
        SELECT  1
        UNION ALL
        SELECT  cnt + 1
        FROM    hier
        WHERE   cnt < @n
        )
SELECT  cnt
FROM    hier

ফিরে আসবে @nসারি (আপ 101)। ক্যালেন্ডার, ডামি রোসেটস ইত্যাদির জন্য দরকারী

এগুলি আরও পাঠযোগ্য (আমার মতে)।

এগুলি ছাড়াও CTEএর এবং subqueriesঅভিন্ন।


এমএসএসকিউএলে আপনার সাথে একটি সেমিকোলন (;) যুক্ত করার আগে, আদেশের ভিত্তিতে আপনি একটি ত্রুটি পাবেন। এটি হওয়া উচিত;WITH blabla AS ...)
ওবিনা ন্নেনানিয়া

2
@ ওবিন্ননেন্ন্য: কেবলমাত্র যদি এটি ব্যাচের প্রথম বিবৃতি না হয়। সেমিকোলন সঙ্গে আপনার বিবৃতি সসীম একটি ভাল ধারণা যাহাই হউক না কেন, যদিও SQL সার্ভার আগের চেয়ে অন্যান্য বর্তমান সংস্করণে এটি বলবত্ নেই WITH, MERGEএবং অনুরূপ
Quassnoi

10

একটি পার্থক্য যা উল্লেখ করা হয়নি তা হ'ল একটি ইউনিয়নের বিভিন্ন অংশে একটি সিটিই উল্লেখ করা যেতে পারে


8

আমি যদি কিছু মিস করছি না, আপনি কেবল সহজেই সিটিই এবং সাবকিউয়ের নাম রাখতে পারবেন।

আমার ধারণা মূল পার্থক্য হ'ল পাঠযোগ্যতা (আমি সিটিইকে আরও বেশি পঠনযোগ্য বলে মনে করি কারণ এটি আপনার সাবকিউরিটি মাঝখানে না করে সামনেকে সংজ্ঞায়িত করে)।

এবং যদি আপনাকে পুনরাবৃত্তি সহ কিছু করার দরকার হয় তবে আপনাকে subquery দিয়ে এটি করতে কিছুটা সমস্যা হতে হবে;)


1
আমি নিশ্চিত নই যে এখানে কোনও অ-নান্দনিক পার্থক্য রয়েছে (যদিও আমি আশা করি যে নির্দিষ্ট পরিস্থিতিতে কার্যকর করার পরিকল্পনায় সামান্য পার্থক্য থাকতে পারে)। আমাকে আলোকিত করার যত্ন?
অ্যালেক্সকুস

2
আপনি সিটিই-এর নাম রাখতে পারেন , তবে আপনি কেবল উপনাম সাব-কুইরি করতে পারেন । পার্থক্যটি হ'ল, আপনি একাধিক এলিয়াস দিয়ে সিটিই ব্যবহার করতে পারেন (সিএফ। সাবকিউরিয়াসগুলি সহ এটি করার কোনও উপায় আমি জানি না।
কিমিওট

7

একটি গুরুত্বপূর্ণ সত্য যেটি কেউ উল্লেখ করেনি তা হ'ল (কমপক্ষে পোস্টগ্রাগে), সিটিই হ'ল অপ্টিমাইজেশন বেড়া:

https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/

অর্থাৎ পুরো ক্যোয়ারী পরিকল্পনায় ভাঁজ না হয়ে এগুলি তাদের নিজস্ব পারমাণবিক ক্যোয়ারী হিসাবে বিবেচনা করা হবে। এর থেকে আরও ভাল ব্যাখ্যা দেওয়ার জন্য আমার কাছে দক্ষতার অভাব নেই, তবে আপনি যে স্কয়ার ব্যবহার করছেন তার সংস্করণটির জন্য শব্দার্থবিজ্ঞানগুলি পরীক্ষা করা উচিত; উন্নত ব্যবহারকারীদের জন্য, যদি আপনি ক্যোয়ারি পরিকল্পনাকারী নিয়ন্ত্রণে বিশেষজ্ঞ পর্যায়ে থাকেন তবে একটি অপ্টিমাইজেশন বেড়া তৈরি করতে সক্ষম হওয়া পারফরম্যান্সে সহায়তা করতে পারে; তবে 99% ক্ষেত্রে আপনার ক্যোয়ারী পরিকল্পনাকারীকে কী করা উচিত তা বলার চেষ্টা করা এড়ানো উচিত, কারণ আপনি যেটি দ্রুত বলে মনে করেন তা তত দ্রুততর হবে বলে মনে করেন তার চেয়ে খারাপ। :-)


6

অন্যের উত্তরে যুক্ত করা, আপনার যদি এক এবং একই উপশক্তিটি বেশ কয়েকবার ব্যবহৃত হয় তবে আপনি এই সমস্ত সাবকিউরিয়াকে একটি সিটিই দিয়ে প্রতিস্থাপন করতে পারেন। এটি আপনাকে আপনার কোডটি আরও ভালভাবে পুনরায় ব্যবহার করতে দেয়।


4

আপনার যে জিনিসটিও বুঝতে হবে তা হ'ল এসকিউএল সার্ভারের পুরানো সংস্করণগুলিতে (হ্যাঁ অনেক লোকের এখনও এসকিউএল সার্ভার 2000 ডাটাবেস সমর্থন করা প্রয়োজন), সিটিই অনুমোদিত নয় এবং তারপরে প্রাপ্ত টেবিলটি আপনার সেরা সমাধান।


2

ইঙ্গিত: (MAXRECURSION এন)

আপনি ব্যবহার দ্বারা পুনরাবৃত্তির মাত্রা একটি নির্দিষ্ট বিবৃতি জন্য অনুমোদিত সংখ্যা সীমিত করতে পারেন MAXRECURSIONইঙ্গিতটি এবং এর মধ্যে একটি মান 0 এবং 32.767 মধ্যে OPTIONদফা

উদাহরণস্বরূপ, আপনি চেষ্টা করতে পারেন:

OPTION 
      (MAXRECURSION 150)

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