Sql server 如何使用SQL查询降低聚集索引扫描成本
如何降低以下查询的聚集索引扫描成本Sql server 如何使用SQL查询降低聚集索引扫描成本,sql-server,indexing,Sql Server,Indexing,如何降低以下查询的聚集索引扫描成本 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_
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
请告知我如何降低索引扫描成本?首先-如果您搜索
记录\u TYPE\u code
,您应该确保该列上有索引
除此之外,主要有两件事:
- 不要使用
——这将始终必须返回到聚集索引才能获得完整的数据页;使用明确指定要使用哪些列的选择*
选择
- 如果可能的话,尝试找到一种方法,使覆盖非聚集索引,例如,包含满足查询所需的所有列的索引
如果您有这样一个覆盖非聚集索引,那么查询优化器很可能会使用该覆盖索引(而不是实际的聚集索引,它是完整的表数据)来获取结果您需要尝试使用覆盖索引。但问题是您使用的是
SELECT*
。你真的需要整张唱片吗
无论哪种方式,都可以将
RECORD\u TYPE\u code
添加到另一个索引中,这将有助于查询,因为至少可以从索引页读取该字段。在查询中,您使用了列RECORD\u TYPE\u code
,它不属于聚集索引,也不包括在任何非聚集索引中。所以SQL优化器将决定扫描聚集索引以比较where子句谓词
你好,mate,谢谢你的及时回复,即使我使用了“从主记录类型中选择1”,也会产生相同的索引扫描成本。谢谢你的及时回复,请你指导我创建一个覆盖非聚集索引,该索引中包含哪些键你能帮我解决mate创建非聚集索引的问题吗[dbo]上的[MST_IDX_FOR_REC_TYPE]。[MASTER_RECORD_TYPE]([RECORD_TYPE_Code]ASC)与[PRIMARY]上的(PAD_INDEX=OFF,STATISTICS_norecocompute=OFF,SORT_IN_TEMPDB=OFF,IGNORE_DUP_KEY=OFF,DROP_EXISTING=OFF,ONLINE=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)一起GO Now index scan已经变成了100%@user1494292的索引搜索:好了-现在你有了索引搜索-这是获取(几行)数据的最有效(也是最快)的方法,是的,它是聚集索引=表的一部分。没有其他索引。