我想知道在存储过程中使用Views, Temp Tables and Direct Queries的性能。
每次触发触发器时,我都会创建一个表。我知道这个触发器会非常罕见,并且只会在设置的时候触发一次。
现在,我必须在许多地方使用从触发器创建的表来获取数据,并且我确认没有人在该表中进行任何更改。即ReadOnly表。
我必须使用这些表数据以及多个表来连接和获取结果,以便进行进一步的查询,例如
select * from triggertable使用临时表
select ... into #tx from triggertable join t2 join t3 and so on
select a,b, c from #tx --do something
select d,e,f from #tx ---do somethign
--and so on
--around 6-7 queries in a row in a stored procedure.使用视图
create view viewname
(
select ... from triggertable join t2 join t3 and so on
)
select a,b, c from viewname --do something
select d,e,f from viewname ---do somethign
--and so on
--around 6-7 queries in a row in a stored procedure.这个视图也可以在其他地方使用。所以我将在数据库而不是sp上创建
使用直接查询
select a,b, c from select ... into #tx from triggertable join t2 join t3 join ... --do something
select a,b, c from select ... into #tx from triggertable join t2 join t3 join ... --do something
.
.
--and so on
--around 6-7 queries in a row in a stored procedure.现在,我可以在所有后续查询中创建一个视图/临时表/直接查询用法。
在这种情况下什么才是最好的。
发布于 2010-06-10 08:11:46
如果在安装时只创建了一次triggertable,那么只需直接查询表。如果将SQL查询包装在事务中,则应防止其他用户在查询时更新triggertable。
在这种情况下使用视图没有好处。
您可以将triggertable复制到临时表中,但在这种情况下我看不到任何真正的好处。
发布于 2010-06-10 08:21:55
是否总是来自同一源的数据被加入?如果是这样的话,视图上的索引可以提高性能。
我能看到临时表的唯一原因是,如果其中有一个WHERE,它选择了所有后续6-7个查询都可以使用的一个小子集,但您在问题中没有这样或那样的方式。
这两个选项都可以结合使用,但是还有更多您没有提到的因素,比如总数据的大小等等。
否则,我不会像select triggertable.a, t2.b, t3.c from triggertable join t2 join t3 ...那样直接查询这些表。
https://stackoverflow.com/questions/3012588
复制相似问题