2010-09-23 8 views
10

अतीत में मैंने एक varbinary (अधिकतम) कॉलम पूछताछ करते समय भयानक प्रदर्शन देखा है। समझा जा सकता है, लेकिन यह तब भी होता है जब यह जांचता है कि यह शून्य है या नहीं, और मैं उम्मीद कर रहा था कि इंजन कुछ शॉर्टकट लेगा।varbinary फ़ील्ड पर ISNULL की जांच के लिए रणनीतियां?

select top 100 * from Files where Content is null 

मुझे लगता है कि यह धीमी है क्योंकि यह

  1. पूरे द्विआधारी बाहर निकलने के लिए की जरूरत है, और
  2. यह अनुक्रमित नहीं है (varbinary एक सामान्य सूचकांक का हिस्सा नहीं हो सकता है)

This question यहां धीमेपन के मेरे आधार से असहमत प्रतीत होता है, लेकिन मुझे लगता है कि बाइनरी फ़ील्ड समय और समय के साथ प्रदर्शन समस्याएं हैं।

alter table Files 
add ContentLength as ISNULL(DATALENGTH(Content),0) persisted 

CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] 
(
    [ContentLength] ASC 
) 

select top 100 * from Files where ContentLength = 0 

एक वैध रणनीति है कि है:

एक संभव समाधान मैं के बारे में सोचा एक गणना स्तंभ है कि अनुक्रमित बनाने के लिए है? बाइनरी फ़ील्ड शामिल होने पर कुशलता से पूछताछ करने के लिए अन्य तरीके क्या हैं?

उत्तर

8

मुझे लगता है कि यह धीमा है क्योंकि varbinary कॉलम अनुक्रमित नहीं है (और नहीं हो सकता है)। इसलिए, एक गणना (और अनुक्रमित) कॉलम का उपयोग करने के लिए आपका दृष्टिकोण मान्य है।

हालांकि, मैं ISNULL(DATALENGTH(Content), -1) का उपयोग करता हूं, ताकि आप लंबाई 0 और न्यूल के बीच अंतर कर सकें। या बस DATALENGTH(Content) का उपयोग करें। मेरा मतलब है, माइक्रोसॉफ्ट एसक्यूएल सर्वर ओरेकल नहीं है जहां एक खाली स्ट्रिंग न्यूल के समान है।

2

पंक्तियों की तलाश करते समय हमें एक ही समस्या थी जहां एक varbinary मान शून्य नहीं था। हमारे लिए समाधान डेटाबेस के आंकड़ों को अद्यतन करना था:

exec sp_updatestats 

ऐसा करने के बाद प्रश्न बहुत तेजी से भाग गए।