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. CustDataMaster
Biri daha fazla sütun (55) ile başka bir tablo var gibi bu beni şaşırttı CustNum varchar(8)
. IX_dbo_CustDataMaster_CustNum
Bu 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: CustPassMaster
4991 kaydı ve CustDataMaster
5376 kaydı vardır. Dizini görmezden gelmenin ardındaki sebep bu olabilir mi? CustPassMaster
ayrıca aynı CustNum
değ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
/ DELETE
ifadesi yapmıyorum .