Eu tenho uma tabela, CustPassMaster
com 16 colunas, uma das quais é CustNum varchar(8)
, e eu criei um índice IX_dbo_CustPassMaster_CustNum
. Quando executo minha SELECT
declaração:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Ele ignora o índice completamente. Isso me confunde, pois tenho outra tabela CustDataMaster
com muito mais colunas (55), uma das quais é CustNum varchar(8)
. Criei um índice nesta coluna ( IX_dbo_CustDataMaster_CustNum
) nesta tabela e use praticamente a mesma consulta:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
E ele usa o índice que eu criei.
Existe algum raciocínio específico por trás disso? Por que ele usaria o índice de CustDataMaster
, mas não o de CustPassMaster
? É devido à baixa contagem de colunas?
A primeira consulta retorna 66 linhas. Para o segundo, uma linha é retornada.
Nota adicional: CustPassMaster
possui 4991 registros e CustDataMaster
5376 registros. Poderia ser esse o raciocínio por trás da ignorância do índice? CustPassMaster
também possui registros duplicados com os mesmos CustNum
valores. Esse é outro fator?
Estou baseando essa afirmação nos resultados reais do plano de execução de ambas as consultas.
Aqui está o DDL para CustPassMaster
(aquele com o índice não utilizado):
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]
E o DDL para CustDataMaster
(omiti muitos campos irrelevantes):
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]
Não tenho um índice agrupado em nenhuma dessas tabelas, apenas um índice não clusterizado.
Ignore o fato de que os tipos de dados não correspondem inteiramente ao tipo de dados que estão sendo armazenados. Esses campos são um backup de um banco de dados IBM AS / 400 DB2 e esses são os tipos de dados compatíveis para ele. (Preciso consultar esse banco de dados de backup exatamente com as mesmas consultas e obter exatamente os mesmos resultados.)
Esses dados são usados apenas para SELECT
instruções. Não faço nenhuma declaração INSERT
/ UPDATE
/ DELETE
, exceto quando o aplicativo de backup está copiando dados do AS / 400.