CARDINALITY
কৌশলগতভাবে ব্যবহার করে TOP
এবং MANY()
অ্যাডাম মাচানিক দ্বারা বিকাশকৃত একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন দিয়ে আপনি ওরাকল এর ইঙ্গিতের অনুরূপ কিছু পেতে পারেন । কয়েকটি উদাহরণের মাধ্যমে কাজ করা যাক। আমি অবাধে উপলভ্য অ্যাডভেঞ্চার ওয়ার্কস ডাটাবেসটি ব্যবহার করছি। মনে করুন যে th
নীচের ক্যোয়ারীতে উত্পন্ন সারণী দ্বারা ফিরে আসা সারিগুলির সংখ্যাটি আমার সত্যিই নিয়ন্ত্রণ করতে হবে :
SELECT
p.Name
, th.ProductId
, th.Quantity
, th.ActualCost
FROM Production.Product p
INNER JOIN (
SELECT ProductId, Quantity, ActualCost
FROM Production.TransactionHistory
) th ON p.ProductID = th.ProductID;
হিসাবে, আমি 113443 সারিগুলির একটি অনুমান পাই:
থেকে আমি অনুমান নীচু করার প্রয়োজন হলে th
আমি ব্যবহার করতে পারেন TOP
সহ OPTIMIZE FOR
একটি সারিতে লক্ষ্য নির্ধারণ করবেন ক্যোয়ারী ইঙ্গিত। এটি করার একটি উপায় এখানে:
DECLARE @row_goal BIGINT = 9223372036854775807;
SELECT
p.Name
, th.ProductId
, th.Quantity
, th.ActualCost
FROM Production.Product p
INNER JOIN (
SELECT TOP (@row_goal) ProductId, Quantity, ActualCost
FROM Production.TransactionHistory
) th ON p.ProductID = th.ProductID
OPTION (OPTIMIZE FOR (@row_goal = 1));
আমরা দেখতে পারি যে অনুমানটি কেবল 1 সারি:
ফলাফল পরিবর্তন এড়াতে আমি @row_goal
সবচেয়ে বড় সম্ভাব্য BIGINT
মানটিতে সেট করেছি । OPTIMIZE FOR
ক্যোয়ারী ইঙ্গিতটি অপটিমাইজার নির্দেশ যেন ক্যোয়ারী অপ্টিমাইজার করতে@row_goal
হয় 1. সমান আমি একই ফলাফল পেতে হবে কিন্তু ক্যোয়ারী ভিন্নভাবে অপ্টিমাইজ করা হবে না।
কার্ডিনালিটির প্রাক্কলন বাড়ানো তাত্পর্যপূর্ণ। আমরা কেবল এর জন্য মানটি বাড়াতে পারি না TOP
কারণ অপ্টিমাইজার বুঝতে পারবেন যে এটি পর্যাপ্ত সারিটি ফেরত দেবে না। তবে আমরা MANY()
অনুমানটিতে সারি যুক্ত করতে ফাংশনটি ব্যবহার করতে পারি । নোট করুন যে MANY()
ফাংশনটি সর্বদা 0 টি সারি ফিরিয়ে আনবে তবে এর থেকে সারি অনুমানটি ইনপুট প্যারামিটারের সাথে পরিবর্তিত হয়। মনে করুন যে আপনাকে 10X দ্বারা উত্পন্ন টেবিল থেকে সারি অনুমানের বৃদ্ধি করতে হবে। এটি সম্পাদনের একটি উপায়:
SELECT
p.Name
, th.ProductId
, th.Quantity
, th.ActualCost
FROM Production.Product p
INNER JOIN (
SELECT TOP (9223372036854775807) ProductId, Quantity, ActualCost
FROM Production.TransactionHistory
LEFT OUTER JOIN dbo.Many(10) AS m ON 1=1
) th ON p.ProductID = th.ProductID;
আমরা দেখতে পাচ্ছি যে অনুমানটি বেস টেবিলের 10X:
TOP
অপ্টিমাইজারটিকে টেবিলগুলি চারদিকে নাড়াতে প্রতিরোধ করার জন্য অতিরিক্ত অতিরিক্ত যুক্ত করা হয়েছিল। এটি ছাড়াMANY()
ফাংশনটি পরিকল্পনার ভুল জায়গায় প্রয়োগ করা যেতে পারে।
আপনি যদি কোনও ফ্যাক্টর দ্বারা সারিগুলির সংখ্যা কেবল গুণিত করার পরিবর্তে একটি সুনির্দিষ্ট বিবেচনা করতে চান তবে দুটি কৌশল একত্রিত করা সম্ভব। উদাহরণস্বরূপ, ধরা যাক যে আপনার সত্যিকারের 1000000 সারি হতে উত্পন্ন টেবিলের প্রাক্কলন প্রয়োজন। এটি সম্পাদনের একটি উপায়:
DECLARE @row_goal BIGINT = 9223372036854775807;
SELECT
p.Name
, th.ProductId
, th.Quantity
, th.ActualCost
FROM Production.Product p
INNER JOIN (
SELECT TOP (@row_goal) ProductId, Quantity, ActualCost
FROM Production.TransactionHistory
LEFT OUTER JOIN dbo.Many(10) AS m ON
1=1
) th ON p.ProductID = th.ProductID
OPTION (OPTIMIZE FOR (@row_goal = 1000000));
আমরা দেখতে পাচ্ছি যে অনুমানটি 1000000 সারি:
আমার আপনাকে সতর্ক করতে হবে যে এগুলি উন্নত কৌশল যা প্রায়শই ক্যোয়ারী অপ্টিমাইজেশনের জন্য প্রয়োজন হয় না। আপনি যদি আরও জানতে চান তবে আমি অ্যাডাম মাচানিকের উপস্থাপিত রো গোলগুলির ক্ল্যাশ দেখার সুপারিশ করছি।
dbo.Mane ফাংশন
-- By Adam Machanic, reproduced with permission
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'Many' AND OBJECT_SCHEMA_NAME(object_id) = 'dbo')
DROP FUNCTION dbo.Many
GO
CREATE FUNCTION dbo.Many(@n INT)
RETURNS TABLE AS
RETURN
(
WITH
a(x) AS
(
SELECT
*
FROM
(
VALUES
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1),
(1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)
) AS x0(x)
)
SELECT TOP(@n)
1 AS x
FROM
a AS a1,
a AS a2
WHERE
a1.x % 2 = 0
)
GO