【问题标题】:PostgreSQL query slow, what's the issue?PostgreSQL查询慢,是什么问题?
【发布时间】:2017-04-25 09:40:41
【问题描述】:

我正在尝试使用 Python Django 将一些测量数据存储到我的 postgresql 数据库中。 到目前为止一切都很好,我已经用 django 制作了一个 docker 容器,并用 postgresql 服务器制作了另一个容器。 但是,我的测量表中的行数接近 2M,并且查询开始变得非常慢,虽然我不确定为什么,但我没有进行非常密集的查询。

这个查询

SELECT ••• FROM "measurement" WHERE "measurement"."device_id" = 26 ORDER BY "measurement"."measure_timestamp" DESC LIMIT 20

例如,运行需要 3 到 5 秒,具体取决于我查询的设备。

我希望它运行得更快,因为我没有做任何花哨的事情。 测量表

id INTEGER
measure_timestamp TIMESTAMP WITH TIMEZONE
sensor_height INTEGER
device_id INTEGER

在 id 和 measure_timestamp 上有索引。 服务器看起来并不太忙,虽然它只有 512M 内存,但我在查询期间还剩下很多。

我使用 shared_buffers=256MB 和 work_mem=128MB 配置了 postgresql 服务器。 整个数据库不到 100MB,所以应该很容易适应。 如果我在 PgAdmin 中运行查询,我会看到很多块 I/O,所以我怀疑它必须从磁盘读取,这显然很慢。

谁能给我一些关于如何找到问题的正确方向的指示?

编辑: 在查询中添加了解释分析的输出。我现在在 device_id 上添加了索引,这很有帮助,但我希望查询时间更快。 https://pastebin.com/H30JSuWa

【问题讨论】:

  • 在查询上运行 EXPLAIN (ANALYZE, BUFFERS) 并将结果添加到您的问题中。这将有助于给出不仅仅基于猜测的答案。
  • 另外:将表定义添加到您的问题中,包括 PK FK 和索引。以及对数据的一些描述,例如基数。

标签: python django performance postgresql


【解决方案1】:

measure_timestampdevice_id 上是否有 indexes?如果查询总是采用这种形式,您可能还会喜欢multi-column indexes

【讨论】:

  • 好吧,我以为我做到了,但显然不是在 device_id 上,所以我修复了这个问题,它帮助很大,但我还没有,我认为它可以变得更快。跨度>
  • 您的查询按 desc 排序。您是否也想尝试以同样的方式创建索引? postgresql.org/docs/current/static/indexes-ordering.html
  • 成功了,连同答案中提到的其他事情。我不知道索引是“一种方式”,我可以对它们进行降序索引。查询时间从 5 秒变为 22 毫秒。谢谢!
  • 很高兴知道这一点。如果有帮助,您可以支持我的评论。谢谢。
【解决方案2】:

请查看您的表的分布键。数据可能是稀疏填充的,因此会影响性能。当您拥有 2M 条记录的数据时,选择合适的分布键非常重要。更多详情请阅读on why distribution key is important

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多