获得Postgresql查询的性能

唐·卡纳利(Don Kanallie)

我有一个带有非规范化架构(1个表)的PostgreSQL数据库,其中包含约400万个条目。现在我有这个查询:

SELECT
  count(*) AS Total,
  (SELECT count(*) FROM table
   WHERE "Timestamp" > current_timestamp - INTERVAL '1 hour' AND "tableName" LIKE '%ping%') AS hour,

  (SELECT count(*) FROM table
   WHERE "Timestamp" > now() :: DATE AND "tableName" LIKE '%ping%') AS day,

  (SELECT count(*)
   FROM table
   WHERE "Timestamp" > now() :: DATE - INTERVAL '1 day' AND
         "Timestamp" <= now() :: DATE - INTERVAL '1 day' AND "tableName" LIKE '%ping%') AS yesterday,

  (SELECT count(*) FROM table
   WHERE "Timestamp" > now() :: DATE - INTERVAL '2 day' AND
         "Timestamp" <= now() :: DATE - INTERVAL '1 day' AND "tableName" LIKE '%ping%') AS "dayBeforeYesterday",

  (SELECT count(*)
   FROM table WHERE "Timestamp" > current_timestamp - INTERVAL '1 week' AND "tableName" LIKE '%ping%') AS week,

  (SELECT count(*)
   FROM table
   WHERE "Timetamp" > current_timestamp - INTERVAL '2 week' AND
        "Timestamp" < current_timestamp - INTERVAL '1 week' AND "tableName" LIKE '%ping%') AS "lastWeek",

  (SELECT count(*)
   FROM table
   WHERE "Timestamp" > current_timestamp - INTERVAL '3 week' AND
        "Timestamp" < current_timestamp - INTERVAL '2 week' AND "tableName" LIKE '%ping%') AS "weekBeforeLastWeek",

  (SELECT count(*)
   FROM table
   WHERE"Timestamp" > current_timestamp - INTERVAL '1 month' AND "tableName" LIKE '%ping%')AS month

FROM table WHERE "tableName" LIKE '%ping%';

这大约需要14秒到2分钟的时间(取决于发生了多少其他事情)。但是我的服务器是在Azure上托管了ubuntu的VM,始终将两个CPU覆盖了100%。如果我检查postgesql的统计信息,则主要是此查询,这会阻塞整个CPU。这是一个具有2核,7GB SSD的D2 VM。有没有一种方法可以在不升级我的Azure软件包的情况下加快速度?

贾尔

代替所有这些子查询,使用case表达式进行条件聚合:

SELECT
  count(*) AS Total,
  count(case when "Timestamp" > current_timestamp - INTERVAL '1 hour' AND "tableName" LIKE '%ping%' then 1 end) AS hour,
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查询性能差PostgreSQL

postgresql 查询性能慢

优化查询以获得更好的性能

PostgreSQL日期归档查询性能

如何提高PostgreSQL查询性能

PostgreSQL递归查询以获得排名

智能逻辑查询PostgreSQL函数内部的性能

优化查询/子查询以获得更好的性能(慢)

使用LEFT JOIN和子查询提高PostgreSQL查询的性能

优化 SQL 存储过程查询以获得更好的性能

在MySQL查询上获得的性能真的很差

如何使用多个 OR 语句重构 SQL 查询以获得更好的性能?

提高查询性能 - 从 oracle 选择数据到 postgresql

PostgreSQL通过CTE优化包含Window函数的查询性能

为什么子查询中的on差异会影响PostgreSQL的性能?

PostgreSQL:由未使用的索引引起的查询性能差吗?

使用嵌套循环提高SQL查询的性能-PostgreSQL

Postgresql IN运算符性能:列表与子查询

Knex与PostgreSQL选择查询对多个并行请求的性能极大降低

索引文本字段上的PostgreSQL查询性能

9.6升级后对Postgresql IN查询的奇怪性能问题

嵌套不包含在PostgreSQL中提高查询性能

大索引表上的 Postgresql 最大查询性能缓慢

如何在PostgreSQL查询中以JSON形式获得联接结果?

通过PostgreSQL中的简单查询获得比预期更多的记录

需要有关Neo4j模型/查询性能/配置的建议以获得最佳性能

在我的表上使用哪个sql索引以获得最佳查询性能

通过查询最大 1MB 的 DynamoDB 可以获得的最佳性能是什么?

如果我使用COUNT查询而不是在Symfony 4中遍历实体,是否会获得更好的性能?