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