2015-07-12 23 views
3

我通過yeara tablesales記錄創建指標如下:計算值

id year sales 
1 2001 10 
2 2002 20 
3 2003 30 

我加入表本身,以獲得一個sales_difference從一年到下一個:

SELECT s1.*, s1.sales - s2.sales AS sales_difference 
FROM sales s1, sales s2 
WHERE s1.year = s2.year + 1 

此查詢運行速度很慢,所以我想在year + 1上創建一個索引。據the PostgreSQL docs你可以在表達式,如創建索引:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1)); 

所以我儘量這樣做:

CREATE INDEX sales_year_plus_one on sales (year + 1); 

這給了我:

ERROR: syntax error at or near "+" 
LINE 1: ...sales_year_plus_one on sales (year + 1); 
              ^

爲什麼這個特定的表達不準?

回答

5

您需要括在一組額外的括號的表達式:

CREATE INDEX sales_year_plus_one on sales ((year + 1)); 

請參閱從文件的摘錄:

CREATE INDEX命令的語法通常需要編寫圍繞指數的括號表達式,如第二個示例所示。如表達式只是一個函數調用時,括號可以省略,如第一個例子中所示。

+0

很好斑點。有多少奇怪的是,這樣一個重要的信息如此微妙地隱藏在文檔的小字中。 – LondonRob

4

您還可以使用窗口函數來獲取沒有額外的指數相同的效果(並因此維持該索引的開銷):

SELECT *, sales - lag(sales) OVER (ORDER BY year) AS sales_difference 
FROM sales; 

一個簡單的指數year,您可能已經有,在這裏就足夠了。

+0

這太神奇了。我想這可能被認爲是這類任務的最佳實踐。但是必須注意''OVER'裏面的'ORDER BY',因爲你必須考慮到查詢中的所有其他字段(顯然在這個啞的情況下,這不是必需的)。 – LondonRob

+0

使用自連接意味着兩個表掃描,窗口函數通過單個掃描得到。對兩個查詢執行'EXPLAIN ANALYSE'來查看差異。和所有的SQL查詢一樣,除了最微不足道的小問題外,必須小心謹慎。 – Patrick

+0

您必須查看EXPLAIN ANALYZE的結果以查看兩個查詢的性能差異。 http://explain.depesz.com可以提供幫助 –