1
  1. 我从一个myview基于另一个视图的视图和一个mytable没有索引的表中选择,查询运行了40 分钟
  2. 我添加了 5 个索引mytable并重新运行myview,查询运行了3 分钟
  3. 我制作了这样的 mytable 副本:

    select * into mytableNEW from mytable

  4. 请注意,没有复制任何索引。
  5. 我重新运行myview(不要忘记指向新表),它花了3 分钟!

问题:为什么我的查询最初在没有索引的情况下需要 40 分钟,但是在表上创建索引然后将数据(没有索引)复制到另一个表后,查询速度非常显着?

4

1 回答 1

1

我的猜测(对于评论来说太长了)是视图的次优查询计划。

视图的查询计划基于视图首次运行的时间,而不是当前运行。随着时间的推移,表发生了变化,环境发生了变化,但视图继续使用原来的查询计划。我怀疑它正在执行嵌套循环连接,并且执行引擎足够聪明,可以动态查找和使用索引,即使没有重新编译查询。

当您将视图重新指向新表时,会针对当前环境重新编译视图,因此执行计划是最佳的。

这是一个猜测。由于缓存未命中造成的 40 分钟差异似乎非常大,除非数据非常非常大。

于 2012-12-26T22:38:18.177 回答