এটি কি সত্যিই সম্ভব যে এই নির্দিষ্ট অনর্থক উত্সযুক্ত টেবিলের জন্য অর্ডারটির গ্যারান্টি দেওয়া হবে না?


12

আমি লুকাশ ইডারের সাথে একটি টুইটার কথোপকথনে এই প্রশ্নটিতে হোঁচট খেয়েছি

যদিও সঠিক আচরণটি হ'ল বাহ্যতম কোয়েরিতে অর্ডার বাই ধারাটি প্রয়োগ করা হবে, কারণ, এখানে, আমরা বাইরের নিকটতম ক্যোয়ারিতে ডিসট্রিন্ট, গ্রুপ বা জিন বা অন্য কোনও কোথাও ক্লোজ ব্যবহার করছি না, কেন আরডিবিএমএস কেবল পাস করবে না? অভ্যন্তরীণ কোয়েরি অনুসারে আগত ডেটাগুলি সাজানো হয়েছিল?

SELECT * 
FROM (
    SELECT * FROM table ORDER BY time DESC
) AS t

পোস্টগ্র্রেএসকিউএল-তে এই উদাহরণটি চালানোর সময়, অন্তত ক্যোয়ারী এবং এই উত্পন্ন টেবিল উদাহরণ উভয়ের জন্য একই ফলাফল সেট হিসাবে আপনি উভয়ের জন্য একই এক্সিকিউশন প্ল্যান পাবেন।

সুতরাং, আমি ধরে নেব যে পরিকল্পনাকারী কেবলমাত্র বহিরাগত কোয়েরিটি বাতিল করবেন কারণ এটি অনর্থক বা কেবল অভ্যন্তরীণ সারণী থেকে ফলাফলগুলি পেরিয়ে যায়।

কেউ কি ভাবেন যে এটি নাও হতে পারে?


4
নোট করুন যে আপনার কোয়েরি এসকিউএল সার্ভারে ব্যর্থ হবে কারণ প্রাপ্ত কোনও টেবিলের অভ্যন্তরে কোনও আদেশ অনুমোদিত নয়।
a_horse_with_no_name

আপনি এত অবিশ্বাস্য কেন? আপনি কিছু অনুমান করবেন কেন? আপনি যখন এমন একটি প্রোগ্রাম লেখেন যা আপনাকে একটি পছন্দ ছেড়ে দেয় আপনি কি ব্যবহারকারীদের আপনার পছন্দ সম্পর্কে জিনিসগুলি প্রত্যাশা করবেন? যৌক্তিক ও শারীরিক ক্যোয়ারী অপ্টিমাইজেশন / বাস্তবায়ন সম্পর্কে পড়ুন।
ফিলিপ্সি

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

মারিয়াডিবি, ২০১২ প্রায়, বিষয়টি নিয়ে আলোচনা করেছে। গ্রুপওয়াইজ সর্বাধিকের জন্যORDER BY বিভিন্ন অপ্টিমাইজেশনের অভ্যন্তরীণসীসারঅভাব।
রিক জেমস

1
আসলে, আপনি পোস্টগ্রিসের পক্ষে ঠিক।
এরউইন ব্র্যান্ডসটেটার

উত্তর:


20

বেশিরভাগ ডাটাবেসগুলি এই বিষয় সম্পর্কে বেশ স্পষ্ট যে ORDER BYএকটি সাবকোয়ারিতে একটি হয়:

  • অনুমোদিত নয়: যেমন এসকিউএল সার্ভার, কোথাও সাইবাজ এসকিউএল (যদি না এর সাথে পরিপূরক হয় TOPবা OFFSET .. FETCH)
  • অর্থহীন: যেমন পোস্টগ্রিগ এসকিউএল, ডিবি 2 (আবার, যদি না এর সাথে পরিপূরক হয় OFFSET .. FETCHবা LIMIT)

