【问题标题】:querying view is taking too much time查询视图花费了太多时间
【发布时间】:2013-05-10 06:01:47
【问题描述】:

我们有一个视图表,从视图中选择通常会花费太多时间。 例如:select x,y,z from view1 加载时间过长。这个还行。

如果您查询:select x,y,z from view1 where x in ('abc') 在几秒钟内查询。

如果您查询:select x,y,z from view1 where x in (select 'abc' from table1 where y='1234') 在几秒钟内查询。

但如果你查询: select x,y,z from view1 where x in (select x from table1 where y='1234') 查询时间过长,这是我们要解决的问题。

顺便说一句,你可以认为:select x from table1 where y='1234' 返回'abc' 一行。

上面描述的场景, 您认为在第三个查询上花费这么多时间进行查询的原因可能是什么。 我们尝试加入,但没有成功。

【问题讨论】:

  • 你最后一句“它没有用”是什么意思?你收到错误了吗?您是否未能获得所需的结果?是否与您现有的查询一样长(或更长)?你能发布你的观点的定义吗? table1 是否已经在其中使用?通常会从 y='1234' 的 table1 中选择多少个不同的 x 值?您对正在使用的表有哪些索引?这是哪个 RDBMS(SQLServer、Oracle、MySQL 等)?

标签: sql view


【解决方案1】:
  • 视图并不是一段神奇的省时代码
  • 视图是扩展的宏:不多也不少

因此,如果您的视图有 5 个表和 4 个 JOIN,则每次都会对它们进行评估。

所以,我的问题应该是:

在视图中生成列 x 的某些基表中的基础列是否有合适的索引?

至于您的最后一条 SQL,您正在向视图内容添加额外的 IN 子句和子查询。
请注意,您可能知道只返回一行,但优化器可能不会因为统计数据不佳或过时,和/或索引错误

我的下一个问题

table1 是否有良好的索引来有效地满足子查询?

无论哪种方式,查看查询计划将帮助您找出问题所在

【讨论】:

  • 感谢您的回复,我认为这与优化器的行为有关,因为我们已经尝试了几乎所有可能的查询方法。
  • 优化器是相当可预测的:但是使用视图并且没有索引限制了它的选项
猜你喜欢
  • 2013-07-11
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多