2012-08-06 81 views
17

减少聚集索引扫描成本如何降低下面提到查询如何通过使用SQL查询

DECLARE @PARAMVAL varchar(3) 

set @PARAMVAL = 'CTD' 
select * from MASTER_RECORD_TYPE where [email protected] 

的聚集索引扫描的成本,如果我运行上面的查询它显示索引扫描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 

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

回答

23

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

除此之外主要有两点:

  • 使用SELECT * - 那会总是要回去的聚集索引,以获得完整的数据页;使用SELECT明确指定使用

  • 如果有可能,尽量找到一种方法,有一个覆盖非聚集索引,例如其列包含满足查询

所需的所有列。如果你有这样的覆盖非聚簇索引的索引,那么查询优化器将最有可能使用覆盖索引(而不是它是完整的实际聚集索引表中的数据),以获取结果

+0

感谢您的及时回复,你可以请指导我创建一个覆盖非聚集索引,被列入该指数是什么键你能帮助我的队友对这个 – user1494292 2012-08-06 10:35:59

+1

创建非聚集索引[MST_IDX_FOR_REC_TYPE ] ON [dbo]。[MASTER_RECORD_TYPE] ( \t [Record_Type_Code] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,IGNORE_DUP_KEY = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY ] GO现在索引扫描已经变成索引查找的100% – user1494292 2012-08-06 10:59:03

+1

@ user1494292:好的 - 所以现在你有**索引寻找** - 这是最有效(最快)的方式来获取(几行的)数据 – 2012-08-06 11:04:55

0

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

无论哪种方式,增加RECORD_TYPE_CODE到另一个指标,它会与查询帮助,因为至少该字段可以读出一个索引页。

+0

喜队友,感谢您的及时答复,即使如果我使用从Master_record_type选择1然后也相同的索引扫描成本它投掷 – user1494292 2012-08-06 10:33:20

0

在您的查询中,您使用的列不是clustered index的一部分,也未包含在non-clustered index中。因此,SQL Optimizer将决定扫描聚集索引来比较where子句谓词。

Why is there a scan on my clustered index?

+0

嗯,是它是聚集索引=表的一部分。没有其他索引。 – Suncat2000 2017-08-16 18:12:26