【问题标题】:How to reduce clustered index scan cost by using SQL query如何使用 SQL 查询降低聚集索引扫描成本
【发布时间】:2012-08-03 07:34:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server indexing


    【解决方案1】:

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

    除此之外主要有两点:

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

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

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

    【讨论】:

    • 感谢您的及时回复,请您指导我创建一个覆盖的非聚集索引,该索引中要包含哪些键您能帮我解决这个问题
    • 创建非聚类索引 [MST_IDX_FOR_REC_TYPE] ON [dbo].[MASTER_RECORD_TYPE] ([Record_Type_Code] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING =, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO 现在索引扫描已经变成了 100% 的索引查找
    • @user1494292:好的 - 现在你有了 index seek - 这是获取(几行)数据的最有效(也是最快)的方法
    【解决方案2】:

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

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

    【讨论】:

    • 嗨,伙计,感谢您的及时回复,即使我使用从 Master_record_type 中选择 1 也会引发相同的索引扫描成本
    【解决方案3】:

    在您的查询中,您使用了列RECORD_TYPE_CODE,它不属于clustered index,也不包含在任何non-clustered index 中。所以SQL Optimizer会决定扫描聚集索引来比较where子句谓词。

    Why is there a scan on my clustered index?

    【讨论】:

    • 嗯,是的,它是聚集索引 = 表的一部分。没有其他索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多