我在 AWS Aurora Postgres 15.5 上有一个 Stack Overflow 数据库的公共副本:
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 中有一个 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 Concurrency With MVCC 页面上,它说:
知道你在想什么:同时更新同一行的两个事务怎么样?这就是事务隔离级别的用武之地。Postgres 基本上支持两种模型,允许您控制如何处理这种情况。默认值 READ COMMITTED 在初始事务完成后读取行,然后执行语句。如果行在等待时发生更改,它基本上会重新开始。例如,如果您使用 WHERE 子句发出 UPDATE,则 WHERE 子句将在初始事务提交后重新运行,如果仍然满足 WHERE 子句,则执行 UPDATE。
该文件似乎表明,提交读仍然受到故障,应予以重审。
可以将 READ COMMITTED 设置为以与 SERIAZLIZABLE 相同的原子性无限期重试吗?
postgresql performance version-control serialization postgresql-performance
我在视图中有一个非常大的查询(让我们称之为a_sql),这真的很快,除非我ORDER BY在SELECT带有小的外部使用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
在 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
我一般是 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 分钟makevalid的distinct陈述和 15 秒的陈述。
注意:geom列上有一个索引。
我有四个 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
我们有一个大型查询,当客户“第一次运行它时,一大早......”
所以,我发现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
是涵盖非唯一索引/指数ç在onsistency条款Ç ID?(对于不限制数据的索引的其他属性也是如此)我在 Postgres 中看到了某些性能问题(实际上是好处),这让我想知道它们是否存在。
鉴于索引/索引不是一流的对象(即您不能直接在 Postgres 中访问它们,也不能请求使用它们),我完全看不出为什么需要 Postgres 来支持这一点。我找不到 ACID 的定义说“索引必须完全完成并且在事务完成之前不能被黑客攻击”。
在某些不对插入设置限制的条件下(例如索引不是唯一的),索引本质上可能是“无效的”(即“在我完成重新索引之前不要使用它”),或者标志可以是设置表示“该索引不涵盖以下范围”。
如果 Postgres 使用这个技巧,copy from操作符可以变得非常迅速(这就是我所看到的),对于事务中的大量插入计数也是如此。
我不只是编造这个...
虽然红移是一个坏榜样,亚马逊黄鼠狼出Ç由捉弄它是如何存储的(唯一)排序键(基本上在红移主索引十岁上下结构)onsistency。在执行vacuum命令之前,主键只会变得越来越糟糕,您的数据库开始变成一个黑洞:查询进入,但没有结果出来。
显然,内部化的真空方案将防止在大规模进口期间经常发生的 Redshift 愚蠢行为。
v8.4 和 v9.2(是的,我知道它们过时且不受支持,但我对此无能为力。)
我管理(但未设计)的数据库中的某些表在 CHARACTER VARYING(256) 字段上具有 btree 索引。即使字段值不全为空,其中的数据长度也不超过 12 个字符。
是的,这些列的物理表存储是高度压缩的,但是 btree 索引呢?如果将列更改为 VARCHAR(12),索引会更有效吗?
谢谢
postgresql performance index compression postgresql-performance
postgresql ×10
performance ×9
acid ×1
array ×1
compression ×1
disk-space ×1
foreign-data ×1
index ×1
inheritance ×1
optimization ×1
postgis ×1
size ×1
view ×1