2010-06-10 70 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