2010-06-10 73 views
0

我想知道在存储过程中使用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. 

现在,我可以创建所有即将查询视图/临时表/直接查询使用。

在这种情况下最好使用什么。

回答

1

如果triggertable只在安装时创建一次,那么只需直接查询表。如果您将SQL查询包装在事务中,以防止其他用户在查询时更新triggertable

在这种情况下使用视图没有任何好处。

您可以将triggertable复制到临时表中,但在这种情况下我看不到任何实际的好处。

0

它始终是来自同一来源的数据加入?如果是这种情况,视图索引可以提高性能。

我可以看到一个临时表的唯一原因是如果你有一个WHERE在那里,选择一个小的子集,所有后续的6-7查询可以使用,但你没有声明单向或其他你的问题。

两个选项可以同时使用,但也有更多的因素,你不提,如总数据等

的大小,否则我不会理会,只是直接查询表,因为这样select triggertable.a, t2.b, t3.c from triggertable join t2 join t3 ...

+0

是的,可触发表的来源将始终相同。它将始终具有相同的列号和相同的名称。只有我需要的是在不同的存储过程的多个地方使用该表的子集。即使我提到的这个观点也可能在多个程序中使用。 – 2010-06-10 08:30:00