如何使用SQL查询降低聚簇索引扫描成本

时间:2012-08-06 10:23:49

标签: sql-server indexing

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

DECLARE @PARAMVAL varchar(3)

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

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

请在下面的表中找到特殊情况:

enter image description here

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

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

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

3 个答案:

答案 0 :(得分:30)

首先 - 如果您搜索RECORD_TYPE_CODE,则应确保在该列上有索引。

除此之外主要有两件事:

  • 使用SELECT * - 总是必须返回聚集索引才能获得完整的数据页;使用明确指定要使用哪些列的SELECT

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

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

答案 1 :(得分:0)

您需要尝试使用覆盖索引。但是你要遇到的问题是你正在使用SELECT *。你真的需要整个记录吗?

无论哪种方式,将RECORD_TYPE_CODE添加到另一个索引,它将有助于查询,因为至少可以从索引页读取该字段。

答案 2 :(得分:0)

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

Why is there a scan on my clustered index?