CustPassMasterİçinde 16 sütun olan bir tablo var , bunlardan biri CustNum varchar(8)ve bir dizin oluşturdum IX_dbo_CustPassMaster_CustNum. İfademi çalıştırdığımda SELECT:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Dizini tamamen yok sayar. CustDataMasterBiri daha fazla sütun (55) ile başka bir tablo var gibi bu beni şaşırttı CustNum varchar(8). IX_dbo_CustDataMaster_CustNumBu tablodaki bu sütunda ( ) bir dizin oluşturdum ve hemen hemen aynı sorguyu kullanıyorum:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
Ve oluşturduğum endeksi kullanıyor.
Bunun arkasında belirli bir gerekçe var mı? Neden dizinini kullanıyor CustDataMaster, ama dizinini kullanmıyor CustPassMaster? Düşük sütun sayısından mı kaynaklanıyor?
İlk sorgu 66 satır döndürür. İkincisi için 1 satır döndürülür.
Ayrıca, ek not: CustPassMaster4991 kaydı ve CustDataMaster5376 kaydı vardır. Dizini görmezden gelmenin ardındaki sebep bu olabilir mi? CustPassMasterayrıca aynı CustNumdeğerlere sahip yinelenen kayıtlara da sahiptir . Bu başka bir faktör mü?
Bu iddiayı her iki sorgunun gerçek yürütme planı sonuçlarına dayandırıyorum.
İşte DDL CustPassMaster(kullanılmayan dizine sahip olan):
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]
Ve DDL için CustDataMaster(alakasız alanları atladım):
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]
Bu tabloların hiçbirinde kümelenmiş bir dizin yok, yalnızca bir kümelenmemiş dizin.
Veri türlerinin depolanan veri türüyle tamamen eşleşmediğini dikkate almayın. Bu alanlar bir IBM AS / 400 DB2 veritabanının yedeğidir ve bunlar onun için uyumlu veri türleridir. (Bu yedekleme veritabanını tam olarak aynı sorgularla sorgulayabilmeli ve aynı sonuçları elde edebilmeliyim.)
Bu veriler yalnızcaSELECT ifadeler için kullanılır . Yedekleme uygulaması AS / 400'den veri kopyaladığı zamanlar dışında herhangi bir INSERT/ UPDATE/ DELETEifadesi yapmıyorum .