我不是数据库专家,所以问题=)
如何优化:
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毫秒:))
答案 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
删除索引列周围的表达式将使优化程序工作更容易。