2009-11-18 79 views
0

我有以下表結構 -SQL Server:設計:嵌入式Select語句或INNER JOIN?

網站:主tablefor網站

組織:師父組織

用戶:用戶主表(每個用戶鏈接到一個獨特的組織通過 User.OrgId)

OrgSite:存儲一些'組織特定'網站詳細信息(OrgId,SiteId,SiteName, SiteCode)。並非所有網站,但只有 組織可以訪問的網站。

UserSite:將用戶鏈接到他可訪問的網站(UserId,SiteId)。 當用戶鏈接到Org UserSite 將成爲OrgSite表的一個子集。

ItemSite:表用於存儲一些項目&網站具體細節(項ID, SITEID,ORGID,...)

現在,我已經從 'ItemSite' 過濾\顯示記錄而且我還需要顯示Sitecode。所以,我看到下面的兩個選項 -

1.創建一個視圖: vw_ItemSite_UserSite_OrgSite(INNER JOIN上SITEID所有表) - 這會給我訪問所有的「OrgSite」表中提供的組織具體細節(即SITECODE,等..)

如果你能注意到我已經爲包括 「OrgSite」只因爲我想 具體組織SITECODE & SITENAME的看法。 因爲UserSite已經過濾網站 - 所以我可以 '排除'OrgSite表和 消除不必要的INNER JOIN。

2.根據上述注 - 第二個選項是創建一個視圖:vw_ItemSite_UserSite和「選擇」的VIEW我可以嵌入以下SELECT樣的語句 -

CREATE VIEW vw_ItemSite_UserSite AS 
SELECT ItemSite.SiteID, 
(SELECT TOP 1 [SiteCode] FROM OrgSite WHERE OrgId = ItemSite.OrgId) AS SiteCode, 
... 
FROM ItemSite INNER JOIN UserSite ON ItemSite.SiteId = UserSite.SiteId 

我唯一的意圖是 - 我相信INNER JOIN和WHERE將在評估嵌入式select語句之前進行評估。那麼,這是否爲我節省了一些性能?或者是讓vw_ItemSite_UserSite_OrgSite更好的想法。

選項#1或選項#2?

謝謝。

回答

2

當心Premature optimization。如果兩個查詢都返回相同的結果,請使用容易理解和維護的結果。SQL Server的任務是確保查詢操作(join,select,...)按優化性能的順序執行。而且,通常,SQL Server在這方面做得非常好。

也就是說,有些情況下,SQL Server查詢分析器找不到最佳查詢計劃,您需要自行調整。但是,這些情況很少見。除非您的查詢中已經存在性能問題(並且不能通過引入缺少的索引來解決這些問題),這是您現在不應該擔心的問題。

1

我會採取簡單的回答方法。創建一些測試並檢查它們的性能,並查看哪一個在給定的環境中真正執行得最好。

+0

那麼,你是說選項#1和選項#2與性能觀點相似嗎?因爲選項#1顯然更簡單和直接選擇! – 2009-11-18 14:43:49

+0

我不是說任何一個都更好。我所說的只是運行一些測試並看看。在你的情況下設置一個測試來做這件事有多難?如何做的最好的指標是運行測試,並根據您的發現得出結論。我總是非常懷疑有人告訴我,選項1或選項n是最好的選擇,沒有真實的事實。 – Kuberchaun 2009-11-18 15:13:59

0

選項1幾乎肯定會更快,嵌入式SELECT對於性能通常是一個壞主意。

但是 - 不要拿我們的話來說。編碼並試用它們,檢查查詢計劃。在這種情況下,這可能是不成熟的優化過程,但它也是一個很好的簡單測試案例,您可以在該案例中學習如何正確知道如何執行此操作,以及在出現真正需要正確執行操作的問題時所產生的影響。在編寫相同查詢的不同方式之間存在性能差異,優化器無法做任何事情,因此先學習一般規則,您的生活將會更加快樂。