【问题标题】:SQL Execution Plan High Cost 70%SQL 执行计划高成本 70%
【发布时间】:2013-07-17 04:37:51
【问题描述】:

我正在运行一个需要 2 秒的查询,但它应该执行得更好,所以我从 SQL Managemenet Studio 运行执行计划详细信息,我发现流程中有一个“步骤”,成本为 70%。

然后,我右键单击该项目,然后我找到了一个显示“缺少索引详细信息”的选项,单击后会生成一个带有推荐的查询:

/*
Missing Index Details from SQLQuery15.sql - (local).application_prod (appprod (58))
The Query Processor estimates that implementing the following index could improve the query cost by 68.8518%.
*/

/*
USE [application_prod]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[cloud_document] ([isactivedocument])
INCLUDE ([objectuid])
GO
*/

所以我的问题是如果我执行查询会发生什么?它会影响我的数据库吗,应用后是否有任何副作用或副作用?

非常感谢并提前感谢。

【问题讨论】:

  • 如果可以的话,您应该以 XML 格式发布整个执行计划(右键单击执行计划 > 另存为 XML ...)。我们需要了解正在发生的事情的全貌。

标签: sql sql-server database clustered-index


【解决方案1】:

运行查询会在指定的表 (cloud_document) 上创建一个索引。

这应该会提高读取性能并提高性能/查询时间。

它也会影响 INSERT/UPDATE/DELETE 语句的性能,因为在这些语句期间需要维护索引。

决定使用索引、索引的数量以及索引的组成部分是一门艺术,而不是一门精确的科学。

索引、碎片整理和统计信息的实际维护是可以自动化的,但应该保留,直到您更好地了解索引是什么以及它们的作用。

我建议您开始阅读一些有关索引的文档。

可以以Stairway to SQL Server Indexes开头

【讨论】:

  • 那么您认为这样做有什么好处吗?在那之后我是否需要进行任何维护或某些任务?非常感谢@astander
【解决方案2】:

字面意思是告诉你在表[dbo].[cloud_document]的isactivedocument上建立一个索引,我假设你使用isactivedocument作为过滤表的条件,并选择列objectuid。像

select objectuid, ... from [dbo].[cloud_document] where isactivedocument = 0/1

请注意,“聚集索引扫描 (70%)”并不意味着它是聚集索引的问题。这意味着您在 isactivedocument 上没有索引,那么 sql 引擎必须扫描聚集索引以找到您想要的。这就是它承受如此大压力的原因。在 isactivedocument 上创建索引后,再次检查计划,您会看到节点变为“索引搜索”,这是一种更快找到所需内容的方法。

通常如果您的数据库压力主要来自查询,那么新索引不会对您的系统造成太大伤害。继续创建索引。但当然,您需要尽可能减少索引数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多