अगर दो कॉलम बराबर हैं तो मैं एक फास्ट लुकअप पर आधारित होना चाहता हूं। मैंने एक सूचकांक के साथ एक संगणित कॉलम का उपयोग करने की कोशिश की, लेकिन SQL सर्वर इसका उपयोग नहीं करता है। यदि मैं केवल एक इंडेक्स के साथ एक स्टैटिकली पॉपुलेटेड बिट कॉलम का उपयोग करता हूं, तो मुझे अपेक्षित इंडेक्स की तलाश है।
ऐसा लगता है कि इस तरह के कुछ अन्य प्रश्न हैं, लेकिन कोई भी इस बात पर ध्यान केंद्रित नहीं करता है कि सूचकांक का उपयोग क्यों नहीं किया जाएगा।
टेस्ट टेबल:
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
COALESCE
इस बिंदु पर छुटकारा पा सकते हैं ; मेरा मानना है किCASE
विवरण पहले से ही वापस करने की गारंटी थी0
या1
, लेकिनISNULL
केवल मौजूद एसक्यूएल सर्वरBIT
ही गणना किए गए कॉलम के लिए गैर-अशक्त होगा । हालांकि,COALESCE
अभी भी एक अशक्त स्तंभ निकलेगा। इस परिवर्तन का एक प्रभाव, इसके साथ या उसके बिनाCOALESCE
, यह है कि गणना किया गया स्तंभ अब अशक्त है, लेकिन सूचकांक की तलाश की जा सकती है।