2012-01-08 69 views
0

我想知道SELECTSELECT會引起任何額外的性能,或者如果數據庫足夠聰明,以優化這一點。性能的選擇SELECT

例如,我有一些選擇我喜歡以下幾點:

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

所有這些特定查詢的作用是組中的Dow30所有的交易日期,並總結了總體積。我使用這個數據是因爲該表每秒存儲每筆交易,我想每天進行彙總。

這不是完整的查詢,只是一個例子。我知道我可以僅僅從一個SELECT這樣做,但我想知道如果做SELECTSELECT會產生某種性能損失,或者如果這一切都得到神奇的優化。

爲什麼我制定的查詢這種方式,因爲這就是我的可視化查詢,居然和我加入這個頂級select與另一個表,並從根本SELECT選擇出列,使我更容易的緣故可視化查詢。但是,如果沒有正式的DBA背景,我不確定這是否是錯誤的,以及是否需要找出更好的方式來編寫我的查詢。

+2

你有沒有看的查詢計劃?我不知道如何得到它的SQL服務器,但也許你可以自己找出它。 它會告訴你,數據庫如何看你的查詢。 – fkerber 2012-01-08 21:51:38

+0

我不是SQL Server專家,但我希望服務器優化...因爲這不是猜測,更多的是知道要知道唯一的方法是檢查查詢的查詢計劃 - 然後你可以看到服務器是怎麼做出來的,它甚至可以給你提示是否需要索引... – Yahia 2012-01-08 21:54:38

回答

1

把這些2個查詢在查詢窗口

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by DATEPART(year, transactionTime), DATEPART(month, transactionTime), DATEPART(day, transactionTime) 

再看看實際的執行計劃,

http://technet.microsoft.com/en-us/library/ms189562.aspx 

它會告訴你兩個查詢的執行計劃以及兩者的相對成本其中,我猜他們兩人都是50%,這意味着兩者都有相同的成本(但我可能是錯的,請讓我們知道你發現了什麼)

+0

謝謝,我不知道這一點,它確實出來爲兩個50%。 – steve8918 2012-01-09 14:29:09

+1

@ steve8918我一直使用這個,當我有疑問時,這是非常重要的工具,現在你有一種方法可以永遠知道,而不必猜測 – 2012-01-09 14:30:55

0

它可以減慢噸他查詢,但這取決於您實際選擇的內容。在這種情況下,主級別選擇不會做任何事情,甚至不需要。服務器可能會優化此查詢,就好像它只是一個選擇一樣。但情況並非總是如此,這取決於查詢。還有數據庫。 MySQL,Oracle和SQL Server都有很棒的優化器,但是各種優化方式差別很大。

2

使用派生表或熱膨脹係數可能會增加一個非常小在解析階段的開銷。爲了可讀性,我寧願忽略它。

更新我說的情況下,當你在技術上沒有使用它(在你的問題)