我不是分貝speccialist,所以問題=)如何優化sql查詢?看起來很明顯很慢?
如何優化這樣的:
select count(DISTINCT userid)
from users
where date_trunc('month',login_date)=date_trunc('month','2012-01-12'::date)
錶行數是小於150萬。我在login_date上有一個索引,雖然查詢執行時間與沒有它相同。此外,字段用戶ID是主鍵。
在服務器機器上,這個查詢需要超過2000毫秒。第一個能夠幫助發揮出最佳表現的人會獲得聲譽++:D
---------------- a'b'c'd'e'f'g' h'SOLUTION ----------------------------------
CREATE OR REPLACE FUNCTION my_date_trunc_month(some_date DATE)
RETURNS DATE
AS $$
BEGIN
return date_trunc('month',$1);
END;
$$LANGUAGE plpgsql
IMMUTABLE;
CREATE INDEX computedIdx ON gameuser_daily_activity (my_date_trunc_month(login_date));
select count(DISTINCT gameuser_fk) from gameuser_daily_activity where my_date_trunc_month(login_date)=my_date_trunc_month('2012-01-12'::date)
AND it takes 110ms: )
Hm,ERROR:索引表達式中的函數必須標記爲IMMUTABLE – whatswrong 2012-02-14 13:53:50
http://stackoverflow.com/questions/5973030/error-functions-in-index-expression-must-be-marked-immutable - 創建標記的函數不可改變的日期。 – 2012-02-14 13:58:23
謝謝。優化到110毫秒!將等待如果解決方案沒有自定義函數存在=) – whatswrong 2012-02-14 14:49:40