2009-12-22 46 views
2

我設計了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 

,所以我使用連接兩次所以我想我可以減少它使用一些意見

回答

2

退出where子句可能會使查詢運行速度更慢,或者只給出比特定查詢更多的結果。但是你必須根據你的系統來確定這是否有利。

您將看到共同視圖結果表來使用。查看基本上運行查詢,當你使用它們,所以你會得到結果,就像你自己通過其他機制做了查詢一樣。您可以在視圖上進行子查詢,就像它是另一個表一樣。這應該不成問題。但是如果你有5個不同的查詢做5件特定的事情,那麼離開它可能是有益的。其中一個或兩個可能會被稱爲更多,你會用一個普通的視圖表來換取他們的表現,除了視圖重用以外,沒有什麼可以做的。

我只會構建視圖,如果你有這樣做的某些具體好處。

我還發現這post that may be similar如果你會發現它有幫助或不。

編輯:嗯,我認爲這隻會讓事情變得更糟。你只需要調用視圖兩次,如果它是一個通用視圖,則意味着每個調用都將獲得許多通用結果來處理。

我會說只是專注於優化這些查詢,給你你需要的東西。那真的是你有5個不同的程序嗎? :)

+0

很好的答案.... – gbn 2009-12-22 21:06:04

+0

我的5個SPS在where子句中我不斷加入爲每個新的條件不同,有一次性做到這一點的最好方法,還是應該讓他們保持獨立 – 2009-12-22 21:13:42

+1

我的經驗和理解是將視圖代入代碼中;允許優化器在編譯引用該查詢的查詢時「查看」視圖的定義。因此,將WHERE子句放在視圖內或放大視圖不會影響性能。 「SELECT * FROM 」==「SELECT * FROM WHERE 」 – MatBailie 2009-12-22 21:34:15

0

您可以在視圖中有子查詢,並且該方法是完全可以接受的。

0

SQL Server視圖支持子查詢。並且,從某種意義上說,視圖可以自動更新,因爲視圖不是持久對象(除非使用索引視圖)。使用非索引視圖時,每次查詢視圖時,都使用基礎表。因此,您的觀點將與其所基於的表格一樣最新。

這聽起來對我來說,像一個觀點將是一個很好的選擇。

1

這是5個不同的查詢,所以要這樣。

在視圖中封裝類似的JOIN是誘人的,但是在你知道它之前你有視圖頂部的意見和糟糕的性能。我已經看過很多次了。

「視圖中的子查詢」的事情可能是指索引視圖有限制。

+0

檢查更新的問題,請 – 2009-12-22 20:52:57

+0

而我更不相信...... – gbn 2009-12-22 20:55:38

0

即使它包含子查詢,也可以創建一個視圖。您可以刪除視圖的位置。

您確定要使用COUNT嗎?沒有羣組?它計算包含非空值或參數的行數。

+0

更新我的查詢:d – 2009-12-22 20:45:51

1

除非您談論索引視圖,否則視圖將實際運行腳本以根據需要生成視圖。在這方面,這與使用子查詢相同。

如果我是你,我會保持原樣。看起來你應該壓縮你的代碼(5個腳本中的每一個都有幾乎相同的代碼),但它的不同之處在於這裏非常重要。