2010-04-07 47 views
0

我有時寫在表格上的SELECT:如何避免在選擇中一次又一次地重複列值的計算?

SELECT 
    a.col1 + b.col2 * c.col4 as calc_col1, 
    a.col1 + b.col2 * c.col4 + xxx as calc_col1_PLUS_MORE 
FROM .... 
INNER JOIN ... 
    ON a.col1 + b.col2 * c.col4 < d.some_threshold 
WHERE a.col1 + b.col2*c.col4 > 0 

當計算得到相當複雜,並且在同一SELECT內使用高達3-5倍,我真的想重構說出來的功能或類似爲了:

  1. 希望提高性能/利用高速緩存的
  2. 避免遺忘更新4點計算時,我在稍後階段才意識到我需要改變計算的一個。

我通常在SP中有這些選擇。

任何想法?

回答

3

您也可以疊加很多熱膨脹係數在層以構造複雜的表達式:

WITH CTE AS 
(
    SELECT 
     a.col1+b.col2*c.col4 as calc_col1 
    FROM .... 
), 
CTE2 AS (
    SELECT CTE.* 
     ,calc_col1 + xxx as calc_col1_PLUS_MORE 
    FROM CTE 
) 
SELECT ... 
FROM CTE2 c 
INNER JOIN ... d 
    ON c.calc_col1 < d.some_threshold 
WHERE c.calc_col1 > 0 
+0

完美!我真的需要更多地開始使用CTE。到目前爲止,我只使用它們來遞歸樹結構,但它們也確實有很多幫助。 – Peter 2010-04-07 03:27:04

4

查詢優化器應該已經從性能角度優化重複評估。但是,你當然可以用一個CTE來提高可讀性/可維護性:

WITH CTE AS 
(
    SELECT 
     a.col1+b.col2*c.col4 as calc_col1, 
     a.col1+b.col2*c.col4 + xxx as calc_col1_PLUS_MORE 
    FROM .... 
) 
SELECT ... 
FROM CTE c 
INNER JOIN ... d 
    ON c.calc_col1 < d.some_threshold 
WHERE c.calc_col1 > 0 
+0

啊 - 太棒了!非常感謝你。 – Peter 2010-04-07 02:03:34

2

你也能堅持計算領域,甚至指數他們。

如果計算主要在不同的表之間,請嘗試索引視圖。

+0

我閱讀了索引視圖 - 他們是否真的提高了性能?什麼時候他們不值得額外的數據庫對象 – Peter 2010-04-07 05:45:00

+0

@Peter:是的,索引視圖是**絕對**值得的麻煩!他們可以將查看視圖的性能提高1000倍以上 - 不會開玩笑。 – 2010-04-07 06:35:10

+0

權衡與正常指標相同。它們影響插入,刪除和更新(&合併)。還有一些與模式和數據庫選項有關的其他先決條件。就像mark_s說的那樣,絕對值得這個麻煩。 – 2010-04-07 06:45:58

相關問題