ผมมีตาราง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