অর্ডার কেন কোনও ভিউতে অন্তর্ভুক্ত নয়?


51

আমি বুঝতে পারি যে আপনার মতামত থাকতে পারে না ORDER BY । (কমপক্ষে এসকিউএল সার্ভারে 2012 এ আমি কাজ করছি)

আমি এও বুঝতে পারি যে ভিউটি বাছাইয়ের "সঠিক" উপায়টি হল ভিউটিকে জিজ্ঞাসাবাদ করে স্টেটমেন্টের ORDER BYচারপাশে একটি রাখার মাধ্যমে SELECT

তবে ব্যবহারিক এসকিউএল এবং দর্শনের ব্যবহারের তুলনায় তুলনামূলকভাবে নতুন হওয়ায় আমি বুঝতে চাই যে ডিজাইনের মাধ্যমে এটি কেন করা হয়। আমি যদি ইতিহাসটি সঠিকভাবে অনুসরণ করে থাকি তবে এটি একবারে সম্ভব হয়েছিল এবং স্পষ্টভাবে এসকিউএল সার্ভার ২০০৮ এবং এ থেকে সরানো হয়েছিল (সঠিক সংস্করণে আমাকে উদ্ধৃতি দেবেন না)।

তবে, মাইক্রোসফ্ট কেন এই বৈশিষ্ট্যটি সরিয়ে নিয়েছে তার সর্বোত্তম কারণটি হ'ল কারণ "ভিউটি একটি তথ্যের সংগ্রহবিহীন সংগ্রহ"।

আমি ধরে নিচ্ছি যে দৃশ্যের ছাঁটাবস্থা করা উচিত না কেন এর জন্য একটি যুক্তিসঙ্গত কারণ রয়েছে। কেন একটি দৃশ্য কেবলমাত্র চিত্তাকর্ষণ সম্পর্কিত তথ্য হতে পারে না? কেন বিশেষভাবে উন -sorted? এমন পরিস্থিতিতে উপস্থিত হওয়া এতটা কঠিন বলে মনে হচ্ছে না যেখানে (কমপক্ষে আমার কাছে / আইএমএইচও) এটি বাছাই করা মতামতটি পুরোপুরি স্বজ্ঞাত বলে মনে হয়।


2
প্রথম উত্তর নিখুঁত স্পট। আমি আপনাকে পরামর্শ দিচ্ছি যদি আপনি কোনও দৃশ্যের অর্ডার করতে চান তবে কেন আপনি কেবল এটি করেন না। [কলামগুলি] [[আপনার ভিউ]] থেকে [কলামগুলি] অর্ডার করুন
জেন

সংক্ষিপ্ত উত্তর: "একই কারণে যে অর্ডার বাই একটি টেবিলের অন্তর্ভুক্ত নয়" "
ypercubeᵀᴹ

উত্তর:


38

(সূচী দর্শনগুলি অবশ্যই একদিকে রেখে দিন))

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

