2009-11-15 46 views
3

我有一個表與數百萬行的,我需要做的查詢地段看起來是這樣的:如何使用group by statement + max函數加速SQL查詢?

select max(date_field) 
where varchar_field1 = 'something' 
group by varchar_field2; 

我的問題是:

  • 有沒有一種方法來創建一個索引幫助這個查詢?
  • 我需要什麼(其他)選項來增強此查詢的性能?

回答

15

(varchar_field1, varchar_field2, date_field)上的索引將是最有用的。數據庫可以使用where子句的第一個索引字段,第二個用於group by,第三個用於計算最大日期。它可以使用該索引完成整個查詢,而無需在表中查找行。

+0

+1 FWIW,這被稱爲*覆蓋指數*。 – 2009-11-15 23:07:25

+0

而你至少需要將其中一列限制爲「not null」,或者你可以在(varchar_field1,varchar_field2,date_field,0)上使其成爲基於函數的索引 – 2009-11-16 05:55:49

0

顯然,varchar_field1上的索引將會有很大幫助。

+2

取決於varchar_field1的選擇性,它是否會有所幫助。 – 2009-11-15 23:54:40

+0

是的,同意..... – Dmitry 2009-11-16 00:31:29

-1

您可以創建自己與列額外的表

varchar_field1 (unique index) 
    max_date_field 

您可以設置在插入,更新觸發器和刪除您搜尋,將保持這個小表的表 - 無論何時行添加或更改,在此表中設置一行。

我們使用這種重構技術取得了良好的性能改進成功。在我們的例子中,它變得更簡單了,因爲我們永遠不會從表格中刪除行,直到它們太舊以致沒有人查看最大字段。如果您可以將max_date_field添加到某個其他表格而不是創建新表格,這是一項特別有用的技巧。

+0

我想知道這是什麼downvoted – WoodenKitty 2014-04-22 00:50:01