【问题标题】:Huge performance difference for the same SQL query with different parameter不同参数的相同 SQL 查询的巨大性能差异
【发布时间】:2019-09-03 20:58:47
【问题描述】:

我试图了解为什么我的查询在我的情况下具有巨大的性能差异。

我有这张表有列:时间戳、股票代码、开盘价、最高价、最低价、收盘价、交易量、交易所。 数据库是 Postgres 9.6。

该表大约有 3 亿行。

我已经建立了以下索引:

  • 唯一索引(时间戳、代码、交换),
  • (股票代码)索引,
  • 索引(交换)。

我的查询如下

SELECT MAX(timestamp) FROM table WHERE ticker='ticker1' AND exchange='exchange1';

但是对于代码的不同值,我的查询时间差异很大,从 300 毫秒到 7 分钟不等。

我正在尝试了解导致此问题的原因以及是否可以通过任何方式改进它。

更多信息:

create table ohlcv (
    timestamp bigint,
    ticker varchar(20),
    open double precision,
    high double precision,
    low double precision,
    close double precision,
    volume double precision,
    exchange varchar(20),
    constraint ohlcv_timestamp_ticker_exchange_key
        unique (timestamp, ticker, exchange)
);

create index ohlcv_exchange_index on ohlcv (exchange);
create index ohlcv_ticker_index on ohlcv (ticker);

【问题讨论】:

  • edit您的问题并添加使用explain (analyze, buffers, format text)生成的execution plans(慢速和快速)(只是一个“简单”的解释)作为formatted text,并确保您防止该计划的缩进。粘贴文本,然后将``` 放在计划前一行和计划后一行。还请包括所有索引的完整 create index 语句。

标签: postgresql indexing


【解决方案1】:

你需要这个索引:

CREATE INDEX ON "table" (ticker, exchange, timestamp);

它可以快速找到满足WHERE条件的行,然后可以很快找到max

由于您已经对这些列设置了唯一约束(但顺序错误),您可以删除并重新创建约束。这将具有相同的效果,因为它由索引支持。

【讨论】:

猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2017-10-01
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多