小编uld*_*all的帖子

带有 WHERE 条件和 GROUP BY 的 SQL 查询索引

我正在尝试确定哪些索引用于带有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

15
推荐指数
3
解决办法
3081
查看次数

不断增加的列的总和

我有一个“交易”表,其中每笔交易都有一个金额:http : //sqlfiddle.com/#!15/42849/1

表中的记录永远不会被删除或更新。仅添加新交易。

我想计算金额的总和。对于每个请求,计算不必是 100% 最新的。

在大约一百万行的数据集上,这在我的数据库上大约需要 400 毫秒。这对于我的应用程序来说太慢了,我正在尝试找到加快速度的最佳解决方案。

到目前为止我尝试过的

  1. 物化视图:增加了必须运行 cronjob 的复杂性,它每 X 秒更新一次视图。
  2. 在应用服务器上缓存:当缓存需要更新时,每个 X 请求都会很慢。
  3. 存储对旧子集的查询结果:存储先前请求的 SUM 并使用这些来计算正确的总数。增加了复杂性。

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)

postgresql

5
推荐指数
1
解决办法
689
查看次数