【发布时间】:2025-11-23 19:15:02
【问题描述】:
我有一个保存电话的表格,其中包含以下字段:
- 身份证
- 开始时间
- 结束时间
- 状态
- CALL_FROM
- CALL_TO
有 290 万条记录加载到本地 PostgreSQL 数据库中。我在 ID(唯一索引)、开始时间和结束时间上添加了索引。
在 * 上搜索,我发现了一些有用的 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);
【问题讨论】:
-
T1和T2一样吗??
-
你能提供解释计划吗? postgresql.org/docs/8.1/static/sql-explain.html 另外,假设“sid”是 ID,将其包含在 select 中并按它进行分组是没有意义的 - “count”始终为 1。
-
@fge - 当然是……这是通话记录。他想知道每个通话期间同时发生了多少个通话。
-
SID 是每个呼叫的唯一 ID。
-
添加了创建表和索引脚本。谢谢!
标签: sql postgresql performance timestamp query-optimization