গণিত কলাম সূচক ব্যবহৃত হয় না


14

আমি দুটি কলাম সমান হয় তার উপর ভিত্তি করে একটি দ্রুত অনুসন্ধান করতে চাই। আমি একটি সূচক সহ একটি গণিত কলাম ব্যবহার করার চেষ্টা করেছি, তবে এসকিউএল সার্ভার এটি ব্যবহার করে বলে মনে হচ্ছে না। আমি যদি কেবল একটি সূচি সহ স্থিতিশীল জনবহুল বিট কলামটি ব্যবহার করি তবে আমি প্রত্যাশিত সূচকটি সন্ধান করি।

দেখে মনে হচ্ছে এখানে এর মতো আরও কিছু প্রশ্ন রয়েছে, তবে কেন কোনও সূচক ব্যবহার করা হবে না সেদিকে কোনও দৃষ্টি নিবদ্ধ করা হয়নি।

পরীক্ষার সারণী:

CREATE TABLE dbo.Diffs
    (
    Id int NOT NULL IDENTITY (1, 1),
    DataA int NULL,
    DataB int NULL,
    DiffPersisted  AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0) PERSISTED ,
    DiffComp  AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0),
    DiffStatic bit not null,
    Primary Key (Id)
    )

create index ix_DiffPersisted on Diffs (DiffPersisted)
create index ix_DiffComp on Diffs (DiffComp)
create index ix_DiffStatic on Diffs (DiffStatic)

এবং প্রশ্ন:

select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1

এবং ফলাফল কার্যকর করার পরিকল্পনা: হত্যা পরিকল্পনা

উত্তর:


10

COALESCEপরিবর্তে দিয়ে চেষ্টা করুন ISNULL। এর সাথে ISNULL, এসকিউএল সার্ভার সংকীর্ণ সূচকের বিরুদ্ধে কোনও শিকারীকে চাপ দিতে সক্ষম বলে মনে হচ্ছে না এবং তাই তথ্যগুলি খুঁজে পেতে ক্লাস্টারটিকে স্ক্যান করতে হবে।

CREATE TABLE dbo.Diffs
    (
    Id int NOT NULL IDENTITY (1, 1),
    DataA int NULL,
    DataB int NULL,
    DiffPersisted  AS COALESCE(convert(bit, case when [DataA] is null 
      and [DataB] is not null then 1 when [DataA] <> [DataB] 
      then 1 else 0 end), 0) PERSISTED ,
    DiffComp  AS COALESCE(convert(bit, case when [DataA] is null 
      and [DataB] is not null then 1 when [DataA] <> [DataB] 
      then 1 else 0 end), 0),
    DiffStatic bit not null,
    Primary Key (Id)
    );

এটি বলে, যদি আপনি একটি স্ট্যাটিক কলামটি আটকে থাকেন তবে একটি ফিল্টারড সূচক আরও অর্থবোধ করতে পারে এবং এতে আই / ও এর দাম কম হবে (সমস্ত সারি সাধারণত কতগুলি সারি ফিল্টার প্রিকিকেটের সাথে মেলে তার উপর নির্ভর করে) যেমন:

CREATE INDEX ix_DiffStaticFiltered 
  ON dbo.Diffs(DiffStatic)
  WHERE DiffStatic = 1;

খুব আকর্ষণীয়, এই সম্পর্কে ভাবেন না। দেখে মনে হচ্ছে আপনি COALESCEযদিও এই মুহুর্তে মুক্তি পেতে পারেন ; আমি বিশ্বাস করি যে CASEবিবৃতিটি ইতিমধ্যে ফিরে আসার গ্যারান্টিযুক্ত ছিল 0বা 1তবে ISNULLএটি উপস্থিত ছিল সুতরাং এসকিউএল সার্ভার BITগণিত কলামের জন্য একটি অ-কার্যকর করতে পারে । যাইহোক, COALESCEএখনও একটি কলাম কলাম উপার্জন করবে। সুতরাং বা ছাড়াই এই পরিবর্তনের এক প্রভাবটি COALESCEহ'ল গণনা কলামটি এখন naclaable তবে সূচী সন্ধানটি ব্যবহার করা যেতে পারে।
জেফ প্যাটারসন

