[英]How to reduce clustered index scan cost by using SQL query
如何降低下述查询的聚簇索引扫描成本
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
请建议我如何降低索引扫描成本?
首先 - 如果您搜索RECORD_TYPE_CODE
您应该确保在该列上有索引。
除此之外主要有两件事:
不要使用SELECT *
- 它总是必须返回聚集索引才能获得完整的数据页面; 使用SELECT
显式指定要使用的列
如果可能的话,尝试找到一种覆盖非聚簇索引的方法,例如包含满足查询所需的所有列的索引
如果你有这样一个覆盖非聚簇索引,那么查询优化器很可能会使用覆盖索引(而不是实际的聚簇索引,即全表数据)来获取结果
您需要尝试使用覆盖索引。 但是你要遇到的问题是你正在使用SELECT *
。 你真的需要整个唱片吗?
无论哪种方式,将RECORD_TYPE_CODE
添加到另一个索引,它将有助于查询,因为至少可以从索引页读取该字段。
在您的查询中,您使用了列RECORD_TYPE_CODE
,它不是clustered index
一部分,也不包含在任何non-clustered index
。 因此,SQL Optimizer将决定扫描聚簇索引以比较where子句谓词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.