এখানে DB2 LUW ম্যানুয়াল থেকে একটি উদাহরণ দেওয়া হয়েছে (জোর দেওয়া খনি)

একটি উপ-বিভাগে একটি অর্ডার বাই ধারাটি কোয়েরিতে ফিরে আসা সারির ক্রমকে প্রভাবিত করে না । বাইরের একটি অর্ড ক্লজ কেবলমাত্র সর্বাধিক সরেজমিনে সুনির্দিষ্ট করা থাকলে ফিরে আসা সারিগুলির ক্রমকে প্রভাবিত করে।

শব্দগুচ্ছটি পোস্টগ্র্রেএসকিউএল এর মতোই স্পষ্ট :

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

এই স্পেসিফিকেশন থেকে, এটি অনুসরণ করা যেতে পারে যে ORDER BYউত্সযুক্ত টেবিলের ধারাটির ফলে প্রাপ্ত কোনও আদেশ কেবল দুর্ঘটনাজনক এবং কাকতালীয়ভাবে আপনার প্রত্যাশিত ক্রমটির সাথে মেলে (যা এটি আপনার তুচ্ছ উদাহরণের মধ্যে বেশিরভাগ ডাটাবেসে থাকে) তবে নির্ভর করা বুদ্ধিমানের কাজ হবে না এই.

ডিবি 2 এর সাইড নোট:

বিশেষত, ডিবি 2 এর একটি কম পরিচিত বৈশিষ্ট্য রয়েছেORDER BY ORDER OF <table-designator> যা নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

