我设计了5个存储过程,它们几乎使用相同的连接条件,但where子句中的参数或值在不同的运行中都有所变化。 是没有where子句创建具有所有连接条件的视图,然后从视图查询或在视图上工作的最佳解决方案?如果我创建视图,可以自动更新视图吗? 我可以做类似的子查询或查询(我认为我读取的地方视图不支持子查询,但不是100%肯定)
select count(x1) as x1cnt, count(x2) as x2count
from (
select x1,x2,
(
case when x1 is 'y' then 1 else 0 end +
case when x2 is 'y' then 1 else 0 end
) per
from vw_viewname) v1
where v1.per = 1
更新如下:
In my queries i use joins similar to this also
select c1,c2,c3
FROM [[join conditions - 5 tables]]
Inner join
(
select x1,x2,x3, some case statements
FROM [[join conditions - 5 tables]]
where t1.s1 = val1 and t2.s2 = v2 etc
) s
on s.id = id
所以我使用了两次连接,所以我想我可以使用一些视图来减少它
答案 0 :(得分:2)
省略where子句可能会使查询运行得更慢,或者只是提供比特定查询更多的结果。但是你必须根据你的系统确定这是否有利。
您将获得要使用的公共视图结果表。 View在您使用它们时基本上运行查询,因此您将获得结果,就像您通过其他机制自己进行查询一样。您可以对视图执行子查询,就像它是另一个表一样。这应该不是问题。但是如果你有5个不同的查询做5个特定的事情,那么保留它可能是有益的。其中一个或两个可能被称为更多,你将使用一般视图表来权衡他们的表现,并且除了视图重用之外没有真正获得这样做。
如果您从中获得了一些特定的好处,我只会构建视图。
如果你发现它有用或者没有,我发现这个post that may be similar Dunno。
编辑:嗯,我认为这会让事情变得更糟。您只需要调用两次视图,如果它是一个通用视图,则意味着每个调用都将获得大量通用结果来处理。我想说的是只关注优化这些查询,以便为您提供所需的内容。那真的是你有5种不同的程序吗? :)
答案 1 :(得分:1)
这是5个不同的查询,所以请保持这样。
在视图中封装类似的JOIN是很诱人的,但在你知道之前,你可以在视图和糟糕的性能上查看视图。我已经多次见过它了。
视图中的“子查询”可能是指有限制的索引视图。
答案 2 :(得分:1)
除非您谈论索引视图,否则视图将实际运行脚本以按需生成视图。在这方面,它与使用子查询相同。
如果我是你,我会保持原样。看起来你应该压缩你的代码(5个脚本中的每一个都有几乎相同的代码),但是这里的重要内容非常重要。
答案 3 :(得分:0)
您可以在视图中包含子查询,这种方法是完全可以接受的。
答案 4 :(得分:0)
SQL Server视图支持子查询。并且,在某种意义上,视图自动更新自己,因为视图不是持久对象(除非您使用索引视图)。使用非索引视图时,每次查询视图时,都使用基础表。因此,您的视图将与它们所基于的表格一样是最新的。
听起来我觉得这里的观点很不错。
答案 5 :(得分:0)
创建视图很好,即使它包含一个子视图。您可以删除视图的位置。
你确定要在不使用群组的情况下使用COUNT吗?它计算包含非空值或参数的行数。
答案 6 :(得分:0)
我最近做了很多关于查询优化工具提供的简化的演示文稿。基本上,如果您已经充分计划了连接,系统可以看到它们是多余的并完全忽略它们。
http://msmvps.com/blogs/robfarley/archive/2008/11/09/join-simplification-in-sql-server.aspx
存储过程每次都会执行相同的工作(参数有一些效果),但视图(或内联TVF)将扩展到外部查询并简化。