Berechnung der Anzahl der gleichzeitigen Ereignisse in SQL

Ich habe eine Tabelle, die Sie hält anrufen, mit den folgenden Feldern:

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

Gibt es 2,9 Millionen Datensätze werden in eine lokale PostgreSQL-Datenbank. Ich fügte hinzu, Indizes-ID (unique index), starttime und endtime.

Suche auf stackoverflow fand ich einige nützliche SQL so geändert, daß, was ich denke logisch funktionieren sollte. Das problem ist, dass die Abfrage läuft für viele Stunden und kehrt nie zurück:

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;

Kann mir bitte jemand entweder einen Weg vorschlagen, um fix die Abfrage/index, so dass es tatsächlich funktioniert, oder schlagen einen anderen Weg zur Berechnung der gleichzeitigen Anrufe?

EDIT:

Erklären, plan:

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)

Skript zur Erstellung der Tabelle:

CREATE TABLE calls_nov (
  sid varchar,
  starttime timestamp, 
  endtime timestamp, 
  call_to varchar, 
  call_from varchar, 
  status varchar);

Index-Erstellung:

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);
  • T1 und T2 sind die gleichen??
  • Können Sie uns das erklären-plan? postgresql.org/docs/8.1/static/sql-explain.html Auch, vorausgesetzt, dass "sid" ist die ID, wie es in der und wählen Sie die Gruppierung, indem es nicht sinnvoll ist, die "zählen" würde immer 1.
  • Natürlich sind Sie das...es ist ein Protokoll der Aufrufe. Er möchte wissen, wie viele gleichzeitige Anrufe waren auch geschieht, bei jedem Anruf.
  • Was t1.sid?
  • SID ist die eindeutige ID von jedem Anruf.
  • In diesem Fall, was passiert, wenn Sie tun: SELECT count(*) as CountSimultaneous VON calls_nov T1, calls_nov T2 WHERE T1.Startzeit zwischen T2.StartTime und T2.EndTime und T1.Startzeit zwischen '2011-11-02' und '2011-11-03'
  • dies ist das Ergebnis von explain plan " - Aggregats (Kosten=11144150221.35..11144150221.36 rows=1 width=0)"
  • Sieht aus wie es ist nicht mit der Indizes - können Sie auch die Skripts zur Erstellung der Tabelle?
  • Hinzugefügt create table-und index-scripts. Danke!!!
  • Ich würde versuchen, einen zusammengesetzten index auf start-und end-Zeit - sieht aus wie es ' s nicht mit den einzelnen Tasten.
  • Bitte verwenden Sie keine implizite join-syntax (Komma-getrennte Liste nach FROM), da es einfach zu einfach, um in cross-joins, oder andere Dinge (ich glaube, es kann out-of-standard, jetzt, aber auch für rückwärts-Kompatibilität). Verwenden Sie immer explizite syntax, wie in @Eric ' s Antwort.
  • einigten sich auf die implizite joins. Auch Hinzugefügt-index für starttime, endtime, aber keinen performance-Gewinn.

InformationsquelleAutor Sologoub | 2012-01-04
Schreibe einen Kommentar