হ্যাঁ.
নির্দিষ্ট করতে ব্যর্থ হওয়ার WITH SCHEMABINDING
অর্থ এসকিউএল সার্ভারটি ফাংশন বডিটিতে সাধারণত যে বিশদ চেক করে তা ছাড়ায়। এটি কেবল অ্যাক্সেস ডেটা হিসাবে ফাংশনটি চিহ্নিত করে (প্রশ্নে দেওয়া লিঙ্কে উল্লিখিত)।
এটি একটি পারফরম্যান্স অপ্টিমাইজেশন। এটি যদি এই অনুমানটি না করে থাকে তবে এসকিউএল সার্ভারকে প্রতিটি ফাংশন অনুরোধের উপর বিস্তারিত চেক করতে হবে (যেহেতু আনবাউন্ড ফাংশন যে কোনও সময় পরিবর্তন হতে পারে)।
আছে পাঁচটি গুরুত্বপূর্ণ কাজ বৈশিষ্ট্য:
- নিয়তিবাদ
- স্পষ্টতা
- তথ্য এক্সেস
- সিস্টেম ডেটা অ্যাক্সেস
- সিস্টেম যাচাইকরণ
উদাহরণস্বরূপ, নিম্নলিখিত আনবাউন্ড স্কেলার ফাংশনটি নিন:
CREATE FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
AS
BEGIN
RETURN '19000101';
END;
একটি মেটাডেটা ফাংশন ব্যবহার করে আমরা পাঁচটি বৈশিষ্ট্য দেখতে পারি:
SELECT
IsDeterministic = OBJECTPROPERTYEX(Func.ID, 'IsDeterministic'),
IsPrecise = OBJECTPROPERTYEX(Func.ID, 'IsPrecise'),
IsSystemVerified = OBJECTPROPERTYEX(Func.ID, 'IsSystemVerified'),
UserDataAccess = OBJECTPROPERTYEX(Func.ID, 'UserDataAccess'),
SystemDataAccess = OBJECTPROPERTYEX(Func.ID, 'SystemDataAccess')
FROM (VALUES(OBJECT_ID(N'dbo.F', N'FN'))) AS Func (ID);
দুটি ডেটা অ্যাক্সেসের বৈশিষ্ট্য সত্য হিসাবে সেট করা হয়েছে, এবং অন্য তিনটি মিথ্যা সেট করা হয়েছে ।
এটি প্রত্যাশিত হতে পারে তার বাইরেও এর প্রভাব রয়েছে (উদাহরণস্বরূপ সূচীকরণ ভিউ বা সূচিযুক্ত গণিত কলামে ব্যবহার করুন)।
ক্যোয়ারী অপ্টিমাইজারের উপর প্রভাব
নিয়তিবাদ বিশেষ করে সম্পত্তি ক্যোয়ারী অপটিমাইজার প্রভাবিত করে। এটিতে পুনরায় লেখার ধরণ এবং ম্যানিপুলেশনগুলির প্রকারের বিষয়ে এটির বিশদ নিয়ম রয়েছে এবং এটি অ-নিষেধাত্মক উপাদানগুলির জন্য খুব সীমাবদ্ধ । পার্শ্ব প্রতিক্রিয়া বেশ সূক্ষ্ম হতে পারে।
উদাহরণস্বরূপ, নিম্নলিখিত দুটি সারণী বিবেচনা করুন:
CREATE TABLE dbo.T1
(
SomeInteger integer PRIMARY KEY
);
GO
CREATE TABLE dbo.T2
(
SomeDate datetime PRIMARY KEY
);
... এবং একটি ক্যোয়ারী যা ফাংশনটি ব্যবহার করে (আগের সংজ্ঞায়িত হিসাবে):
SELECT *
FROM dbo.T1 AS T1
JOIN dbo.T2 AS T2
ON T2.SomeDate = dbo.F(T1.SomeInteger);
সারণি টি 2-এ সন্ধানের বৈশিষ্ট্যযুক্ত কোয়েরি পরিকল্পনাটি প্রত্যাশার মতো:
যাইহোক, যদি একই লজিক্যাল ক্যোয়ারী একটি উদ্ভূত টেবিল বা সাধারণ সারণী এক্সপ্রেশন ব্যবহার করে লেখা হয়:
WITH CTE AS
(
SELECT *, dt = dbo.F(T1.SomeInteger)
FROM dbo.T1 AS T1
)
SELECT *
FROM CTE
JOIN dbo.T2 AS T2
ON T2.SomeDate = CTE.dt;
-- Derived table
SELECT
*
FROM
(
SELECT *, dt = dbo.F(T1.SomeInteger)
FROM dbo.T1 AS T1
) AS T1
JOIN dbo.T2 AS T2
ON T2.SomeDate = T1.dt;
কার্যকর করার পরিকল্পনায় এখন একটি স্ক্যানের বৈশিষ্ট্য রয়েছে, একটি প্রাক্কলনকারী ফিল্টারটিতে আটকে ফাংশন জড়িত the
উত্পন্ন সারণী বা সাধারণ সারণী এক্সপ্রেশনটি কোনও ভিউ বা ইন-লাইন ফাংশন দ্বারা প্রতিস্থাপন করা হলে এটিও ঘটে। একটি FORCESEEK
ইঙ্গিত (এবং অন্যান্য অনুরূপ প্রচেষ্টা) সফল হবে না:
মৌলিক সমস্যাটি হ'ল ক্যোরি অপ্টিমাইজারটি নির্বিঘ্নবাদী কোয়েরি উপাদানগুলিকে অবাধে পুনঃক্রম করতে পারে না ।
একটি সন্ধান উত্পাদন করতে, ফিল্টার প্রিকেটটি টি 2 ডেটা অ্যাক্সেসের পরিকল্পনার নিচে সরানো দরকার। ক্রিয়াকলাপটি অ-সংঘবদ্ধ হলে এই আন্দোলনটি প্রতিরোধ করা হয়।
ঠিক করা
এই উদাহরণের জন্য ঠিক করা দুটি পদক্ষেপ জড়িত:
- যোগ
WITH SCHEMABINDING
- ফাংশনকে নির্বিচারক করুন
প্রথম পদক্ষেপটি তুচ্ছ। দ্বিতীয়টি হ'ল স্ট্রিং থেকে নন-ডিটারমিনিস্টিক ইমপ্লিট কাস্ট অপসারণ datetime
; একটি প্রতিরোধমূলক সঙ্গে এটি প্রতিস্থাপন CONVERT
। উভয়ই নিজের পক্ষে যথেষ্ট নয় ।
ALTER FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
-- Convert with a deterministic style
RETURN CONVERT(datetime, '19000101', 112);
END;
ফাংশন বৈশিষ্ট্য এখন:
অপ্টিমাইজার মুক্ত হওয়ার সাথে সাথে, সমস্ত উদাহরণ এখন পছন্দসই সন্ধানের পরিকল্পনা তৈরি করে ।
নোট করুন যে ফাংশনটিতে CAST
টু ব্যবহার করা datetime
কার্যকর হবে না, কারণ এই বাক্য গঠনে রূপান্তর শৈলী নির্দিষ্ট করা সম্ভব নয়:
ALTER FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
-- Convert with a deterministic style
RETURN CAST('19000101' AS datetime);
END;
এই ফাংশন সংজ্ঞা স্ক্যান পরিকল্পনা উত্পাদন করে, এবং বৈশিষ্ট্যগুলি দেখায় যে এটি অ-নিরস্তুত্বপূর্ণ রয়ে গেছে: