问题标签 [postgresql-performance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
111 浏览

sql - 改进此 SQL 查询的方法

我有这个查询

这是解释http://explain.depesz.com/s/dbf

如何提高此查询的速度?我注意到索引扫描中有一个循环 > 9000 次

0 投票
4 回答
90 浏览

sql - 在同一查询中使用 SUM 的结果

以上内容不起作用,也不total_transaction_valuetotal_loss_value来自transaction表格。有没有办法使这个查询工作?

注意:这个查询涉及5亿行,所以需要高效。

问题:
一些答案建议SUM(transaction.transaction_value) - SUM(transaction.loss_value)已缓存并且不需要再次计算,因为其他人建议我应该作为派生表/子查询以避免重复计算。有人能指出一些可以解决意见分歧的事情吗?

我正在使用 postgres 9.3。

回答:

我想在这里引用 erwin 的评论:

I ran a quick test with 40k rows and the winner was the plain version without subquery. CTE was slowest. So I think my first assumption was wrong and the query planner understands not to calculate the sums repeatedly (makes sense, too). I have seen different results with more complex expressions in the past. The planner does get smarter with every new version

0 投票
1 回答
884 浏览

postgresql - 提高多列索引和排序的性能

输出EXPLAIN ANALYZE

但是当我删除订单时:

  1. 有一个复合btree index on (col1, col2)和一个btree index on col3
  2. 写入性能和存储不是优先事项。读取性能至关重要,需要尽可能快。
  3. 这必须能够支持使用 IN 子句进行查询:WHERE (col1, col2) IN (($1, $2), ($3, $4)) ORDER BY col3 LIMIT 10;. (查找总是带有一个 IN 子句然后排序。)

注意:是否可以在 (col1, col2, col3) 上创建索引?那将使用(col1, col2)col3已订购...

0 投票
1 回答
8206 浏览

sql - PostgreSQL 窗口函数:比较分区

我正在尝试找到与 PostgreSQL 查询中的 WINDOW 函数中的 PARTITION BY 子句中的当前行进行比较的方法。

想象一下,我在以下 5 个元素的查询中有一个短列表(在实际情况下,我有数千甚至数百万行)。我试图为每一行获取下一个不同元素(事件列)的 id,以及前一个不同元素的 id。

我知道比较event!=ev.event是不正确的,但这就是我想要达到的目的。

我得到的结果是(就像我删除 PARTITION BY 子句一样):

我想得到的结果是:

任何人都知道这是否可能以及如何?非常感谢!

编辑:我知道我可以用两个JOINs、 aORDER BY和 a来做到这一点DISTINCT ON,但在数百万行的实际情况下,效率非常低:

0 投票
1 回答
2754 浏览

postgresql - Look up in a white space separated string in Postgres

I have a character varying field in postgres containing a 1-white-space-separated set of strings. E.g.:

  • --> one two three <--
  • --> apples bananas pears <--

I put --> and <-- to show where the strings start and end (they are not part of the stored string itself)

I need to query this field to find out if the whole string contains a certain word (apple for instance). A possible query would be

But it sucks and won't scale as b-tree indexes only scale if the pattern is attached to the beginning of the string while in my case the searched string could be positioned anywhere in the field.

How would you recommend approaching the problem?

0 投票
2 回答
7470 浏览

postgresql - 具有异构数据类型的 3 个字段的多列索引

我有一个包含 3 个字段的 postgres 表:

  • a : postgis 几何
  • b : 数组 varchar[]
  • c : 整数

我有一个涉及所有这些的查询。我想添加一个多列索引以加快速度,但我不能,因为这 3 个字段由于它们的性质而不能位于同一索引下。

这种情况下的策略是什么?添加 3 个索引 gist、gin 和 btree 以及 postgres 会在查询期间全部使用它们吗?

0 投票
3 回答
44 浏览

sql - 优化 PSQL 查询的执行时间

这是我第一次遇到query执行时间长的问题。问题实际上相当大,因为查询执行时间超过 20 秒,这对端点用户来说非常明显。

我有相当大的topics(~8k)数据库,主题有它的参数(这是字典 - 我有 113 个不同的参数用于 8k 主题)。

我想展示关于这些主题的重复次数的报告。

和我的查询:

结果片段:

有没有办法优化这个查询的执行时间?

0 投票
2 回答
13893 浏览

postgresql - 如何强制 PostgreSQL 使用我的索引?

事实:

  1. product我们的表中有大约 1 亿条记录
  2. 有少量工厂。例如,1 个工厂可能有 500 万种产品。
  3. 有数百万个工厂密钥
  4. 只有少数行与每​​个工厂无关。例如,一家工厂有 500 万种产品,有大约 100 种不相关的产品。
  5. 但是,有数百万行不相关的行。因为,最常见的情况是一个工厂密钥,5 行产品,并且可能有 2 行不相关。

这是问题查询:

解释分析:

问题:

这是有问题的,因为:

  1. 我相信planner之所以选择使用seq scan,是因为匹配这个工厂的行太多了。(约 320 万行匹配该工厂或约 3%)

  2. 但是,因为只有极少数的行不相关。我正在寻找不相关的。seq 扫描最终会非常昂贵。

我已经创建了一个复合索引product_factory_key_relevant_key,但是它没有利用索引。

编辑:

我试图强制 postgres 使用复合键:product_factory_key_relevant_key

SET enable_seqscan=off

虽然,它现在正在使用索引扫描。它实际上仍然比 seqscan 慢。(所以我猜计划者在进行 seq 扫描时是正确的)

0 投票
1 回答
3910 浏览

sql - 内连接性能

我有一张表,里面有很多外键,我需要进行内部连接,以便进行搜索。其中可能有 10 个以上,这意味着我必须进行 10 个内部连接。与我要加入它们的庞大(数百万行)表相比,要加入的每个表可能只有几行。

我只需要知道连接是否是一种快速的方法(仅使用 Postgres),或者是否有更聪明的方法可以使用子查询或其他方式来完成。

以下是一些虚构的数据作为示例:

0 投票
1 回答
143 浏览

sql - Postgresql 查询优化索引未使用

我在优化一些 posgresql 查询时遇到了一些麻烦。例如,这个接缝是最慢的:

我做的第一件事是编辑 conf 文件并更改缓冲区大小,我花费的总时间减少了百分之几。

接下来我做的是从现有表创建新表并将多面体分解为多边形。这将大多数查询速度从 70% 提高到 90%。然而,最慢的 3 个查询速度并没有超过百分之几。

通过使用 EXPLAIN 和 ANALYZE 检查搜索,我意识到没有使用索引。即使我禁用它,使用的是 seqscan。据我所知,这意味着我应该创建一个新索引。

在表 planet_osm_polygon 我有两个索引:

任何想法如何加快此查询以及为什么不使用索引?

这对我来说很新,如果我写的东西没有意义,请忽略它:)