标签: postgresql-13

尽管统计数据正确,为什么 PostgreSQL 的解释分析会错误地估计行数?

概括

\n

我正在 PostgreSQL 数据库上连接一个大表(约 600K 行)和一个较小的表(约 11K 行),并且需要通过描述性字段过滤结果集text

\n

当按bigint较小表的字段进行过滤时,优化器会正确估计结果行数,但是当按text小表的字段进行过滤时,优化器会低估结果行数数千倍,即使有 1- 1 两者之间的关系。

\n

我无法理解这种行为。

\n

整个环境,包括数据,都可以使用此 Pastebin中的说明进行设置。对于传统的在线模拟数据库来说太大了。

\n

环境

\n
select version();\n\n|version                                                                                            |\n|---------------------------------------------------------------------------------------------------|\n|PostgreSQL 13.6 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit|\n
Run Code Online (Sandbox Code Playgroud)\n

坐在 Azure 灵活服务器上。

\n

结构和数据

\n

表(11228 行):

\n
create table parent_tb as\nselect id, md5(random()::text) descr\nfrom generate_series(1::bigint,11228::bigint) as a(id);\n\nalter table parent_tb add primary key (id);\ncreate index idx_parent_tb_desc on parent_tb(descr);\n
Run Code Online (Sandbox Code Playgroud)\n

样本数据:

\n
select *\nfrom parent_tb\nlimit …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql postgresql-13

7
推荐指数
0
解决办法
729
查看次数

pg Admin 4 - 尝试连接到 PostgreSQL 13 服务器时“postgres”用户的密码

我知道这个问题已经被问过其他时间了,但我没有找到解决这个问题的方法!

我用 pg Admin 4 下载了 PostgreSQL 13,当我在安装后第一次打开它时,它会询问我在安装过程中被要求设置的主密码,在我提供主密码并被接受后,我尝试连接到安装期间创建的默认服务器:“PostgreSQL 13”。

此时,它要求我输入我不知道在哪里可以找到的用户“postgres”的密码。具体来说,它说:请输入用户“postgres”的密码以连接服务器 - “PostgreSQL 13”。

我已经尝试了在互联网上找到的所有“默认”密码,但错误始终相同:

致命:用户“postgres”的密码验证失败

我也试过不插入任何密码并导致错误:

fe_sendauth:未提供密码

我不知道该怎么办。在 PostgreSQL 13 中,身份验证方法通过scram-sha-256. 我已经尝试将方法设置为信任,重新启动 mac,然后打开 pg Admin 4,它不断询问我访问服务器的密码。

我也尝试使用命令行工具,但最终遇到了相同的错误。

最后,这是我的pg_hba.conf样子:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the …
Run Code Online (Sandbox Code Playgroud)

postgresql pgadmin pgadmin-4 postgresql-13

6
推荐指数
4
解决办法
2万
查看次数

postgresql 中的重启点是什么?

在 PostgreSQL 版本 13 的 postgresql.conf 文件中,archive_cleanup_command 注释按以下方式解释该命令:

#archive_cleanup_command = ''         # command to execute at every restartpoint.
Run Code Online (Sandbox Code Playgroud)

这里这里的文档没有提到“重新启动点”。这就提出了以下问题:

  1. 什么是重启点? 例如:重启点与检查点是同一个词吗?两者的意思完全相同吗?
  2. 何时创建重启点? 例如:如果重启点只是一个检查点,那么检查点将每 5 分钟创建一次,或者无论 postgresql.conf 文件中的 checkpoint_timeout 设置如何。
  3. 存档清理命令何时运行? 例如:每次达到 archive_timeout(在 postgresql.conf 文件中设置)时,都会运行 archive cleanup 命令。如果存档超时设置为 1 小时,则 archive_cleanup_command 每 1 小时运行一次。

postgresql postgresql-13

6
推荐指数
1
解决办法
3120
查看次数

在 PostGIS Docker 镜像本身中找不到“$libdir/postgis-3”

