我有一个表,CustPassMaster
其中有16列,其中一个是CustNum varchar(8)
,并且创建了一个index 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'
它使用我创建的索引。
这背后有什么具体的理由吗?为什么要使用from的索引CustDataMaster
,而不使用from的索引CustPassMaster
?是由于列数少吗?
第一个查询返回66行。对于第二个,返回1行。
另外,还要注意:CustPassMaster
具有4991条记录和CustDataMaster
5376条记录。这可能是忽略索引的原因吗?CustPassMaster
也有具有相同CustNum
值的重复记录。这是另一个因素吗?
我将此主张基于两个查询的实际执行计划结果。
这是DDL CustPassMaster
(具有未使用的索引的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]
和DDL用于CustDataMaster
(我省略了许多无关的字段):
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]
我在那些表中都没有聚集索引,只有一个非聚集索引。
忽略数据类型与存储的数据类型不完全匹配的事实。这些字段是来自IBM AS / 400 DB2数据库的备份,并且是它们的兼容数据类型。(我必须能够使用完全相同的查询来查询此备份数据库,并获得完全相同的结果。)
此数据仅用于SELECT
语句。我没有做任何INSERT
/ UPDATE
/ DELETE
上陈述时,除备份应用程序从AS / 400复制数据。