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