【发布时间】:2013-09-06 18:48:33
【问题描述】:
给定下表:
CREATE TABLE table
(
"id" serial NOT NULL,
"timestamp" timestamp without time zone NOT NULL,
"count" integer NOT NULL DEFAULT 0
)
我正在搜索“罕见事件”。罕见事件是拥有以下属性的行:
- 简单:
count = 1 - Hard:在 10 分钟时间跨度内(当前行的时间戳之前和之后)的所有行都具有
count = 0(当然,给定行除外)。
例子:
id timestamp count
0 08:00 0
1 08:11 0
2 08:15 2 <== not rare event (count!=1)
3 08:19 0
4 08:24 0
5 08:25 0
6 08:29 1 <== not rare event (see 8:35)
7 08:31 0
8 08:35 1
9 08:40 0
10 08:46 1 <== rare event!
10 08:48 0
10 08:51 0
10 08:55 0
10 08:58 1 <== rare event!
10 09:02 0
10 09:09 1
现在,我有以下 PL/pgSQL 函数:
SELECT curr.*
FROM gm_inductionloopdata curr
WHERE curr.count = 1
AND (
SELECT SUM(count)
FROM gm_inductionloopdata
WHERE timestamp BETWEEN curr.timestamp + '10 minutes'::INTERVAL
AND curr.timestamp - '10 minutes'::INTERVAL
)<2
这太慢了。 :-(
关于如何提高性能的任何建议?我在这里处理 > 1 mio 行,可能需要定期查找那些“罕见事件”。
【问题讨论】:
-
您的查询错误,没有 WHERE 并且 BETWEEN 被翻转(应该是 `- '10 min...' AND ... + '10 min...')...
-
另外,您是否尝试过在时间戳列上建立索引以查看您当前的查询是否正常?
-
真的有七行ID相同吗? “时间戳”真的意味着“时间”吗? (在 SQL 数据库中,timestamp 通常表示日期和时间,而不仅仅是时间,这在 PostgreSQL 中是完全不同的数据类型。)
标签: sql performance postgresql timestamp window-functions