Tengo una tabla, CustPassMaster
con 16 columnas, una de las cuales es CustNum varchar(8)
, y creé un índice IX_dbo_CustPassMaster_CustNum
. Cuando ejecuto mi SELECT
declaración:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Ignora el índice por completo. Esto me confunde ya que tengo otra tabla CustDataMaster
con muchas más columnas (55), una de las cuales es CustNum varchar(8)
. Creé un índice en esta columna ( IX_dbo_CustDataMaster_CustNum
) en esta tabla, y utilizo prácticamente la misma consulta:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
Y usa el índice que creé.
¿Hay algún razonamiento específico detrás de esto? ¿Por qué usaría el índice de CustDataMaster
, pero no el de CustPassMaster
? ¿Se debe al bajo recuento de columnas?
La primera consulta devuelve 66 filas. Para el segundo, se devuelve 1 fila.
Además, nota adicional: CustPassMaster
tiene 4991 registros y CustDataMaster
5376 registros. ¿Podría ser este el razonamiento detrás de ignorar el índice? CustPassMaster
también tiene registros duplicados que tienen los mismos CustNum
valores también. ¿Es este otro factor?
Estoy basando esta afirmación en los resultados del plan de ejecución real de ambas consultas.
Aquí está el DDL para CustPassMaster
(el que tiene el índice no 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]
Y el DDL para CustDataMaster
(he omitido muchos 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]
No tengo un índice agrupado en ninguna de esas tablas, solo un índice no agrupado.
Ignore el hecho de que los tipos de datos no coinciden completamente con el tipo de datos que se almacenan. Estos campos son una copia de seguridad de una base de datos IBM AS / 400 DB2, y estos son los tipos de datos compatibles. (Tengo que poder consultar esta base de datos de respaldo con las mismas consultas exactas y obtener exactamente los mismos resultados).
Estos datos solo se usan para SELECT
declaraciones. No hago ninguna declaración INSERT
/ UPDATE
/ DELETE
en él, excepto cuando la aplicación de copia de seguridad está copiando datos del AS / 400.