Saya punya tabel, CustPassMaster
dengan 16 kolom di dalamnya, salah satunya adalah CustNum varchar(8)
, dan saya membuat indeks IX_dbo_CustPassMaster_CustNum
. Ketika saya menjalankan SELECT
pernyataan saya :
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Itu mengabaikan indeks sepenuhnya. Ini membingungkan saya karena saya memiliki meja lain CustDataMaster
dengan kolom lebih banyak (55), salah satunya adalah CustNum varchar(8)
. Saya membuat indeks pada kolom ini ( IX_dbo_CustDataMaster_CustNum
) di tabel ini, dan menggunakan kueri yang sama:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
Dan itu menggunakan indeks yang saya buat.
Apakah ada alasan khusus di balik ini? Mengapa menggunakan indeks dari CustDataMaster
, tetapi bukan yang dari CustPassMaster
? Apakah karena jumlah kolom yang rendah?
Kueri pertama mengembalikan 66 baris. Untuk yang kedua, 1 baris dikembalikan.
Juga, catatan tambahan: CustPassMaster
memiliki 4991 catatan, dan CustDataMaster
memiliki 5.376 catatan. Mungkinkah ini alasan di balik mengabaikan indeks? CustPassMaster
juga memiliki rekaman duplikat yang memiliki nilai yang sama CustNum
juga. Apakah ini faktor lain?
Saya mendasarkan klaim ini pada hasil rencana eksekusi aktual dari kedua pertanyaan.
Ini adalah DDL untuk CustPassMaster
(yang memiliki indeks yang tidak digunakan):
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]
Dan DDL untuk CustDataMaster
(Saya telah menghilangkan banyak bidang yang tidak relevan):
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]
Saya tidak memiliki indeks berkerumun di salah satu tabel tersebut, hanya satu indeks yang tidak tercakup.
Abaikan fakta bahwa tipe data tidak sepenuhnya cocok dengan tipe data yang disimpan. Bidang-bidang ini adalah cadangan dari basis data IBM AS / 400 DB2, dan ini adalah tipe data yang kompatibel untuknya. (Saya harus dapat menanyakan database cadangan ini dengan pertanyaan yang sama persis , dan mendapatkan hasil yang sama persis .)
Data ini hanya digunakan untuk SELECT
pernyataan. Saya tidak melakukan pernyataan INSERT
/ UPDATE
/ DELETE
di atasnya, kecuali ketika aplikasi cadangan menyalin data dari AS / 400.