标签: postgresql-performance

为什么 Postgres 不使用我的功能索引?

我在 AWS Aurora Postgres 15.5 上有一个 Stack Overflow 数据库的公共副本:

  • 服务器:query.smartpostgres.com
  • 用户名:只读
  • 密码:511e0479-4d35-49ab-98b1-c3a9d69796f4

users 表有这个索引:

create index users_length_displayname on users(length(displayname));
Run Code Online (Sandbox Code Playgroud)

但是当我运行以下任一查询时:

select * from users where length(displayname) > 35;
select length(displayname) from users where length(displayname) > 35;
Run Code Online (Sandbox Code Playgroud)

他们不使用功能索引,正如他们的查询计划所证明的那样:

显示表扫描的查询计划

那么,呃,为什么?

postgresql postgresql-performance

3
推荐指数
1
解决办法
798
查看次数

PostgreSQL - 按索引对数组求和

我在 PostgreSQL 中有一个 doubles 列(double precision[])的数组,它可以保留一天的半小时值。所以每个数组都有 48 个值。我需要一个有效的查询,它按索引对所有这些数组列求和,并生成一个新的 48 数组索引,如下所述

A = double[48] = {3,2,0,3....1}
B = double[48] = {1,0,3,2....5}

RESULT = double[48] = {A[0] + B[0], A[1] + B[1],...,A[47] + B[47]}
Run Code Online (Sandbox Code Playgroud)

谢谢!

postgresql performance array postgresql-performance

2
推荐指数
1
解决办法
2936
查看次数

READ COMMITTED 是否总是在序列化失败后重新开始而 SERIALIZABLE 只是失败?

PostgreSQL Concurrency With MVCC 页面上,它说:

知道你在想什么:同时更新同一行的两个事务怎么样?这就是事务隔离级别的用武之地。Postgres 基本上支持两种模型,允许您控制如何处理这种情况。默认值 READ COMMITTED 在初始事务完成后读取行,然后执行语句。如果行在等待时发生更改,它基本上会重新开始。例如,如果您使用 WHERE 子句发出 UPDATE,则 WHERE 子句将在初始事务提交后重新运行,如果仍然满足 WHERE 子句,则执行 UPDATE。

文件似乎表明,提交读仍然受到故障,应予以重审。

可以将 READ COMMITTED 设置为以与 SERIAZLIZABLE 相同的原子性无限期重试吗?

postgresql performance version-control serialization postgresql-performance

2
推荐指数
1
解决办法
435
查看次数

在具有小 LIMIT 的外部查询中添加 ORDER BY 时,复杂视图会变慢

我在视图中有一个非常大的查询(让我们称之为a_sql),这真的很快,除非我ORDER BYSELECT带有小的外部使用LIMIT

SELECT
customs.id AS custom_id, customs.custom_name AS custom_name, customs.slug AS slug, customs.use_case AS custom_use_case,
SUM(CASE WHEN designers.id = orders.user_id AND orders.bulk = 't' THEN order_rows.quantity ELSE 0 END) AS sale_bulk,
SUM(CASE WHEN designers.id = orders.user_id AND orders.bulk = 'f' THEN order_rows.quantity ELSE 0 END) AS sale_not_bulk,
SUM(CASE WHEN designers.id = orders.user_id THEN order_rows.quantity ELSE 0 END) AS sale_total,
SUM(CASE WHEN designers.id <> orders.user_id AND orders.bulk = 't' THEN order_rows.quantity ELSE 0 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization view postgresql-9.4 postgresql-performance

2
推荐指数
2
解决办法
1457
查看次数

Postgres 9.5 外部表继承不使用索引

在 PostgreSQL 9.5.0 中,我有一个按月收集数据的分区表。尝试使用PostgreSQL新增的外表继承特性,将一个月的数据推送到另一台PostgreSQL服务器,结果得到了外表。当我从主服务器运行查询时,执行查询所需的时间比在我拥有外部表的服务器上长 7 倍。我没有通过网络传递大量数据,我的查询如下所示:

explain analyze
SELECT source, global_action, paid, organic, device, count(*) as count, sum(price) as sum
FROM "toys"
WHERE "toys"."container_id" = 857 AND (toys.created_at >= '2015-12-02 05:00:00.000000') AND
(toys.created_at <= '2015-12-30 04:59:59.999999') AND ("toys"."source" IS NOT NULL)
GROUP BY "toys"."source", "toys"."global_action", "toys"."paid", "toys"."organic", "toys"."device";

HashAggregate  (cost=1143634.94..1143649.10 rows=1133 width=15) (actual time=1556.894..1557.017 rows=372 loops=1)
   Group Key: toys.source, toys.global_action, toys.paid, toys.organic, toys.device
   ->  Append  (cost=0.00..1143585.38 rows=2832 width=15) (actual time=113.420..1507.373 rows=76593 loops=1)
         ->  Seq Scan on toys  (cost=0.00..0.00 rows=1 width=242) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance inheritance foreign-data postgresql-9.5 postgresql-performance

2
推荐指数
1
解决办法
2298
查看次数

为什么这个 PostGIS 查询需要这么长时间才能运行?

我一般是 PostGIS 和 SQL 的新手。我正在对多边形运行查询,我希望它只选择不同的几何图形,然后修复 ( ST_MakeValid()) 那些不同的几何图形。从而在修复无效几何图形的过程中删除重复的几何图形。但是,查询需要很长时间才能运行(几天)。这是 SQL 语句:

CREATE TABLE schema.table_geomfix AS 
SELECT gid,id, ST_MakeValid(geom) as geom 
FROM schema.table_polygons 
WHERE geom IN (SELECT DISTINCT geom FROM schema.table_polygons);
Run Code Online (Sandbox Code Playgroud)

分别运行两个 select 语句很快。大约 1 分钟makevaliddistinct陈述和 15 秒的陈述。

  1. 为什么运行组合语句需要这么长时间?
  2. 关于改进查询以使其更快的任何建议?

注意:geom列上有一个索引。

postgresql performance postgis postgresql-performance

2
推荐指数
1
解决办法
522
查看次数

PostgreSQL 流复制停止更新

我有四个 PostgreSQL 9.5 实例在 EC2 上运行,使用 m4.8xlarge 实例,RAID0 设置中有五个 PIOPS SSD 和一个单独的 XLOG 驱动器。直到今天早上,我的复制延迟从未超过一两分钟,但现在复制在大约 30 分钟后在所有实例上完全失败。

重新启动 Postgres 将问题再解决半小时。

没有 CPU 争用,iowait 通常小于 1%。阻止对服务器的读取,认为它可能会不堪重负,什么也不做。我无法弄清楚这里的问题是什么,除了亚马逊的问题。

谁能给我一些想法如何解决这个问题?日志中没有任何内容,replay_location(来自 pg_stat_replication)只是停止更新,直到我重新启动从站。

postgresql performance postgresql-9.5 postgresql-performance

2
推荐指数
1
解决办法
2605
查看次数

使用 pg_prewarm 将 X 个最新行加载到缓存中

我们有一个大型查询,当客户“第一次运行它时,一大早......”

所以,我发现pg_prewarm我想使用加载到 PG 的缓冲区缓存一定数量或最近访问的行(插入、更新或删除)来自上述查询中使用的几个表。

此外,我需要确保“预热”不超过 PG 的缓存(我相信是 shared_buffers 设置,还是我错了?)为了预热单个表的最后 1000 页,我可以这样做:

SELECT pg_prewarm(
    'mytable',
    -- "pre warm" last 1000 pages
    first_block := ( 
        SELECT pg_relation_size('mytable') / current_setting('block_size')::int4 - 1000
    )
);
Run Code Online (Sandbox Code Playgroud)

问题 1:这种方法有意义吗?

诀窍是 pg_prewarm 只能加载一定数量的页面,所以我需要计算“某个表的页面中有多少活动行”

-- show some settings
SELECT current_setting('block_size')::int4 AS page_size_bytes; -- 8192
SHOW shared_buffers; -- 512 MB


-- https://www.postgresql.org/docs/current/static/pgstattuple.html
--CREATE EXTENSION pgstattuple;
-- find out live row size and live rows per page
SELECT 'mytable'AS table_name, pg_size_pretty(tuple_len / tuple_count) AS live_row_size, 8192.00 / (tuple_len …
Run Code Online (Sandbox Code Playgroud)

postgresql performance size disk-space postgresql-performance

2
推荐指数
1
解决办法
2021
查看次数

Postgres:二级索引是否包含在 ACID 中?

是涵盖非唯一索引/指数ç在onsistency条款Ç ID?(对于不限制数据的索引的其他属性也是如此)我在 Postgres 中看到了某些性能问题(实际上是好处),这让我想知道它们是否存在。

鉴于索引/索引不是一流的对象(即您不能直接在 Postgres 中访问它们,也不能请求使用它们),我完全看不出为什么需要 Postgres 来支持这一点。我找不到 ACID 的定义说“索引必须完全完成并且在事务完成之前不能被黑客攻击”。

在某些不对插入设置限制的条件下(例如索引不是唯一的),索引本质上可能是“无效的”(即“在我完成重新索引之前不要使用它”),或者标志可以是设置表示“该索引不涵盖以下范围”。

如果 Postgres 使用这个技巧,copy from操作符可以变得非常迅速(这就是我所看到的),对于事务中的大量插入计数也是如此。

我不只是编造这个...

虽然红移是一个坏榜样,亚马逊黄鼠狼出Ç由捉弄它是如何存储的(唯一)排序键(基本上在红移主索引十岁上下结构)onsistency。在执行vacuum命令之前,主键只会变得越来越糟糕,您的数据库开始变成一个黑洞:查询进入,但没有结果出来。

显然,内部化的真空方案将防止在大规模进口期间经常发生的 Redshift 愚蠢行为。

postgresql performance acid postgresql-performance

2
推荐指数
1
解决办法
323
查看次数

Postgres btree 索引键是否被压缩?

v8.4 和 v9.2(是的,我知道它们过时且不受支持,但我对此无能为力。)

我管理(但未设计)的数据库中的某些表在 CHARACTER VARYING(256) 字段上具有 btree 索引。即使字段值不全为空,其中的数据长度也不超过 12 个字符。

是的,这些列的物理存储是高度压缩的,但是 btree 索引呢?如果将列更改为 VARCHAR(12),索引会更有效吗?

谢谢

postgresql performance index compression postgresql-performance

2
推荐指数
1
解决办法
1063
查看次数