У меня есть таблица, содержащая телефонные звонки со следующими полями:
- ID
- STARTTIME
- EndTime
- STATUS
- CALL_FROM
- CALL_TO
В локальную базу данных PostgreSQL загружено 2,9 миллиона записей. Я добавил индексы по идентификатору (уникальный индекс), времени начала и времени окончания.
Поиск в stackoverflow, я нашел полезный SQL и изменил его на то, что, как я думаю, логически должен работать. Проблема в том, что запрос выполняется много часов и никогда не возвращается:
SELECT T1.sid, count(*) as CountSimultaneous
FROM calls_nov T1, calls_nov T2
WHERE
T1.StartTime between T2.StartTime and T2.EndTime
and T1.StartTime between '2011-11-02' and '2011-11-03'
GROUP BY
T1.sid
ORDER BY CountSimultaneous DESC;
Может кто-нибудь попросит предложить способ исправить запрос/индекс, чтобы он действительно работал или предлагал другой способ вычисления одновременных вызовов?
EDIT:
Объясните план:
Sort (cost=11796758237.81..11796758679.47 rows=176663 width=35)
Sort Key: (count(*))
-> GroupAggregate (cost=0.00..11796738007.56 rows=176663 width=35)
-> Nested Loop (cost=0.00..11511290152.45 rows=57089217697 width=35)
Создание таблицы script:
CREATE TABLE calls_nov (
sid varchar,
starttime timestamp,
endtime timestamp,
call_to varchar,
call_from varchar,
status varchar);
Создание индекса:
CREATE UNIQUE INDEX sid_unique_index on calls_nov (sid);
CREATE INDEX starttime_index on calls_nov (starttime);
CREATE INDEX endtime_index on calls_nov (endtime);