ผมมีตาราง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ค่าเหมือนกันเช่นกัน นี่เป็นปัจจัยอื่นหรือไม่
ฉันอ้างอิงข้อเรียกร้องนี้กับผลลัพธ์การดำเนินการตามจริงของแบบสอบถามทั้งสองรายการ
นี่คือ DDL สำหรับ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]
และ DDL สำหรับCustDataMaster(ฉันได้เว้นฟิลด์ที่ไม่เกี่ยวข้องจำนวนมาก):
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คำสั่งใด ๆยกเว้นเมื่อแอปพลิเคชันสำรองกำลังคัดลอกข้อมูลจาก AS / 400