@ জিফ হ্যাঁ, এটি সত্য। কিন্তু এই ক্ষেত্রে যেহেতু আমরা কম্পিউটেড কলাম সংজ্ঞা শূন্য দ্বারা জানা সত্যিই একটি সম্ভাব্য আউটপুট নয়, এই শুধুমাত্র সত্যিই আমরা একটি নির্বাচিত এমনটা উৎস হিসেবে এই টেবিল ব্যবহার করছেন গুরুত্বপূর্ণ।
অ্যারন বারট্র্যান্ড

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

এছাড়াও, জিফপ্যাটারসন যেমন উল্লেখ করেছেন, আমি কি এটি ব্যবহার করতে পারি না COALESCE? কেন রাখব?
ডেভিড ফ্যাভ্রে

@ ডেভিড আপনি সম্ভবত এটি ড্রপ করতে পারেন COALESCE। আমি আপনার মূল কোডটির চেহারা এবং উদ্দেশ্যটি বজায় রাখার চেষ্টা করেছি, এবং এটি ছাড়া পরীক্ষা করিনি, যাতে পরীক্ষাটি আপনারই হবে। (আমি কেন আপনি ছিল ব্যাখ্যা করতে পারেন না ISNULLপ্রথমে সেখানে, হয়।)
হারুন বারট্রান্ড

5

এটি এসকিউএল সার্ভারের গণিত কলামের সাথে ম্যাচিং যুক্তির একটি নির্দিষ্ট সীমাবদ্ধতা, যখন কোনও বহিরাগত ISNULLব্যবহার করা হয় এবং কলামটির ডেটাটাইপ হয় bit

বাগ রিপোর্ট

সমস্যাটি এড়াতে, নিচের যে কোনও কাজের ক্ষেত্র নিয়োগ করতে পারে:

  1. বাইরেরতম ব্যবহার করবেন না ISNULL(একটি গণিত কলাম তৈরির একমাত্র উপায় NOT NULL)।
  2. bitগণিত কলামের চূড়ান্ত প্রকার হিসাবে ডেটা ধরণটি ব্যবহার করবেন না ।
  3. গণিত কলাম তৈরি করুন PERSISTEDএবং ট্রেস পতাকা 174 সক্ষম করুন

বিস্তারিত

ইস্যুটির কেন্দ্রস্থল হ'ল ট্রেস ফ্ল্যাগ 174 ছাড়াই, কোয়েরিতে সমস্ত গণনা করা কলামের রেফারেন্স (এমনকি অব্যাহত) কোয়েরি সংকলনের খুব প্রথম দিকে অন্তর্নিহিত সংজ্ঞাতে প্রসারিত হয়।

সম্প্রসারণের ধারণাটি হ'ল এটি সরলকরণ এবং পুনর্লিখনগুলি সক্ষম করতে পারে যা কেবলমাত্র কলামের নাম নয়, কেবল সংজ্ঞাতে কাজ করতে পারে। উদাহরণস্বরূপ, ক্যোয়ারী রেফারেন্সিংয়ে এমন পূর্বাভাস থাকতে পারে যে গণনা করা কলামটি হিসাবের অনর্থক বা অন্যথায় আরও সীমাবদ্ধ করতে পারে।

একবার প্রারম্ভিক সরলীকরণ এবং পুনরায় লেখাগুলি বিবেচনা করা হয়ে গেলে, কোয়েরি সংকলনটি কোয়েরিতে বর্ণনামূলক কলামগুলিতে (সমস্ত গণিত কলাম, মূলত ক্যোয়ারী পাঠ্যে পাওয়া যায় না) মিলিয়ে দেখার চেষ্টা করে।

অপরিবর্তিত গণিত কলামের এক্সপ্রেশন বেশিরভাগ ক্ষেত্রেই ইস্যু ছাড়াই মূল গণিত কলামে ফিরে মিলছে। bitবহিরাগতের সাথে টাইপের একটি এক্সপ্রেশন মিলে যাওয়ার ক্ষেত্রে নির্দিষ্ট যখন একটি বাগ উপস্থিত হয় ISNULL। মিলটি এই নির্দিষ্ট ক্ষেত্রে ব্যর্থ, এমনকি ইন্টার্নালগুলির একটি বিশদ পরীক্ষা দেখায় যে এটি সফল হওয়া উচিত।

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