Ho una tabella, CustPassMaster
con 16 colonne, una delle quali è CustNum varchar(8)
, e ho creato un indice IX_dbo_CustPassMaster_CustNum
. Quando eseguo la mia SELECT
dichiarazione:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Ignora completamente l'indice. Questo mi confonde perché ho un'altra tabella CustDataMaster
con molte più colonne (55), una delle quali è CustNum varchar(8)
. Ho creato un indice su questa colonna ( IX_dbo_CustDataMaster_CustNum
) in questa tabella e uso praticamente la stessa query:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
E utilizza l'indice che ho creato.
C'è qualche ragionamento specifico dietro questo? Perché dovrebbe usare l'indice di CustDataMaster
, ma non quello di CustPassMaster
? È dovuto al numero di colonne basso?
La prima query restituisce 66 righe. Per la seconda, viene restituita 1 riga.
Inoltre, nota aggiuntiva: CustPassMaster
ha 4991 record e CustDataMaster
5376 record. Potrebbe essere questo il ragionamento alla base dell'ignorare l'indice? CustPassMaster
ha anche record duplicati che hanno gli stessi CustNum
valori. Questo è un altro fattore?
Sto basando questa affermazione sui risultati del piano di esecuzione effettivo di entrambe le query.
Ecco il DDL per CustPassMaster
(quello con l'indice inutilizzato):
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 il DDL per CustDataMaster
(ho omesso molti campi irrilevanti):
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]
Non ho un indice cluster su nessuna di quelle tabelle, solo un indice non cluster.
Ignora il fatto che i tipi di dati non corrispondono interamente al tipo di dati archiviati. Questi campi sono un backup da un database IBM AS / 400 DB2 e questi sono i tipi di dati compatibili per esso. (Devo essere in grado di interrogare questo database di backup con le stesse identiche query e ottenere il stessi esatti risultati.)
Questi dati vengono utilizzati solo per le SELECT
dichiarazioni. Non faccio alcuna dichiarazione INSERT
/ UPDATE
/ DELETE
su di esso, tranne quando l'applicazione di backup sta copiando i dati dall'AS / 400.