Как оптимизировать SQL-запрос? Кажется отличным очень медленно? - PullRequest
1 голос
/ 14 февраля 2012

Я не специалист по БД, поэтому вопрос =)

Как оптимизировать такое:

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

Количество строк в таблице меньше 1,5 миллиона.У меня есть индекс на login_date, хотя время выполнения запроса такое же, как и без него.Также поле ИД пользователя является первичным ключом.

На сервере этот запрос занимает более 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)

И этозанимает 110 мс:)

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Определите этот индекс:

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

3 голосов
/ 14 февраля 2012

ЕСЛИ ИД пользователя является первичным ключом, он будет отличаться, и вам не нужно вводить в него отчетливый ключ .. http://www.w3schools.com/sql/sql_primarykey.asp

и кластеризованный индексированный по первичному ключу

1 голос
/ 14 февраля 2012

Можете ли вы попробовать что-то подобное?

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

удаление выражений вокруг ваших проиндексированных столбцов облегчит работу оптимизатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...