如何优化sql查询?好像很明显很慢?

时间:2012-02-14 13:42:20

标签: sql postgresql optimization

我不是数据库专家,所以问题=)

如何优化:

select count(DISTINCT userid) 
from users 
where date_trunc('month',login_date)=date_trunc('month','2012-01-12'::date)

表行数小于150万。我有一个login_date索引,虽然查询执行时间与没有它相同。字段userid也是主键。

在服务器计算机上,此查询需要超过2000毫秒。能够帮助实现最佳性能的第一个人将获得声誉++:D

---------------- a'b'c'd'e'f'g'h'解决方案-------------- --------------------

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)

它需要110毫秒:))

3 个答案:

答案 0 :(得分:4)

定义此索引:

CREATE INDEX computedIdx ON users (date_trunc('month',login_date))

答案 1 :(得分:3)

如果UserID是主键,它将是不同的,您不需要在其中放置明确的.. http://www.w3schools.com/sql/sql_primarykey.asp

并在主键

上建立了优先聚集的聚簇

答案 2 :(得分:1)

你能尝试这样的事吗?

select count(DISTINCT userid) 
from users 
where 
login_date >= '2012-01-12'::date and 
login_date < '2012-01-12'::date + '1month'::interval

删除索引列周围的表达式将使优化程序工作更容易。