听起来好像在 PostGIS Docker 镜像中找不到 PostGIS 本身。因此,我想我一定是在某个地方错了,但我无法弄清楚。这是我每次基于下面的 Dockerfile 构建和启动容器时遇到的错误:

(...)
app_1  | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/10_postgis.sh
app_1  | CREATE DATABASE
app_1  | Loading PostGIS extensions into template_postgis
app_1  | 2021-02-20 00:09:20.414 CET [91] ERROR:  could not access file "$libdir/postgis-3": No such file or directory
app_1  | 2021-02-20 00:09:20.414 CET [91] STATEMENT:  CREATE EXTENSION IF NOT EXISTS postgis;
app_1  | ERROR:  could not access file "$libdir/postgis-3": No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是生成此错误的 Dockerfile:

FROM postgis/postgis:13-3.1

ENV POSTGRES_DB=somedb
ENV POSTGRES_USER=someuser
ENV POSTGRES_PASSWORD=****

# Dont …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis docker dockerfile postgresql-13

5
推荐指数
0
解决办法
898
查看次数

PostGIS 扩展未安装

你好,我正在尝试使用以下命令将 postgis 安装到我的数据库之一

CREATE EXTENSION postgis;
Run Code Online (Sandbox Code Playgroud)

但它返回了一个错误

错误:

无法打开扩展控制文件“/Library/PostgreSQL/13/share/postgresql/extension/postgis.control”:没有这样的文件或目录

我如何安装postgis而不报错?

更新:我已经在默认数据库上尝试过了 postgres.app 给你的是你的桌面用户名(我的是 aarushsharma),我尝试这样做

CREATE EXTENSION postgis;
Run Code Online (Sandbox Code Playgroud)

它有效,所以我认为这是我的特定 postgres 用户的问题

sql database postgresql postgresql-13

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

从 Postgres 13 开始,哈希索引对于精确文本匹配查询来说是最佳的吗?

示例(假)情况:当将专门查询包含电子邮件(文本类型)的列以获取精确的字符串匹配时,对该列进行索引。

SELECT * FROM mytable WHERE email = 'test@test.com'
Run Code Online (Sandbox Code Playgroud)

在这些情况下,哈希索引是否比 B-TREE 有优势且没有缺点?

它们对插入/更新性能的影响是否不同?

(编辑:并且从未按此列排序)

postgresql postgresql-12 postgresql-13

5
推荐指数
1
解决办法
2043
查看次数

复制延迟 - 超过 max_slot_wal_keep_size,WAL 段未删除

概括

我们max_slot_wal_keep_size从 Postgresql 13 开始使用来防止 master 被滞后的复制杀死。看来,在我们的例子中,WAL 存储在超过此参数后没有被释放,从而导致复制失败。正如我所认为的,WAL 应该被释放,但似乎没有任何其他事务一次需要它。我想知道这应该如何工作以及为什么 WAL 段没有被删除?

请在下面找到详细信息。

配置

  • 主服务器和一个副本 - 使用插槽进行流式复制
  • ~700GB 可用于 pg_wal
  • max_slot_wal_keep_size = 600GB
  • min_wal_size = 20GB
  • max_wal_size = 40GB
  • 默认checkpoint_timeout= 5 分钟(检查点没有问题)
  • 存档已开启并且进展顺利

发生了什么

在重负载(大型 COPY/INSERT 事务,加载数百 GB 数据)下,复制开始落后。pg_wal 上的可用空间以与 safe_slot 相同的速度减少pg_replication_slot.safe_wal_size- 正如预期的那样。在某些时候safe_wal_size出现负值并且流媒体停止工作。这不是问题,因为副本开始从 WAL 存档恢复。我预计一旦槽丢失,WAL 将被删除最多max_wal_size. 但这并没有发生。看来 Postgres 试图维持接近max_slot_wal_keep_size(600GB) 的可用容量,以防副本再次开始追赶。随着时间的推移,没有任何一笔交易需要保留这么多的 WAL。归档也不落后。

  • Q1: PG 是否会尝试维护max_slot_keep_sizeWAL 可用?
  • Q2:如果不是,为什么当归档程序和系统上运行的任何事务都不需要过多的 WAL 时,PG 不删除它们?