ইতিহাস সম্পর্কে কিছুটা অন্তর্দৃষ্টি দেওয়াও। আপনি পারে না করা ORDER BYএকটি দৃশ্য, এছাড়াও অন্তর্ভুক্ত করা ছাড়াই TOP। এবং এই ক্ষেত্রে নির্ধারিত ORDER BYকোন সারিগুলি এর দ্বারা অন্তর্ভুক্ত ছিল TOP, সেগুলি কীভাবে উপস্থাপন করা হবে তা নয়। এটা তোলে ঠিক তাই ঘটেছে যে SQL সার্ভার 2000 সালে, যদি TOPছিল 100 PERCENTবা {some number >= number of rows in the table}, অপটিমাইজার মোটামুটি সরল ছিল এবং এটি একটি সাজানোর সঙ্গে মেলা সঙ্গে একটি পরিকল্পনা উত্পাদক শেষ পর্যন্ত TOP/ORDER BY। তবে এই আচরণটি কখনই গ্যারান্টিযুক্ত বা ডকুমেন্টেড হয় নি - এটি কেবল পর্যবেক্ষণের ভিত্তিতে নির্ভর করা হয়েছিল যা একটি খারাপ অভ্যাস । যখন এসকিউএল সার্ভার 2005 প্রকাশিত হয়েছিল, তখন এই আচরণটি "ব্রেকিং" শুরু করেছিল কারণ অপটিমাইজারের পরিবর্তনের ফলে বিভিন্ন পরিকল্পনা এবং অপারেটরগুলি ব্যবহার করা হয়েছিল - অন্যান্য বিষয়গুলির মধ্যেTOP / ORDER BYএটি হলে সম্পূর্ণ উপেক্ষা করা হবে TOP 100 PERCENT। কিছু গ্রাহক এ সম্পর্কে এত জোরে অভিযোগ করেছিলেন যে মাইক্রোসফ্ট পুরানো আচরণ পুনরুদ্ধার করতে একটি ট্রেস পতাকা জারি করেছে। পতাকাটি কী তা আমি আপনাকে জানাতে যাচ্ছি না কারণ আমি চাই না আপনি এটি ব্যবহার করুন এবং আমি নিশ্চিত করতে চাই যে উদ্দেশ্যটি সঠিক is ​​আপনি যদি পূর্বাভাসযোগ্য সাজানোর আদেশ চান ORDER BYতবে বাহ্যিক ক্যোয়ারিতে ব্যবহার করুন।

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


এখানে উল্লেখ করা হয়েছে (একটি মন্তব্যে) যে TOPফলাফল সেটটিতে কার্সার অপারেশন করে। এর জন্য এটির একটি সুস্পষ্ট অর্ডার থাকতে পারে।
টিম শ্মেলেটার

@ টিমশ্মেল্টার যখন অপ্টিমাইজারটি TOP 100 PERCENT / ORDER BYপুরোপুরি পরিকল্পনা থেকে এটি দেখতে এবং সরিয়ে ফেলবে তখন সাহায্য করবে না । চেষ্টা কর.
অ্যারন বারট্র্যান্ড

এটি ছিল মাত্র একটি পার্সোনোট। বাকী মন্তব্যটি যাইহোক এইভাবে হয়: "এসইকিউএল সার্ভারের ভবিষ্যতের সংস্করণে SELECT TOP x কৌশল অবচয় করার কথা রয়েছে, সুতরাং এটি ব্যবহার না করা ভাল not"
টিম শ্মেলেটার

@ টিমশ্মেলটার এটি ইতিমধ্যে কোনও অপ-বিকল্প নয়। আমি ভাবি না যে এটি শীঘ্রই যে কোনও নতুন সংস্করণে কাজ করা বন্ধ করবে, কারণ এটি প্রচুর বিদ্যমান কোডটি ভেঙে দেবে।
অ্যারন বারট্র্যান্ড

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

9

যদি কোনও ভিউ বাছাই করার অনুমতি দেওয়া হয় তবে এখানে ফলাফলের ক্রম কী হওয়া উচিত?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 

আমি এই পয়েন্ট পাই না। ডাটাবেস ভিউ লেখার পরিবর্তে, আপনি সাধারণ স্ক্যাল কোয়েরি লিখতে পারেন। তাহলে সেই ক্ষেত্রে ফলাফলের ক্রম কী হওয়া উচিত? ধন্যবাদ
hqt

7

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

আর একটি কারণ, বাছাই একটি পারফরম্যান্স ব্যয়ের সাথে আসে, সুতরাং কেন কেবলমাত্র কিছু ব্যবহারকারীরই সাজানোর প্রয়োজন হলে দর্শন সমস্ত ব্যবহারকারীকে দণ্ডিত করে ..


5

এএনএসআই এসকিউএল কেবলমাত্র ORDER BYবিভিন্ন কারণে বহিরাগততম জিজ্ঞাসার অনুমতি দেয়, সাবটেল / ভিউ / সিটিই অন্য টেবিলে যোগ দেওয়া হয় এবং বাইরের ক্যোয়ারীর নিজস্বতা থাকে তখনই ঘটে থাকে ORDER BY

