您如何确保新索引不会减慢查询速度?

A-K*_*A-K 19 sql-server query-optimization sql-server-2008 sql-server-2008-r2

当我们添加或删除新索引以加速某些事情时,我们最终可能会放慢速度.为了防止这种情况,在创建新索引后,我正在执行以下步骤:

  1. 启动Profiler,
  2. 运行一个包含大量查询的SQL脚本,我不想放慢速度
  3. 将跟踪从文件加载到表中,
  4. 在添加(或删除)索引之前,分析来自跟踪的CPU,读取和写入以及先前运行的结果.

这是一种自动化的,可以满足我的需求.但是,我不确定是否有更好的方法.是否有一些工具可以满足我的需求?

编辑1投票结束我的问题的人,你能解释一下你的理由吗?

编辑2我搜索了,但没有找到任何解释如何添加索引可以减慢选择.然而,这是一个众所周知的事实,所以应该有某种东西.如果什么都没有出现,我可以稍后写几个例子.

编辑3一个这样的例子是:两列高度相关,如身高和体重.我们有一个高度索引,对我们的查询来说没有足够的选择性.我们在权重上添加一个索引,并运行一个包含两个条件的查询:高度范围和权重范围.因为优化器不知道相关性,所以它严重低估了查询的基数.

另一个例子是在增加列上添加索引(例如OrderDate)会严重减慢查询的速度,如OrderDate> SomeDateAfterCreatingTheIndex.

Rem*_*anu 8

最终你要问的内容可以改为'我怎样才能确保已经使用最优,快速计划的查询不会被"优化"为更糟糕的执行计划?.

由于参数嗅探,统计更新或元数据更改(例如添加新索引),计划是否发生变化,我知道的最佳答案是保持计划稳定是计划指南.为已经具有良好执行计划的关键查询部署计划指南可能是强制优化程序继续使用良好,经过验证的计划的最佳方法.请参阅将固定查询计划应用于计划指南:

您可以将固定查询计划应用于OBJECT或SQL类型的计划指南.当您了解现有执行计划的性能优于优化程序为特定查询选择的执行计划时,应用固定查询计划的计划指南非常有用.

通常的警告适用于任何可能滥用的功能,阻止优化器使用可能实际上比计划指南更好的计划.


seh*_*ehe 0

从“查询性能调优”页面

\n\n

改善指数

\n\n

此页面提供了许多有用的分步提示,介绍如何调整索引以获得最佳性能以及需要注意的事项(分析)。

\n\n
\n

与大多数性能优化技术一样,需要权衡。例如,索引越多,SELECT 查询的运行速度可能会更快。但是,DML(INSERT、UPDATE 和 DELETE)操作将显着减慢,因为每个操作必须维护更多索引。因此,如果您的查询主要是 SELECT 语句,那么更多索引会有所帮助。如果您的应用程序执行许多 DML 操作,则您应该谨慎选择创建的索引数量。

\n
\n\n

其他资源:

\n\n\n\n
\n

然而,重要的是要记住,非聚集索引会减慢数据修改和插入过程,因此索引应保持在最低限度

\n
\n\n\n\n
\n

SQL Server 中的碎片索引和表会降低应用程序性能。这是一个在 SQL 服务器和数据库中查找碎片索引的存储过程。

\n
\n

  • 谢谢,但我并不是在询问有关索引调整的通用指南。我的问题是如何有效地实施具体步骤以确保满足这些准则。因此,您的答案与我的问题不符。 (2认同)