SELECT C1 FROM
   (SELECT C1 FROM T1
      UNION
    SELECT C1 FROM T2
    ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE

এই বিশেষ ক্ষেত্রে, উত্পন্ন টেবিলের ক্রমটি বহিরাগত সর্বাধিক নির্বাচন করে স্পষ্টভাবে পুনরায় ব্যবহার করা যেতে পারে

ওরাকলে সাইড নোট:

বছরের পর বছর ধরে এটি OFFSETব্যবহার করে পৃষ্ঠাবদ্ধকরণ বাস্তবায়ন করার জন্য ওরাকলে একটি অনুশীলন ছিল ROWNUM, যা উত্পন্ন টেবিলের অর্ডার দেওয়ার পরে যুক্তিসঙ্গত গণনা করা যেতে পারে :

SELECT *
FROM (
  SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
  FROM (
    SELECT * FROM table ORDER BY time DESC
  ) t
) t
WHERE rn BETWEEN 10 AND 20

এটি যুক্তিসঙ্গতভাবে প্রত্যাশা করা যেতে পারে যে কমপক্ষে ROWNUMকোনও প্রশ্নের উপস্থিতিতে ভবিষ্যতের ওরাকল সংস্করণগুলি সমস্ত উত্তরাধিকার ওরাকল এসকিউএলকে ভঙ্গ করতে না পারার জন্য এই আচরণটি ভাঙবে না, যা এখনও অনেক বেশি আকাঙ্ক্ষিত হয়ে স্থানান্তরিত হয়নি এবং পঠনযোগ্য এসকিউএল স্ট্যান্ডার্ড OFFSET .. FETCHসিনট্যাক্স:

SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

Meaningless: E.g. PostgreSQLআসলেই করা উচিৎ: 'অবিশ্বস্ত', কারণ এটি আছে মানে কিছু। সারিগুলি অভ্যন্তরীণ ক্যোয়ারিতে বাছাই করা হয় এবং অতিরিক্ত ক্রিয়াকলাপের জন্য অন্যথায় নির্দেশ না দেওয়া বা পুনরায় অর্ডার করা উপযুক্ত না হলে এই আদেশটি বাইরের ক্যোয়ারী স্তরে রাখা হয়। এমনকি যদি এটি কেবল একটি বাস্তবায়ন বিশদ হয় তবে এটি অর্থহীন নয়। এটি সামগ্রিক ফাংশনগুলিতে বাছাই করা ইনপুটটির জন্য ব্যবহার করা যেতে পারে। ম্যানুয়ালটি এমনকি যতটা ইঙ্গিত করে: Alternatively, supplying the input values from a sorted subquery will usually work.
এরউইন ব্র্যান্ডসেটেটার

পোস্টগ্রিসের জন্য আপনি যে উক্তিটি যুক্ত করেছেন তা আসলে একটি ভিন্ন ক্ষেত্রে প্রযোজ্য: কোনওোটাই নয় এমন প্রশ্নগুলি ORDER BY
এরউইন ব্র্যান্ডস্টেটার

@ এরউইন ব্র্যান্ডসটেটার: এই বিবরণগুলির সাথে একটি উত্তর যুক্ত করতে নির্দ্বিধায় আমি ব্যক্তিগতভাবে একমত নই যে বাস্তবায়নের বিশদটি অর্থবহ। ঠিক আজই, আমি শিখেছি যে পুরানো দিনগুলিতে লোকেরা ওরাকল 8i (আমি বিশ্বাস করি) এর ক্রিয়াকলাপ দ্বারা সর্বদা একটি বাছাই করা গ্রুপের উপর নির্ভরশীল ছিল, যখন হঠাৎ, একটি নতুন সংস্করণ হ্যাশ গোষ্ঠীটি প্রবর্তন করেছিল, যা এই ধারণাটিকে ভেঙে দেয় যা কিছু অন্তর্নিহিত ক্রম উপর নির্ভর করা যেতে পারে। অন্য কথায়: আমি এটিকে সাহসী কথায় বলতে চাই। অর্থহীন বদলে উহু যদি আপনি সংস্করণ xyz এর জটিল বিস্তারিত জানতে, আপনি পারবেন আসলে ...
লুকাস এদর

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

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

12

হ্যাঁ. কোনও ORDER BYধারা ছাড়াই আউটপুট ক্রমটি সংজ্ঞায়িত হয় না এবং ক্যোয়ারী পরিকল্পনাকারী এটি বিবেচনা করে বুঝতে পারেন যে আপনি এটি জানেন এবং বুঝতে পেরেছেন।

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

অনির্ধারিত আচরণের উপর কখনই নির্ভর করবেন না। আপনার যদি নির্দিষ্ট অর্ডারিংয়ের দরকার ORDER BYহয় তবে উপযুক্ত জায়গায় একটি ধারা দিন।


পোস্টগ্রেএসকিউএল এটির পরীক্ষা করার সময়, ক্রম বাছাইটি ক্রমিক স্ক্যানের পরে করা হয়েছিল কারণ অর্ডার বাই দ্বারা ব্যবহৃত কলামে আমার কোনও সূচক ছিল না। কোন RDBMS আপনার মনে হয় অর্ডার দ্বারা অভ্যন্তরীণ কোয়েরিটি এড়িয়ে যাবে?
ভ্লাদ মিহলসিয়া

5
আমি বলতে পারব না আমি কোন কি জানি হবে , শুধু যে তারা যেকোন এবং সমস্ত পুরোপুরি যদি তারা ইচ্ছুক তা করার মুক্ত - এটা উভয় সাধারণ মান এবং পণ্য বিশেষ উল্লেখ অনুযায়ী একটি পুরোপুরি গ্রহণযোগ্য অপ্টিমাইজেশান হবে। এসকিউএল সার্ভার সরাসরি জিজ্ঞাসাটি প্রত্যাখ্যান করবে (আপনি যদি না অন্তর্ভুক্ত করেন তবে TOP 100%বর্তমান ক্যোয়ারীটি বহনযোগ্য নয়, আপনার প্রকল্পের জন্য এটি অগ্রাধিকার উচিত Because পুরানো সংস্করণগুলি আসলে তা করে) তাই আপনার আচরণের ক্ষেত্রে কেবল নির্ভর করা এড়ানো উচিত
ডেভিড স্পিলিট

1
@VladMihalcea একটি DBMS যে অপ্রয়োজনীয় করে "দূরে অপ্টিমাইজ" ORDER BYহয় MariaDB কেন Subquery থেকে একটি এড়ানো আদেশ দ্বারা সম্পর্ক?
ypercubeᵀᴹ

6

এটি অপরিবর্তিত আচরণের সাথে খুব সমস্যা - এটি আপনার জন্য কাজ করে, আমার জন্য কাজ করে, এইচডিডিটিকে নতুন করে রূপ দেয়;)

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


