У меня есть таблица, в которой хранятся телефонные звонки, со следующими полями:
В локальную базу данных PostgreSQL загружено 2,9 миллиона записей. Я добавил индексы по ID (уникальный индекс), времени начала и окончания.
В поисках 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;
Может ли кто-нибудь предложить способ исправить запрос / индекс, чтобы он действительно работал, или предложить другой способ вычисления одновременных вызовов?
РЕДАКТИРОВАТЬ:
Объясните план:
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)
Сценарий создания таблицы:
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);