এসকিউএল সার্ভার এটিকে কখনই কোনও দৃশ্যের সাহায্যে সমর্থন করে না (যদি না আপনি এটির মত ব্যবহার করেন TOP 100 PERCENTযাতে আমার মতে বেশিরভাগ ত্রুটি ট্রিগার হয়ে থাকে)।

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

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

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


3

দর্শনগুলি সারণীর মতো আচরণ করে যার বিষয়বস্তু কোয়েরির ফলাফল দ্বারা নির্ধারিত হয়।

টেবিলের অর্ডার নেই; তারা সারি ব্যাগ।

অতএব, দর্শনগুলির কোনও আদেশ নেই। আপনি যদি কোনও নির্দিষ্ট অর্ডারে সারি নির্বাচন করে তাদের বাছাই করতে পারেন।


1
টেবিল ... সারির শুধু ব্যাগ আছে - এবং তারপর viwes শুধু হয় ভার্চুয়াল এর ব্যাগ ভার্চুয়াল সারি - মতামত "বিদ্যমান না" - যেমন তাদের জন্য সংরক্ষিত কোনো ডেটা এ সব - তারা করছি শুধু "করার জন্য একটি ক্যোয়ারী সংজ্ঞা সঞ্চিত মূলতঃ মৃত্যুদন্ড কার্যকর করা হবে।
marc_s

1
+1 ট্যাগ এবং দর্শনগুলির সমতুল্যতা আমার কাছে ভিউগুলিকে "আদেশ" না করার মূল কারণ বলে মনে হচ্ছে
चमत्कार 173

1
"দর্শনগুলি টেবিলের মতো আচরণ করে" । আমি বলব যে "ভিউগুলি বেস টেবিলগুলির মতো আচরণ করে Views
ypercubeᵀᴹ

-2

একটি উত্তর এখনও না দেওয়া হ'ল "অর্ডার বাই" প্রিডিকেট পুশিংয়ে হস্তক্ষেপ করতে পারে যা কার্য সম্পাদনকে ব্যাপকভাবে প্রভাবিত করতে পারে।

উদাহরণের এমন একটি ভিউ রয়েছে যা শীর্ষস্থানীয় 10 / অর্ডার করা 10 লাইনের সংক্ষিপ্তসারে ডেটাগুলির একটি বড় সেট রোল করে দেয়:

select * from TopOrderedView; -- Ordered 10 line summary in 5s

একটি শক্তিশালী শিকারী সঙ্গে একই ক্ষেত্রে:

select * from TopOrderedView where <condition>; -- Ordered 2 line summary in still 5s

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

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

"শীর্ষ 100 শতাংশ" যৌক্তিকভাবে ব্যবহারের মাধ্যমে ভবিষ্যদ্বাণীকে ধাক্কা দেওয়ার অনুমতি দেওয়া হয় তবে বাস্তবায়নের ক্ষেত্রে দুর্ভাগ্যক্রমে এই ক্ষেত্রে "দ্বারা" আদেশ উপেক্ষা করা হয় এবং উদ্দেশ্যটি হেরে যায়।

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


-6

আপনি এমন একটি ভিউ তৈরি করতে পারেন যার অর্ডার রয়েছে এবং পরে জিজ্ঞাসা করা হলে অর্ডার সংরক্ষণ করে:

..... অর্ডার দ্বারা * শীর্ষ থেকে 99.999999999999 শতাংশ নির্বাচন করুন


1
শুধু কেন নয় SELECT TOP 100 PERCENT ...?
ম্যাক্স ভার্নন

2
@ ম্যাক্স সম্ভবত এই কৌশলটির অনুরূপ - এটি এটি ভাল ধারণা তৈরি করে না।
অ্যারন বারট্র্যান্ড

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