2013-05-10 86 views
1

我们有查看表并从视图中选择通常需要太多时间。例如: :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'与一行。

这个场景在上面进行了分析, 你认为这可能是花费这么多时间来查询第三个查询的原因。 我们尝试加入,但没有奏效。

+0

你在你的最后一句话的意思是,“它不工作”?你有错误吗?你没有得到所需的结果吗?是否只要您现有的查询(或更长)?你能发表你的观点的定义吗? table1已经在使用了吗?通常会从表1中选择多少个不同的x值,其中y ='1234'?你使用的表格有哪些索引?哪个RDBMS(SQLServer,Oracle,MySQL等)是这样的? – 2013-05-10 07:41:48

回答

2
  • 视图是不是有些神奇的一段时间可以节省代码
  • 视图是扩展宏:无多,不会少

所以,如果您的视图有5桌和4的JOIN ,这些将每评估

所以,我的问题应该是:

是否有在视图中生成列X的一些基本表的基础上栏适合索引?

至于你的最后一个SQL,你要为视图内容添加一个额外的IN子句和子查询。
请注意,你可能知道只有一行返回,但优化器可能不会因为或贫穷或过时的统计数据,和/或坏的索引

我的下一个问题

是否table1中具有良好的索引满足子查询的效率?

不管怎样,看着查询计划将帮助你找出什么错误

+0

感谢您的回复,我相信它与优化器行为有关,因为我们尝试了几乎所有可能的查询方法。 – 2013-05-10 08:19:32

+0

优化器是相当可预测的:但使用视图并且没有索引限制了它的选项 – gbn 2013-05-10 09:10:57