27

如何降低下面提到的查询的聚集索引扫描成本

DECLARE @PARAMVAL varchar(3)

set @PARAMVAL = 'CTD'
select * from MASTER_RECORD_TYPE where RECORD_TYPE_CODE=@PARAMVAL

如果我运行上面的查询,它显示索引扫描 99 %

请在下面找到我的表格细节:

在此处输入图像描述

下面我粘贴了我的表格索引:

CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD  CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED 
(
    [Record_Type_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO

请告知我如何降低索引扫描成本?

4

3 回答 3

32

首先 - 如果你搜索RECORD_TYPE_CODE你应该确保在该列上有一个索引。

除此之外主要有两点:

  • 不要使用SELECT *——它总是必须返回聚集索引来获取完整的数据页;使用SELECT明确指定要使用的列的a

  • 如果可能的话,尝试找到一种方法来拥有一个覆盖的非聚集索引,例如一个包含满足查询所需的所有列的索引

如果您有这样一个覆盖非聚集索引,那么查询优化器很可能会使用该覆盖索引(而不是作为全表数据的实际聚集索引)来获取结果

于 2012-08-06T10:26:46.907 回答
1

您需要尝试使用覆盖索引。但是您将遇到的问题是您正在使用SELECT *. 你真的需要整张唱片吗?

无论哪种方式,添加RECORD_TYPE_CODE到另一个索引都会对查询有所帮助,因为至少可以从索引页面中读取该字段。

于 2012-08-06T10:27:47.083 回答
0

在您的查询中,您使用RECORD_TYPE_CODE了不属于clustered index且也不包含在其中的列non-clustered index。因此 SQL Optimizer 将决定扫描聚集索引以比较 where 子句谓词。

为什么对我的聚集索引进行扫描?

于 2012-08-06T10:32:34.083 回答