RANK () এবং DENSE_RANK () ডিটারমিনিস্টিক বা নন-ডিটারমিনিস্টিক?


27

অফিসিয়াল মাইক্রোসফ্টের মতে বিওএল DENSE_RANK হ'ল ননডেটেরিস্টেমিক ( RANK () )। তবে ইটজিক বেন- গানের র্যাঙ্কিং ফাংশন অনুসারে "... র্যাঙ্ক () এবং ডেনসE_RANK () ফাংশনগুলি সর্বদা নিরস্ত্রী থাকে"। কে ঠিক আছে?

আমি এ পর্যন্ত যা খুঁজে পেয়েছি: মাইক্রোসফ্টের সংজ্ঞা "নির্ধারিত ফাংশনগুলি সর্বদা একই ফলাফলটি যে কোনও সময় ইনপুট মানগুলির একটি নির্দিষ্ট সেট সহ ডাকা হয় এবং ডাটাবেসটির একই অবস্থা হিসাবে ডাকা হয়" "

সুতরাং সেট তত্ত্ব টেবিল কর্মচারী

Employee            Salary
Sue Right            1.00
Robin Page           1.00
Phil Factor          1.00

এবং কর্মচারী 2

Employee            Salary
Phil Factor          1.00
Sue Right            1.00
Robin Page           1.00

সব একই. তবে র‌্যাঙ্কিং কার্যগুলি বিভিন্ন মান দেয়:

    CREATE TABLE [dbo].[Employees](
    --[ID] [int] IDENTITY(1,1) NOT NULL,
    [Employee] [varchar](150) NOT NULL,
    [Salary] [smallmoney] NULL,
) ON [PRIMARY]

GO
CREATE TABLE [dbo].[Employees2](
    --[ID] [int] IDENTITY(1,1) NOT NULL,
    [Employee] [varchar](150) NOT NULL,
    [Salary] [smallmoney] NULL,
) ON [PRIMARY]

INSERT INTO [dbo].[Employees]
([Employee] ,[Salary])
VALUES
('Sue Right', 1)
, ('Robin Page', 1)
,('Phil Factor', 1 )
GO
INSERT INTO [dbo].[Employees2]
([Employee] ,[Salary])
VALUES
('Phil Factor', 1 )
,('Sue Right', 1)
,('Robin Page', 1)
GO
SELECT RANK() OVER ( ORDER BY Salary) AS [Rank]
, DENSE_RANK() OVER (ORDER BY Salary ) AS [Dense_rank]
, [Employee]
FROM
dbo.Employees

SELECT RANK() OVER ( ORDER BY Salary) AS [Rank]
, DENSE_RANK() OVER (ORDER BY Salary ) AS [Dense_rank]
, [Employee]
FROM
dbo.Employees2

SELECT NTILE(3) OVER ( ORDER BY SALARY )
, [Employee]
FROM
dbo.Employees

SELECT NTILE(3) OVER ( ORDER BY SALARY )
, [Employee]
FROM
dbo.Employees2

উত্তর:


23

অফিসিয়াল মাইক্রোসফ্টের মতে বিওএল DENSE_RANK হ'ল ননডেটেরিস্টেমিক (RANK ())। তবে ইটজিক বেন-গানের র্যাঙ্কিং ফাংশন অনুসারে "... র্যাঙ্ক () এবং ডেনসE_RANK () ফাংশনগুলি সর্বদা নিরস্ত্রী থাকে"। কে ঠিক আছে?

তারা উভয়ই সঠিক, কারণ তারা "ডিটারমিনিস্টিক" শব্দের বিভিন্ন সংবেদন ব্যবহার করছে।

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

নির্ধারিত এখানে অর্থ: ফাংশনের সঠিক উদাহরণটি সর্বদা একই ইনপুটটির জন্য একই আউটপুট ফেরত দেয়, যতবার এটি বলা হোক না কেন। সংজ্ঞা অনুসারে উইন্ডোটিং ফাংশনগুলির ক্ষেত্রে এটি কখনই সত্য নয়, কারণ (একক-সারি) স্কেলার ফাংশন হিসাবে, তারা একই ফলটিকে একটি সারিতে বা সারি জুড়ে দেয় না। এটি সহজভাবে ব্যবহার করেROW_NUMBER উদাহরণ হিসাবে :