大部分时间 pg_wal 上的可用空间量大约为 70GB,但是在某些时候,在大量自动清理期间,它下降到 0 :( 这是 …

postgresql replication wal postgresql-13

5
推荐指数
1
解决办法
4347
查看次数

Postgres 中过程内的临时表

我正在尝试在过程中创建并填充临时表,以保存我正在使用的数据的一些中间状态。

我创建了一个示例代码来解释我想要做什么:

CREATE OR REPLACE PROCEDURE etl.my_test_procedure()
LANGUAGE sql
AS 
$$
   CREATE TEMP TABLE IF NOT EXISTS my_temp(
       var1 VARCHAR(255),
       var2 VARCHAR(255)
   ) ON COMMIT DROP;
    
   INSERT INTO my_temp (
       var1,
       var2
   )
   SELECT 
       table_schema,
       column_name
   FROM information_schema.columns;

   SELECT 
        *
   FROM my_temp
$$
Run Code Online (Sandbox Code Playgroud)

尝试创建此存储过程时,数据库返回以下错误消息: 错误:关系“my_temp”不存在第 10 行:INSERT INTO my_temp (^ SQL 状态:42P01 字符:171

PD:我的 Postgres 版本是 13.3

postgresql stored-procedures temp-tables postgresql-13

5
推荐指数
1
解决办法
3970
查看次数

为什么 pg_restore 这么慢并且 PostgreSQL 几乎不使用 CPU?

我只需要使用pg_restore30MB 的小转储,平均需要 5 分钟!在我同事的电脑上,速度超快,大概十几秒。两者之间的区别在于 CPU 使用率:而对于其他数据库,数据库在恢复操作期间使用大量 CPU (60-70%),而在我的机器上,它仅保持在几个百分点左右 (0-3%) )就好像它根本不活跃一样。

确切的命令是:pg_restore -h 127.0.0.1 --username XXX --dbname test --no-comments test_dump.sql

生成此转储的原始命令是:pg_dump --dbname=XXX --user=XXX --no-owner --no-privileges --verbose --format=custom --file=/sql/test_dump.sql

看一下恢复操作过程中截取的屏幕截图:

恢复期间的屏幕截图

下面是vmstat 1运行命令对应的结果:

vmstat 截图

我花了几个小时在网上寻找解决方案,但 CPU 利用率不足的情况仍然很神秘。任何想法将不胜感激。

对于堆栈,我使用的是 Ubuntu 20.04,postgres 版本 13.6 正在 Docker 容器中运行。我有一个不错的硬件,不算太差也不算太好。

编辑:这个同样的命令过去在我的机器上使用相同的普通硬盘工作,但现在它非常慢。从我的角度来看,我与其他人(对于他们来说速度非常快)的唯一区别实际上是 CPU 使用率(即使他们有 SSD,这根本不应该成为限制因素,特别是对于 30 MB 转储) )。

编辑2:对于那些提出问题与IO限制和磁盘速度有关的人,我只是在没有任何信念的情况下尝试在我刚刚创建的SSD分区上运行我的命令,但没有任何改变。

postgresql performance cpu-usage postgresql-13

5
推荐指数
1
解决办法
3620
查看次数

在 Ubuntu 18.04 Bionic 上安装 Postgresql(存储库已删除)

我越来越

E: The repository 'https://apt.postgresql.org/pub/repos/apt bionic-pgdg Release' no longer has a Release file.
Run Code Online (Sandbox Code Playgroud)

在 sudo apt update 上。这意味着仿生的存储库无法访问。

就我而言,这次我无法将 Ubuntu 版本升级到较新的版本,并且需要以某种方式进行管理。在这种情况下,我想我需要从 /etc/apt/sources.list.d 中删除文件,其中包含:

deb https://apt.postgresql.org/pub/repos/apt bionic-pgdg main
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能在 Bionic 上安装 Postgresql呢?有什么方法可以从源代码下载并安装吗?

postgresql bionic ubuntu-18.04 postgresql-13

5
推荐指数
1
解决办法
5571
查看次数