2010-03-21 101 views
1

查詢是:如何優化這個查詢?

select employee_id 
     , last_name 
     , salary 
     , round((salary+(salary*0.15)), 0) as "NewSalary" 
     , (round((salary+(salary*0.15)), 0) - salary) as 「IncreaseAmount」 
from employees; 

我可以在優化這個round((salary+(salary*0.15)), 0)部分無論如何,所以它不會出現兩次?我試圖給它一個別名,但沒有工作:(

+0

你的意思是:如何「不要重複你自己」 - 這是反模式的名字。 – lmsasu 2010-03-21 11:26:32

回答

7

做計算一次,這樣做:

SELECT employee_id, 
     last_name, 
     salary, 
     NewSalary, 
     (NewSalary - salary) as 「IncreaseAmount」 
FROM (Select employee_id, 
      last_name, 
      salary, 
      round(salary*1.15, 0) as NewSalary 
     FROM employees) 

不能使用別名作爲在選擇鄰居,但你可以別名它在嵌套查詢和使用該視圖的結果的兩倍,但更有效的,因爲它不僅會計算一次。

1

你嘗試ROUND(薪水* 1.15)?

+0

哦!謝謝..但我應該在代碼中使用它兩次..我的意思是,我可以給一個別名,然後第二次使用它? – jest 2010-03-21 11:07:37

1

最佳的優化將是從查詢中刪除IncreaseAmount

您不需要從數據庫查詢中返回舊薪水和新薪水之間的差異,如果需要,可以輕鬆計算。在查詢中進行計算僅意味着即使不需要計算,也會執行計算,並且查詢結果大於它的結果。

+0

嗯..但它告訴有多少$$已增加這是有意義的,我猜 – jest 2010-03-21 11:15:33

+0

@jest:是的,它可能是狡猾的,但這並不意味着數據庫必須進行計算。 – Guffa 2010-03-21 11:54:41

0

您不能在同一級別使用列別名。

Nick Craver建議使用子查詢會帶來自己的懲罰(執行時間最終可以相比,所​​以優化是有問題的)。

使用計算列創建視圖可能會優化一點,但不會大幅(可再次比較)。

如果(選擇)性能確實如此重要,則必須進行非規範化並將新工資寫入某處,然後通過觸發器或應用程序邏輯層保持完整性。