我有一个表,CustPassMaster有16列,其中一个是CustNum varchar(8),我创建了一个索引IX_dbo_CustPassMaster_CustNum.当我运行我的SELECT语句时:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
它完全忽略了索引.这让我感到困惑,因为我有另一个表CustDataMaster,其中包含更多列(55),其中一个是CustNum varchar(8).我在此表中创建了此列的索引(IX_dbo_CustDataMaster_CustNum),并使用了几乎相同的查询:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
它使用我创建的索引.
这背后有什么具体的推理吗?为什么它会使用CustDataMaster中的索引,而不是来自CustPassMaster的索引?这是由于列数低吗?
第一个查询返回66行.对于第二行,返回1行.
另外需要注意:CustPassMaster有4991条记录,CustDataMaster有5376条记录.这可能是忽略指数的原因吗? CustPassMaster还具有具有相同CustNum值的重复记录.这是另一个因素吗?
我将此声明基于两个查询的实际执行计划结果.
以下是CustPassMaster的DDL(具有未使用索引的DDL):
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]
而CustDataMaster的DDL(我省略了很多不相关的字段):
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,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
我在这两个表中都没有聚簇索引,只有一个非聚簇索引.
忽略数据类型与存储的数据类型不完全匹配的事实.这些字段是IBM AS / 400 DB2数据库的备份,它们是兼容的数据类型. (我必须能够使用完全相同的查询来查询此备份数据库,并获得完全相同的结果.)
此数据仅用于SELECT语句.除了备份应用程序从AS / 400复制数据时,我不会对其执行任何INSERT / UPDATE / DELETE语句.