2
এটি অর্ডারটিকে অপ্টিমাইজ করতে পারে তার এক কারণ হচ্ছে গতি। সারিগুলি একটি ভিন্ন ক্রমে ফিরিয়ে দেওয়া আরও কার্যকর হতে পারে।
টমটম

2
বিশেষত, সার্ভারটি টেবিলটি পড়তে সমান্তরালতা কাজে লাগাতে পারে। যদি এটি এটি করে এবং কোনও আদেশ প্রয়োগের দরকার নেই, তবে থ্রেডগুলি সেগুলি পড়লেও আপনি সারিগুলি ফিরে পাবেন। (এসকিউএল সার্ভার আসলে এটি করে, যাতে SELECTকোনও ORDER BYসত্যিকারের সাথে একটি সত্যই তাত্পর্যপূর্ণ না হয় এবং কেবল তত্ত্বের ভিত্তিতে বা ডেটা পরিবর্তিত হয় না))
জেরোইন মোস্টার্ট

@ জিরোয়ানমাস্টার্ট: অপরিজ্ঞাত আচরণ কেবল খারাপ হয়। যদি এটি অর্ডার থেকে বেরিয়ে যায় এবং ব-দ্বীপটি একটি অ্যারেতে সূচক হিসাবে ব্যবহৃত হয় তবে কী হবে?
জোশুয়া

2

এটি কি সত্যিই সম্ভব যে এই নির্দিষ্ট অনর্থক উত্সযুক্ত টেবিলের জন্য অর্ডারটির গ্যারান্টি দেওয়া হবে না?

বর্তমানে বিদ্যমান সমস্ত পোস্টগ্রিসের উত্তর (যা আপনি পরীক্ষা করেছিলেন) সংস্করণগুলির উত্তর: না - এই নির্দিষ্ট প্রশ্নের জন্য। বাছাই অর্ডার গ্যারান্টিযুক্ত।

এসকিউএল সার্ভারের লোকেরা এতে অস্বস্তি বোধ করবে যেহেতু মাইক্রোসফ্ট ORDER BYসাবকোয়্যারিতে এমনকি অনুমতি দেয় না। তবুও পোস্টগ্রিসে এই সাধারণ ক্যোয়ারির জন্য বাছাইয়ের অর্ডার গ্যারান্টিযুক্ত। ORDER BYসাবকোয়ারিতে প্রয়োগ করা হয় এবং বাইরের ক্যোয়ারী এমন কিছু করে না যা ক্রম পরিবর্তন করতে পারে।

ম্যানুয়াল এমনকি সমষ্টিগত অধ্যায়গুলির অধ্যায়ে যতটা ইঙ্গিত দেয় :

বিকল্পভাবে, একটি সাজানো সাবকোয়ারি থেকে ইনপুট মান সরবরাহ করা সাধারণত কাজ করবে।

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


এটি যখন সত্য "table", বেস টেবিলটি নয় তবে একটি জটিল দৃষ্টিভঙ্গি বা পার্টিশনযুক্ত টেবিল নয়? পরিকল্পনারও যখন সমান্তরাল বাস্তবায়ন হয় তখন এটি সত্য? পোস্টগ্রিস 10 তেও কি এটি সত্য? (আমি কেবল জিজ্ঞাসা করছি, আমি এই প্রশ্নের কোনও উত্তরের বিষয়ে নিশ্চিত নই।)
ypercubeᵀᴹ

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