Ich habe eine Tabelle CustPassMaster
mit 16 Spalten, von denen eine ist CustNum varchar(8)
, und ich habe einen Index erstellt IX_dbo_CustPassMaster_CustNum
. Wenn ich meine SELECT
Aussage mache:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Der Index wird vollständig ignoriert. Das verwirrt mich, da ich eine andere Tabelle CustDataMaster
mit viel mehr Spalten habe (55), von denen eine ist CustNum varchar(8)
. Ich habe einen Index für diese Spalte ( IX_dbo_CustDataMaster_CustNum
) in dieser Tabelle erstellt und verwende praktisch dieselbe Abfrage:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
Und es verwendet den Index, den ich erstellt habe.
Gibt es dafür eine bestimmte Begründung? Warum sollte es den Index von verwenden CustDataMaster
, aber nicht den von CustPassMaster
? Liegt es an der geringen Spaltenanzahl?
Die erste Abfrage gibt 66 Zeilen zurück. Für die zweite Zeile wird 1 Zeile zurückgegeben.
Zusätzlicher Hinweis: CustPassMaster
4991 Datensätze und CustDataMaster
5376 Datensätze. Könnte dies der Grund dafür sein, den Index zu ignorieren? CustPassMaster
hat auch doppelte Datensätze, die die gleichen CustNum
Werte haben. Ist das ein weiterer Faktor?
Ich stütze diese Behauptung auf die tatsächlichen Ausführungsplanergebnisse beider Abfragen.
Hier ist die DDL für CustPassMaster
(die mit dem nicht verwendeten Index):
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]
Und die DDL für CustDataMaster
(ich habe viele irrelevante Felder weggelassen):
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]
Ich habe keinen Clustered-Index für eine dieser Tabellen, nur einen Nonclustered-Index.
Ignorieren Sie die Tatsache, dass die Datentypen nicht vollständig mit dem gespeicherten Datentyp übereinstimmen. Diese Felder sind eine Sicherung aus einer IBM AS / 400-DB2-Datenbank, und dies sind die kompatiblen Datentypen dafür. (Ich muss in der Lage sein, diese Sicherungsdatenbank mit denselben Abfragen abzufragen und dieselben Ergebnisse zu erzielen.)
Diese Daten werden nur für SELECT
Aussagen verwendet. Ich mache keine INSERT
/ UPDATE
/ DELETE
Aussagen auf sie, mit Ausnahme , wenn die Backup - Anwendung ist das Kopieren von Daten aus dem AS / 400.