【发布时间】:2011-11-19 00:05:32
【问题描述】:
当我们添加或删除一个新索引来加速某些事情时,我们最终可能会减慢其他事情的速度。 为了防止这种情况,在创建新索引后,我正在执行以下步骤:
- 启动 Profiler,
- 运行包含大量查询的 SQL 脚本,我不想放慢速度
- 将跟踪从文件加载到表中,
- 在我添加(或删除)索引之前,根据之前运行的结果分析跟踪中的 CPU、读取和写入。
这是一种自动化,可以满足我的需求。但是,我不确定是否有更好的方法来做到这一点。有什么工具可以满足我的需求吗?
编辑 1 投票结束我的问题的人,你能解释一下你的理由吗?
编辑 2 我用谷歌搜索,但没有找到任何解释添加索引如何减慢选择的内容。然而,这是一个众所周知的事实,所以应该有什么东西在某个地方。如果什么都没发生,我可以稍后再写几个例子。
编辑 3 一个这样的例子是:两列高度相关,比如身高和体重。我们有一个关于高度的索引,它对我们的查询来说不够选择性。我们添加一个权重索引,并使用两个条件运行查询:身高范围和体重范围。因为优化器不知道相关性,它严重低估了我们查询的基数。
另一个例子是在增加的列上添加索引,例如 OrderDate,可能会严重减慢具有像 OrderDate>SomeDateAfterCreatingTheIndex 这样的条件的查询。
【问题讨论】:
-
嗯。我可以看到 一些操作 会因添加索引而减慢速度。我不希望 查询 受到影响。在最坏的情况下,我希望只有锁定操作(插入、删除或显式锁定查询)会受到影响。
-
@sehe:添加索引会减慢选择速度。这不太可能,但有可能。
-
一种模糊但潜在的情况是,当新索引不如以前用于查询的索引最优时,但由于统计数据过时、参数嗅探或其他可能导致优化器到错误的索引...
-
@sehe - Here is a recent example
startdate上的索引的可用性意味着选择查询比索引根本不存在时更糟糕。 -
@sehe - 更令人担忧的是,您可能还会遇到产品中的错误...Incorrect Results Caused By Adding an Index
标签: sql-server sql-server-2008 query-optimization sql-server-2008-r2