创建没有索引的表的副本

时间:2012-12-26 22:28:15

标签: sql sql-server sql-server-2008 tsql

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

    选择*进入mytableNEW 来自mytable

  4. 请注意,没有复制索引。
  5. 我重新myview(不要忘记指向新表),花了 3分钟!!
  6. 问题:为什么我的查询最初需要40分钟而没有索引,但在表上创建索引然后将数据(没有索引)复制到另一个表后,查询加速了很多?

1 个答案:

答案 0 :(得分:1)

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

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

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

这是猜测。由于缓存未命中而导致的40分钟差异似乎非常大,除非数据真的非常大。