এখন কি কোলেসসেস সরগেবল?


9

আমার এক বিকাশকারী যুক্তি দিচ্ছেন যা COALESCE(column, default value) = default valueএখন ব্যস্ত। এটা কি সঠিক?

আমি নিম্নলিখিত পরীক্ষা COALESCEচালিয়েছি , এবং মনে করি এটি বোঝায় যে এটি অ-সরগেযোগ্য।

USE tempdb;

SELECT @@VERSION;
-- Microsoft SQL Server 2016 (RTM-CU3-GDR) (KB3194717) - 13.0.2186.6 (X64)   Oct 31 2016 18:27:32   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 14393: ) (Hypervisor) 

CREATE TABLE Test 
(
    ID int primary key clustered, 
    Mod6 int null, 
    INDEX IX_Mod6 NONCLUSTERED (Mod6)
);

INSERT INTO Test (ID, Mod6)
SELECT object_id as ID, case when name like '%k%' then null else object_id % 6 end as Mod6
FROM sys.objects;

SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
where Mod6 is null or Mod6 = 0;
-- Plan shows expected seek

SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
WHERE COALESCE(Mod6, 0) = 0;
-- Error:
-- Msg 8622, Level 16, State 1, Line 20
-- Query processor could not produce a query plan because of the hints 
-- defined in this query. Resubmit the query without specifying any hints 
-- and without using SET FORCEPLAN.

5
আপনার বিকাশকারী কোনও প্রমাণ দিয়ে তর্ক করেছেন?
অ্যারন বারট্র্যান্ড

আমি এই পোস্টটি পড়েছি: josef-richberg.squarespace.com/j Journal / 2010/ 1 / 28/… আমি মনে করি না যে এই পোস্টের উত্তর দেওয়ার জন্য কোনও ਠ answer় উত্তর নেওয়া যেতে পারে। (তবে সম্ভবত অন্য কেউ জানেন))
আরএলএফ

@ আরএলএফ - এই নিবন্ধটি এমন কিছু বলবে না যা ইঙ্গিত দেয় যে এটি ব্যয়বহুল। এটি ব্যঙ্গাত্মক হওয়ার কোনও প্রদর্শন নয়। twitpic.com/107ms0 । অ-সরগাব্যতা হ'ল এটি CASEঅভিব্যক্তিতে ব্যবহৃত কলামগুলিকে সন্ধান করতে বাধা দেয় - এমন নয় যে অভিব্যক্তির ফলাফলটি তখন অন্য কিছু অনুসন্ধান করতে ব্যবহার করা যায় না।
মার্টিন স্মিথ

@ অ্যারোনবার্ট্র্যান্ড, "আমি যেভাবে লিখি তা কার্যকর করার পরিকল্পনাটি একই রকম দেখায়" - তিনি এই বিষয়টিকে এড়িয়ে গেছেন যে COALESCEডি কলামের উপর ভিত্তি করে দু'জনেই কোনও অনুসন্ধান করা হচ্ছে না ।
মিচ

1
ওহ আমি প্রশ্ন জিজ্ঞাসা করার জন্য আপনাকে দোষ দিচ্ছি না, বিশেষত যেহেতু আপনি প্রথমে এটি অস্বীকার করার চেষ্টা করেছিলেন। আমি কেবল পরামর্শ দিচ্ছিলাম যে সম্ভবত আপনার বিকাশকারীও এটি করতে শিখুক।
অ্যারন বারট্র্যান্ড

উত্তর:


15

কোন COALESCEsargable নয়।

আপনার নিজের পরীক্ষা এটি ভালভাবে প্রদর্শন করে।

আপনি যদি COALESCEএক্সপ্রেশন সহ একটি গণিত কলাম তৈরি করেন এবং এটি সূচী করেন তবে তার ব্যতিক্রম হবে ।

CREATE TABLE Test 
(
    ID int primary key clustered, 
    Mod6 int null, 
    Foo AS COALESCE(Mod6, 0),
    INDEX IX_Mod6 NONCLUSTERED (Mod6),
    INDEX IX2_Mod6 NONCLUSTERED (Foo),
);

আপনি যে একটি সন্ধান সঙ্গে শেষ হতে পারে

SELECT Mod6
FROM Test WITH (INDEX = IX2_Mod6, FORCESEEK)
WHERE COALESCE(Mod6, 0) = 0;

ISNULL এতে অপেক্ষাকৃত বেশি ব্যয়সাধ্য যে এটি যদি সম্পূর্ণ অপ্রয়োজনীয় হয় তবে এটি অপ্টিমাইজ করা যায় এবং কোনও অনুসন্ধানকে আটকাতে পারে না।

অর্থাত্ কলামটি যদি সেই Mod6হিসাবে সংজ্ঞায়িত হয় NOT NULLতবে নিম্নলিখিতটি সিক তৈরি করতে পারে।

SELECT Mod6
FROM Test 
WHERE ISNULL(Mod6, 0) = 0;

তবে অবশ্যই এটি করার মাধ্যমে কোনও সুবিধা সরবরাহ করা হয় না

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