2012-06-13 16 views
25

मैं वर्तमान में कुछ परीक्षण कर रहा हूँ एसक्यूएल सर्वर 2005किसी दिए गए तालिका पर किसी इंडेक्स का उपयोग न करने के लिए मैं एक क्वेरी को कैसे बल दूं?

परीक्षण डेटा सेट मैं उपयोग कर रहा हूँ लगभग है ~ 72 लाख पंक्तियाँ (के बारे में 6 की जीबी में किसी दिए गए स्तंभ पर एक सूचकांक सहित के प्रदर्शन निहितार्थ निर्धारित करने के लिए डेटा)। वास्तव में परीक्षण इंडेक्स का प्रदर्शन करने के लिए मुझे वहां इंडेक्स के साथ और उसके बिना प्रदर्शन की तुलना करने में सक्षम होना चाहिए।

यह सब ठीक है और ठीक है, लेकिन पहली जगह में एक इंडेक्स बनाना एक सस्ता ऑपरेशन नहीं है। अगर मैं इंडेक्स के बिना टेबल का परीक्षण करना चाहता हूं, तो मुझे कम से कम, इंडेक्स को अक्षम करने की आवश्यकता है। इंडेक्स के साथ परीक्षण करने के लिए मुझे इसे फिर से सक्षम करने की आवश्यकता है जो काफी लंबा समय लेता है।

क्या कोई तरीका है कि मैं SQL सर्वर 2005 को किसी क्वेरी को निष्पादित करते समय किसी दिए गए इंडेक्स को अनदेखा कर सकता हूं? मैं सिर्फ एक क्वेरी का परीक्षण करने के लिए इंडेक्स को अक्षम नहीं करना चाहता क्योंकि यह इंडेक्स को अक्षम करने में इतना लंबा समय लगता है।

+1

[आप 'डीबीसीसी ऑटोपिलोट' भी देख सकते हैं] (http://blogs.solidq.com/fabianosqlserver/post.aspx?id=39&title=undocumented,%22statistics_only%22,%20%22dbcc%20autopilot%22 % 20and% 20% 22set% 20autopilot% 22) –

उत्तर

37
SELECT * 
FROM MyTable WITH (INDEX(0)) 
WHERE MyIndexedColumn = 0 

क्वेरी सामान्य रूप से MyIndexedColumn पर सूचकांक का प्रयोग करेंगे, लेकिन तालिका संकेत के कारण, यह बजाय tablescan होगा।


SELECT * 
FROM MyTable WITH (INDEX(IndexName)) 
WHERE MyIndexedColumn = 0 

क्वेरी सामान्य रूप से MyIndexedColumn पर सूचकांक का प्रयोग करेंगे, लेकिन तालिका संकेत के कारण, यह बजाय सूचकांक IndexName नामित प्रयोग करेंगे।

+0

तो अगर मेरे पास 'MyTable' इंडेक्स 'PK_MyTable' और 'IX_MyTable_MyIndexedColumn' पर है, तो मैं इसे * के साथ * नहीं (INDEX (PK_MyTable)) का उपयोग कर सकता हूं * नहीं * 'MyIndexedColumn' पर इंडेक्स का उपयोग करें? –

+1

हां। इस व्यवहार की पुष्टि करने के लिए ExecutionPlan की जांच करें। http: // stackoverflow।कॉम/प्रश्न/735 9 702/कैसे-करें-i-get-a-query-execution-plan –

+0

अन्य गैर-क्लस्टर इंडेक्स मौजूद होने पर मामलों के बारे में क्या? एसक्यूएल सर्वर कैसे सूचकांक पर आराम का उपयोग करता है, न कि नव निर्मित सूचकांक, यह जांचने के लिए कि नई अनुक्रमणिका क्वेरी में कैसे मदद करती है? – Satyajit

-2

आप उस इंडेक्स को अक्षम कर सकते हैं, जिसे आप उसी लेनदेन में उपयोग नहीं करना चाहते हैं जिसमें आप परीक्षण कोड चला रहे हैं, बस अंत में लेनदेन को रोलबैक करना सुनिश्चित करें। यह सुनिश्चित करता है कि परीक्षण कोड इंडेक्स का उपयोग नहीं करेगा लेकिन वास्तव में इंडेक्स को अक्षम होने से रोकता है।

BEGIN TRANSACTION 

    ALTER INDEX [MyIndex] ON MyTable DISABLE; 

    EXEC TestCode; 

ROLLBACK 

यह आपको एक जटिल मामले में जहां अपने परीक्षण कोड अलग अलग समय पर अनुक्रमित के एक नंबर का उपयोग करता है और आप अगर एक नया एक के अलावा चीजों में सुधार होगा परीक्षण करना चाहते हैं, तो बेहतर काम करता है।

+4

आपकी क्वेरी लेनदेन में सभी बैच निष्पादित होने तक पूर्ण डेटाबेस स्कीमा लॉक कर रही है! –

+0

मैंने वोट कम नहीं किया लेकिन मुझे मिलान से सहमत होना है। इतना ही नहीं, लेकिन कई बार मुझे उत्पादन डेटाबेस में ऐसा कुछ परीक्षण करना पड़ता है और डीबीए मुझे उत्पादन में इंडेक्स बदलने की अनुमति देने का कोई तरीका नहीं है। –

5

मैं सभी प्रकार के डीबी के साथ काम कर रहा हूं और मुझे इसकी आवश्यकता होने पर विशिष्ट संकेत कभी याद नहीं कर सकता। इसलिए मैं एक शुद्ध एसक्यूएल दृष्टिकोण का उपयोग कर रहा हूं जो (वर्तमान में) मेरे डीबी को पार करने वाले सभी डीबी के साथ काम करता है।

विचार डीबी के लिए एसक्यूएल में संबंधित अभिव्यक्ति को खराब करके विशिष्ट सूचकांक का उपयोग करना असंभव बनाना है। जैसे

SELECT * 
    FROM MyTable 
WHERE MyIndexedColumn + 0 = 0 

इसी प्रकार, आप एक स्ट्रिंग मान में एक खाली स्ट्रिंग जोड़ सकते हैं। वर्तमान अनुकूलक कोई हल नहीं करते हैं ऐसे अभिव्यक्ति (MyIndexedColumn) पर इंडेक्स का उपयोग नहीं कर सकते हैं।

यह वास्तव में मेरी पुस्तक में वर्णित एक विरोधी पैटर्न है। यहां कुछ पेज हैं math in SQL

यह विज्ञापन-परीक्षण परीक्षण के लिए निश्चित रूप से पर्याप्त है। उत्पादन कोड में, संकेत निश्चित रूप से अधिक अभिव्यक्तिपूर्ण हैं!

+1

यह बेहद चालाक है, लेकिन एक दस्तावेज फीचर की बजाय कमी की लाभ लेता है, और शायद आवश्यकता के आधार पर सबसे अच्छा विकल्प नहीं है। – Paul

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^