У мене є таблиця 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.