ROW_NUMBERফাংশন জন্য (সংজ্ঞা দ্বারা!) বিভিন্ন সারি জন্য আলাদা মান ফেরৎ, তাই অপ্টিমাইজেশান উদ্দেশ্যে এটা nondeterministic হয়

বিওএল এটি বোধগম্য ব্যবহার করছে।

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


10

NTILE()একটি আকর্ষণীয় কেস; এটি বাছাইয়ের পরে প্রয়োগ হয়েছে বলে মনে হয় (যা টাইয়ের ক্ষেত্রে এসকিউএল সার্ভারের নিজস্ব ডিভাইসগুলিতে ছেড়ে যায় এবং এটি সাধারণত বাছাইয়ের উদ্দেশ্যে সূচকের সবচেয়ে কার্যকর পছন্দ দ্বারা চালিত হয়)। আপনি এসকিউএল সার্ভারকে এখানে একটি স্বেচ্ছাসেবী পছন্দ করতে বাধ্য না করে এই নির্মাতাকে তৈরি করতে পারেন - ধারাটিতে এক বা একাধিক টাই-ব্রেকার যুক্ত করুন OVER():

OVER (ORDER BY Salary, Employee)

মূলত আপনি বাছাই অনন্য করতে হবে। যদি আপনার একই নামে কর্মচারী থাকে তবে আপনাকে কোনও আলাদা টাই-ব্রেকার কলাম বেছে নিতে বা কলামগুলি যোগ করতে থাকবে যতক্ষণ না কোনও সম্পর্ক তৈরি হতে পারে।

জন্য RANK()এবং DENSE_RANK(), বন্ধন আসলে একটি অত্যন্ত গুরুত্বপূর্ণ কারণ যে তুমি করতে পারবে না মান আলাদা পেতে। ফলাফলের ক্রম নির্ধারণের সাথে ফাংশনের আউটপুট নির্ধারণকে বিভ্রান্ত না করার চেষ্টা করুন। যদি আপনার প্রশ্নগুলি না থাকে ORDER BY, তবে এ সম্পর্কে নিরঙ্কুশ কী নয়?

1   1   Sue Right
1   1   Robin Page
1   1   Phil Factor

1   1   Phil Factor
1   1   Sue Right
1   1   Robin Page

RANK()এবং DENSE_RANK()উভয় ক্ষেত্রে একই মান প্রয়োগ করে, এসকিউএল সার্ভার সবেমাত্র ফলাফলগুলি আপনাকে অন্য ক্রমে ফিরিয়ে দিয়েছে। একই ইনপুট থেকে একই আউটপুট আশা করা RANK()বা DENSE_RANK()একই ইনপুট দেওয়ার সাথে এর কোনও সম্পর্ক নেই - আপনি যখন এসকিউএল সার্ভারকে (একটি ORDER BYধারা বাদ দিয়ে ) বলেছেন যে আপনি যাতে ক্রমটির আদেশের বিষয়ে চিন্তা করেন না তখন এটি কিছু নির্দ্বিধায়িক অর্ডারটি অনুমান করা বা প্রত্যাশা করা is ফলাফলগুলো. এখানে # 3 দেখুন:


7

বাক্য গঠন:

WindowFunction() OVER (PARTITION BY <some expressions>        -- partition list
                       ORDER BY <some other expressions>)     -- order list

উভয় ফাংশন, RANK()এবংDENSE_RANK() , তাদের সংজ্ঞা অনুসারে, OVERক্লজটির অভিব্যক্তিগুলি যতক্ষণ না তারা নিজেরাই সংক্ষিপ্ততর থাকে ততক্ষণ একই ফলাফল আনার গ্যারান্টিযুক্ত । এবং এটিই ইজজিক বেন-গান তার নিবন্ধে বোঝানো হয়েছে। এই তালিকাগুলি প্রায়শই জড়িত সারণীর কেবল কলাম হয়।

সুতরাং, ফাংশনগুলি সাধারণভাবে নির্বিচারক নয়, পার্টিশন এবং আদেশের তালিকা পরীক্ষা করার পরে তাদের বাস্তবায়ন দুটি ক্ষেত্রে আলাদা করার এবং তাদের নির্বিচারবাদী বা না বিবেচনা করার বিষয়ে যত্ন নিতে পারে।

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

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


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

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