मेरे पास एक टेबल है, CustPassMaster
जिसमें 16 कॉलम हैं, जिनमें से एक है CustNum varchar(8)
, और मैंने एक इंडेक्स बनाया है IX_dbo_CustPassMaster_CustNum
। जब मैं अपना SELECT
बयान चलाता हूं :
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
यह सूचकांक को पूरी तरह से अनदेखा करता है। यह मुझे भ्रमित करता है क्योंकि मेरे पास एक और तालिका है CustDataMaster
जिसमें अधिक कॉलम (55) हैं, जिनमें से एक है CustNum varchar(8)
। मैंने IX_dbo_CustDataMaster_CustNum
इस तालिका में इस कॉलम ( ) पर एक इंडेक्स बनाया है , और व्यावहारिक रूप से समान क्वेरी का उपयोग करें:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
और यह मेरे द्वारा बनाए गए सूचकांक का उपयोग करता है।
क्या इसके पीछे कोई खास तर्क है? यह सूचकांक का उपयोग क्यों करेगा CustDataMaster
, लेकिन इससे नहीं CustPassMaster
? क्या यह कम कॉलम की गिनती के कारण है?
पहली क्वेरी में 66 पंक्तियाँ हैं। दूसरे के लिए, 1 पंक्ति वापस आ गई है।
इसके अलावा, अतिरिक्त नोट: CustPassMaster
4991 रिकॉर्ड है, और CustDataMaster
5376 रिकॉर्ड है। क्या सूचकांक को नजरअंदाज करने के पीछे यह तर्क हो सकता है? CustPassMaster
इसके पास डुप्लिकेट रिकॉर्ड भी हैं जो समान CustNum
मान भी रखते हैं। क्या यह एक और कारक है?
मैं दोनों दावों के वास्तविक निष्पादन योजना परिणामों पर इस दावे को आधार बना रहा हूं।
यहां डीडीएल के लिए CustPassMaster
(अप्रयुक्त सूचकांक के साथ एक) है:
CREATE TABLE dbo.CustPassMaster(
[CustNum] [varchar](8) NOT NULL,
[Username] [char](15) NOT NULL,
[Password] [char](15) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustPassMaster_CustNum] ON dbo.CustPassMaster
(
[CustNum] ASC
) WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
और CustDataMaster
(मैं बहुत अप्रासंगिक क्षेत्रों को छोड़ दिया है) के लिए DDL :
CREATE TABLE dbo.CustDataMaster(
[CustNum] [varchar](8) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustDataMaster_CustNum] ON dbo.CustDataMaster
(
[CustNum] ASC
)WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
मेरे पास उन तालिकाओं में से कोई भी एक अव्यवस्थित सूचकांक नहीं है, केवल एक गैर-अनुक्रमित सूचकांक है।
इस तथ्य को अनदेखा करें कि डेटाटाइप्स पूरी तरह से संग्रहीत किए जा रहे डेटा से मेल नहीं खाते हैं। ये फ़ील्ड IBM AS / 400 DB2 डेटाबेस से बैकअप हैं, और ये इसके लिए संगत डेटाटाइप हैं। (मुझे इस बैकअप डेटाबेस को सटीक प्रश्नों के साथ क्वेरी करने में सक्षम होना चाहिए , और सटीक समान परिणाम प्राप्त करना चाहिए ।)
यह डेटा केवलSELECT
बयानों के लिए उपयोग किया जाता है । मैं इस पर कोई INSERT
/ UPDATE
/ DELETE
बयान नहीं करता , सिवाय इसके कि जब बैकअप एप्लिकेशन एएस / 400 से डेटा कॉपी कर रहा हो।