我在觀看效果時遇到了一些麻煩。特別是一些昂貴的連接,當他們不需要的時候執行。我設法將問題簡化爲最簡單的情況,並使用AdventureWorks示例數據庫創建了以下視圖,該視圖將人員姓名和電子郵件地址組合在一起。是否可以建立一個sql視圖,以便任何連接只在需要時執行?
create view PersonDetails_View
as
select P.FirstName, P.LastName, A.EmailAddress
from Person.Person P
left outer join Person.EmailAddress A
ON P.BusinessEntityID = A.BusinessEntityID
如果我運行鍼對此視圖以下查詢:
select FirstName from PersonDetails_View
所生成的查詢等於的:
select P.FirstName
from Person.Person P
left outer join Person.EmailAddress A
ON P.BusinessEntityID = A.BusinessEntityID
在這個查詢中有一個不必要的加入正在執行。我知道它爲什麼會發生 - 如果每Person
行有多個EmailAddress
條目,結果將會不同。然而在這種特殊情況下,映射是1-1,並且總是會是。有沒有辦法阻止這種連接發生,以便生成的查詢等於以下內容?
select P.FirstName
from Person.Person P
(這個簡單的例子看起來像微型的優化,但我已經正確成型,並確定不必要的視圖在我的處境中的性能問題加入 - !我保證)
也許你應該使用(從人表,而不是從persondetails_view)的最新查詢人的數據呢?我會在這種情況下使用persondetails_view作爲無用的;) – Arvo 2013-04-22 09:51:03
再次,我把這個分解成了我能做到的最簡單的例子。我覺得發佈一個大型sql視圖,每次加入10個表格的數量對於這個問題來說是不必要的複雜的。 – John 2013-04-22 09:54:22