হ্যালোইন সুরক্ষা বহির্ভূত একটি ফাংশন SCHEMABINDING এর কি কোনও সুবিধা আছে?


52

এটি সুপরিচিত যে SCHEMABINDINGকোনও ফাংশন আপডেট পরিকল্পনাগুলিতে একটি অপ্রয়োজনীয় স্পুল এড়াতে পারে :

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

কোনও SCHEMABINDINGফাংশনের অন্য কোনও সুবিধা রয়েছে , এমনকি যদি এটি ডেটা অ্যাক্সেস না করে?

উত্তর:


78

হ্যাঁ.

নির্দিষ্ট করতে ব্যর্থ হওয়ার 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 ডেটা অ্যাক্সেসের পরিকল্পনার নিচে সরানো দরকার। ক্রিয়াকলাপটি অ-সংঘবদ্ধ হলে এই আন্দোলনটি প্রতিরোধ করা হয়।

ঠিক করা

এই উদাহরণের জন্য ঠিক করা দুটি পদক্ষেপ জড়িত:

  1. যোগ WITH SCHEMABINDING
  2. ফাংশনকে নির্বিচারক করুন

প্রথম পদক্ষেপটি তুচ্ছ। দ্বিতীয়টি হ'ল স্ট্রিং থেকে নন-ডিটারমিনিস্টিক ইমপ্লিট কাস্ট অপসারণ 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;

এই ফাংশন সংজ্ঞা স্ক্যান পরিকল্পনা উত্পাদন করে, এবং বৈশিষ্ট্যগুলি দেখায় যে এটি অ-নিরস্তুত্বপূর্ণ রয়ে গেছে:

CAST ফাংশন বৈশিষ্ট্য

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