我正在尝试确定哪些索引用于带有WHERE
条件的 SQL 查询,GROUP BY
而当前运行速度很慢。
我的查询:
SELECT group_id
FROM counter
WHERE ts between timestamp '2014-03-02 00:00:00.0' and timestamp '2014-03-05 12:00:00.0'
GROUP BY group_id
Run Code Online (Sandbox Code Playgroud)
该表目前有 32.000.000 行。当我增加时间范围时,查询的执行时间会增加很多。
有问题的表如下所示:
CREATE TABLE counter (
id bigserial PRIMARY KEY
, ts timestamp NOT NULL
, group_id bigint NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我目前有以下索引,但性能仍然很慢:
CREATE INDEX ts_index
ON counter
USING btree
(ts);
CREATE INDEX group_id_index
ON counter
USING btree
(group_id);
CREATE INDEX comp_1_index
ON counter
USING btree
(ts, group_id);
CREATE INDEX comp_2_index
ON counter …
Run Code Online (Sandbox Code Playgroud) postgresql performance index optimization postgresql-9.3 query-performance
我有一个“交易”表,其中每笔交易都有一个金额:http : //sqlfiddle.com/#!15/42849/1
表中的记录永远不会被删除或更新。仅添加新交易。
我想计算金额的总和。对于每个请求,计算不必是 100% 最新的。
在大约一百万行的数据集上,这在我的数据库上大约需要 400 毫秒。这对于我的应用程序来说太慢了,我正在尝试找到加快速度的最佳解决方案。
到目前为止我尝试过的
题
PostgreSQL 是否提供了加速此类查询的解决方案?
更新 1
SUM 查询只是单列上的基本总和,所以我不相信这个查询本身可以变得更快。解决方案可能是进行某种缓存/预计算或类似操作。PostgreSQL 在这方面有什么特点吗?
更新 2
有问题的表:
CREATE TABLE transactions
(
id bigserial NOT NULL,
amount bigint NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
有问题的查询:
SELECT SUM(amount) FROM transactions;
Run Code Online (Sandbox Code Playgroud)
更新 3
我发现我实际上也需要一个“类型”。
更新表:
CREATE TABLE transactions
(
id bigserial NOT NULL,
amount bigint NOT NULL,
type int NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
更新的查询:
SELECT SUM(amount) FROM transactions GROUP BY …
Run Code Online (Sandbox Code Playgroud)