Вычислить количество одновременных событий в SQL

У меня есть таблица, в которой хранятся телефонные звонки, со следующими полями:

  • ID
  • STARTTIME
  • ENDTIME
  • STATUS
  • CALL_FROM
  • CALL_TO

В локальную базу данных 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);
12
задан Erwin Brandstetter 6 January 2012 в 02:34
поделиться