myview
视图和没有索引的表mytable
中选择,查询运行 40分钟 mytable
添加了5个索引,然后重新myview
,查询运行 3分钟 我像这样制作了mytable的副本:
选择*进入mytableNEW 来自mytable
myview
(不要忘记指向新表),花了 3分钟!! 问题:为什么我的查询最初需要40分钟而没有索引,但在表上创建索引然后将数据(没有索引)复制到另一个表后,查询加速了很多?
答案 0 :(得分:1)
我的猜测(评论太长)是视图的次优查询计划。
视图的查询计划基于首次运行视图的时间,而不是当前运行的视图。随着时间的推移,表格发生了变化,环境发生了变化,但视图继续使用原始查询计划。我怀疑它正在进行嵌套循环连接,并且执行引擎足够智能,可以动态查找和使用索引,即使不重新编译查询。
当您将视图重新命名为新表时,会针对当前环境重新编译视图,因此执行计划是最佳的。
这是猜测。由于缓存未命中而导致的40分钟差异似乎非常大,除非数据真的非常大。