标签: postgresql

带有 btree 索引的 jsonb 列的统计数据不一致

我注意到涉及 jsonb 列的查询的性能在测试时在 VACUUM ANALYZE 运行之间存在显着差异。分析表格后,我似乎随机得到了完全不同的执行计划。

我在这里使用 Postgres 9.6。我的测试设置如下,我将一个键“x”插入到 jsonb 列“params”中,值在 1 到 6 之间,1 是最稀有的值,6 是最常见的值。我还有一个常规的 int 列“single_param”,其中包含用于比较的相同值分布。:

CREATE TABLE test_data (
    id      serial,
    single_param    int,
    params      jsonb
);

INSERT INTO test_data
SELECT 
    generate_series(1, 1000000) AS id, 
    floor(log(random() * 9999999 + 1)) AS single_param,
    json_build_object(
        'x', floor(log(random() * 9999999 + 1))
    ) AS params;

CREATE INDEX idx_test_btree ON test_data (cast(test_data.params->>'x' AS int));
CREATE INDEX idx_test_gin ON test_data USING GIN (params);
CREATE INDEX ON test_data(id)
CREATE INDEX ON test_data(single_param)
Run Code Online (Sandbox Code Playgroud)

我正在测试的查询是对结果进行分页的典型查询,我按 …

postgresql statistics execution-plan index-tuning json

7
推荐指数
1
解决办法
1739
查看次数

查找列不包含“空格”的行

我正在使用 Postgres 9.5。我想搜索我的名称列不包含空格的行。不过,我对如何为您定义空间有点模糊。我以为它只是我键盘上的空格键,所以我跑了:

.... where name not like '% %';
Run Code Online (Sandbox Code Playgroud)

但后来我得到了一些这样的结果:

 | JASON FALKNER
Run Code Online (Sandbox Code Playgroud)

这对我来说确实是一个空间,但可能还有其他一些事情正在发生。有没有更好的方法可以扫描我的名称列不包含空格的行?

使用正则表达式,not (name ~ '\s')仍然返回看起来有空格的列。

使用:

select cast(name as bytea) ... where name not like like '% %';
Run Code Online (Sandbox Code Playgroud)

回来:

\x4a41534f4ec2a0424c414b45
Run Code Online (Sandbox Code Playgroud)

但是,我仍然有点不清楚我如何使用这些数据来确定如何从我的结果中筛选空间。

我试过了where not (name ~ '[[:space:]]')',它返回“JASON BLAKE”与上面相同的字节序列,\x4a41534f4ec2a0424c414b45

postgresql pattern-matching postgresql-9.5

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

PostgreSQL,我的默认数据库的主机名地址是什么?

我刚刚在我的笔记本电脑上创建了一个 PostgreSQL 数据库(按照这些说明),它运行的是 Linux CentOS 7。

现在我想了解我的默认数据库的主机名地址是什么。我以为是,localhost但不是。

我想知道要与psql -h命令一起使用的名称或 IP 地址。基本上,运行此psql -h HOSTNAME命令应该让我psql单独获得与该命令相同的结果,即让我连接到我的数据库。

我的默认数据库的主机名地址是什么?

> service postgresql status 
Run Code Online (Sandbox Code Playgroud)

状态:

? postgresql.service - PostgreSQL 数据库服务器已加载:已加载(/usr/lib/systemd/system/postgresql.service;已启用;供应商预设:已禁用)活动:自 2017 年 3 月 30 日星期四 14:40:30 EDT 起处于活动状态(正在运行) ; 1 天 1 小时前主 PID: 2256 (postgres

而两者psql -h 127.0.0.1psql -h 127.0.0.1 -U davide产生此消息:

psql:致命:用户“david”的身份验证失败`

postgresql default-value address

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

在 Postgres 表和列上跟踪我自己的自定义元数据

有什么方法可以将我自己的元数据添加到Postgres 中的表和列中,例如短文本的键值对?

我正在从另一个数据库系统迁移表、列和数据。另一个系统具有在 Postgres 不匹配的表和列上定义的属性。例如,在其他数据库系统中,可以为每个表分配一种颜色,用于数据库结构的图形显示,例如CUSTOMER_表为绿色,INVOICE_表为红色。

所以我想要一种方法来跟踪我的 Postgres 数据库中的这些属性设置,这样我的 Java 应用程序就可以通过 JDBC 查询自定义元数据。

SET attribute ?

我注意到:

ALTER TABLE … SET ( attribute_option = value [, ... ] )
Run Code Online (Sandbox Code Playgroud)

…和…

ALTER TABLE … ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
Run Code Online (Sandbox Code Playgroud)

的文档ALTER TABLE并没有真正解释这些属性的作用。我可以创建自己的属性名称以用作映射到我自己的元数据值的键吗?

或者是否有其他方法可以让 Postgres 记住我自己的自定义元数据?

Comment

我想一种解决方法可能是将键值对作为文本嵌入每个表和列上的COMMENT属性。看起来有点像黑客,有点乱,因为我经常使用 COMMENT 将业务规则记录为散文。但我想它会起作用。有没有更好的方法来记住每表和每列的属性?

Extended Properties Microsoft SQL Server 的

显然,MS SQL Server 为此类元数据提供了“扩展属性”功能。说明这里对堆栈溢出,并在这里对微软文档 …

postgresql metadata postgresql-9.6

7
推荐指数
1
解决办法
2366
查看次数

使用 WITH 构造的奇怪优化效果

我有 4 个表,让我们将它们命名为:

  1. 表 A,15M 行
  2. 表 B,40K 行,
  3. 表 C,30K 行,
  4. 表 D,25M 行

(kk - 表示数百万)

我有一个遗留查询,它是这样构造的:

select C.<some_fields>,B.<some_fields>,D.<some_fields> from C
inner join A on C.x = A.x
inner join D on D.z = 123 and D.a_id = A.a_id
inner join B on C.x = B.x and B.z = 123
where A.type = 'Xxx'
Run Code Online (Sandbox Code Playgroud)

此查询非常慢,执行结果最多需要 3 分钟(对于特定情况,它返回 35k 行)。

但是当我将其更改为以下结构时:

with t as (
   select C.<some_fields>,D.<some_fields> from C
   inner join A on C.x = A.x
   inner join D …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization execution-plan amazon-rds query-performance

7
推荐指数
1
解决办法
166
查看次数

在 Postgres 9.6.2 数据库上执行 pg_restore 时,此错误意味着什么?

所以我有一个在 Heroku 上运行的 Rails 5.0.x 应用程序和 Postgres 9.6.1。我拉下来做一个pg_restore --exit-on-error --verbose --clean --no-acl --no-owner -h localhost -d database_development ~/Documents/Backups/myproduction.dump

我收到以下错误:

pg_restore: connecting to database for restore
pg_restore: dropping FK CONSTRAINT trial_versions fk_rails_f888baa05c
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 3091; 2606 16768 FK CONSTRAINT trial_versions fk_rails_f888baa05c u7dok58iar41mh
pg_restore: [archiver (db)] could not execute query: ERROR:  constraint "fk_rails_f888baa05c" of relation "trial_versions" does not exist
    Command was: ALTER TABLE ONLY "public"."trial_versions" DROP CONSTRAINT "fk_rails_f888baa05c";
Run Code Online (Sandbox Code Playgroud)

这个错误告诉我什么?我以前从未遇到过这个问题。这最近才开始发生,我需要先了解错误,然后才能开始对其进行故障排除。

postgresql pg-restore postgresql-9.6

7
推荐指数
1
解决办法
1万
查看次数

postgres:什么是archive_command 以及何时使用它

我有一个主/从 postgresql 配置,其中从属是热备用,用作只读备份。目前,archive_command 设置为“cd”。(我读过的空话)。我的理解是archive_command可以将wal段复制到特定位置;通常我会看到使用 cp 命令将其复制到磁盘其他位置的示例。我将 wal_keep_segments 设置为 256,所以如果我理解正确的话,slave 可能会落后 wal 大约 4GB (16MB * 256) 的变化。这可能是为什么我从来不需要使用 archive_command 的原因,因为我有足够的 wal 段来解决一些滞后问题?

那么可选的 archive_command 的目的是为了保存比 wal_keep_segments 设置更多的 wal 段吗?因此,在我的情况下,数据库目录 (pg_xlog) 中将有 256 个 wal 段,并且 postgres 会在达到限制时自动轮换并清理这些 wal 段。

而且,如果我放置了一个 archive_command,它是否会继续将 wal 段保存到命令将文件复制到的任何位置(并继续添加越来越多的存档 wal 段,除非我添加了自己的清理过程)?这种想法正确吗?

那么,假设我对 archive_command 的理解是正确的,从站如何利用这些 wal 文件?从站是否首先尝试从主数据目录中检索 256 个 wal 文件,然后返回到 recovery_command 以检索早于此的 wal 文件?recovery_command 是在从站上运行还是以某种方式通过主站代理?recovery_command 的许多示例都显示它与 cp 一起使用,所以我不确定文件是如何传输到不同服务器的?

我已经尝试阅读许多关于此的指南,包括以下内容。
我什么时候必须使用 archive_command,什么时候不用 https://www.postgresql.org/docs/current/static/continuous-archiving.html

我对这些概念仍然有点模糊,并试图达到一些清晰度。有人可以澄清我上面的想法是否正确以及为什么我可以使用 archive_command 吗?谢谢阅读。

这是我的配置:

大师:postgresql.conf

listen_addresses = '*' 

wal_level = hot_standby
archive_mode = on 
max_wal_senders …
Run Code Online (Sandbox Code Playgroud)

postgresql replication backup archive-log

7
推荐指数
1
解决办法
9130
查看次数

为什么 to_char 左填充空格?

当我使用099指示 0 填充的 3 位数字时,我会在左侧得到空格。

SELECT '>' || to_char(1, '099') || '<';
 ?column? 
----------
 > 001<
(1 row)
Run Code Online (Sandbox Code Playgroud)

为什么to_char这里是左填充?为什么会有前导空格?

postgresql cast number-formatting string-representation

7
推荐指数
1
解决办法
3229
查看次数

有什么办法可以防止 PostgreSQL 用户更改自己的密码?

我正在管理 PotsgreSQL 服务器,最近我意识到我的“非超级用户”用户有可能更改我为不安全密码分配的安全密码。

我在REVOKE文档中进行了搜索,但找不到阻止这种情况的方法。有可能的?

提前致谢!

postgresql security permissions users password

7
推荐指数
1
解决办法
1872
查看次数

如何检查 PostgreSQL 中是否没有时间间隔?

架构

CREATE TABLE "expenses_commissionrule" (
    "id" serial NOT NULL PRIMARY KEY, 
    "country" varchar(2) NOT NULL, 
    "created" timestamp with time zone NOT NULL, 
    "modified" timestamp with time zone NOT NULL, 
    "activity" tsrange NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

说明

我想创建一个应用程序来管理佣金计算。每个规则都有活动期。每个国家都有一套独立的规则。

约束

第一的。为避免歧义,这些活动期不应重叠。我做了以下约束:

ALTER TABLE expenses_commissionrule 
ADD CONSTRAINT non_overlapping_activity 
EXCLUDE USING GIST (country WITH =, activity WITH &&);
Run Code Online (Sandbox Code Playgroud)

第二。在任何时间点都应该只有一个佣金规则,因此表中的间隔之间不应存在间隙。换句话说,所有区间的总和应该是 -INF:+INF。

问题:如何添加第二个约束?用例:我们有一个无限期的规则。我想切换到新规则,该规则应从下个月开始。在这种情况下,我想将当前规则结束期设置为当月月底,并在单个操作中添加新规则。

更新:将来我想添加以下行为:

  1. 仅为特定用户指定规则的能力(通过可为空的外键“user_id”);
  2. 每个用户都可以为每个国家/地区制定自己的规则。如果用户没有规则——“全局”规则将用于佣金计算,所以它就像一个后备;
  3. 这些“用户”规则可以有任何活动时间段 - (-inf: inf) 和具体的时间间隔。它与“全局”规则不同——这里的差距是可以的。
  4. 由于“可能是”功能 - 额外的 varchar 字段,这将有一种情况,当可以应用特定规则以在计算过程中具有更大的灵活性时。这个“部分”规则也可能有不同的间隔,间隙是可以的。

换句话说,所有先前的约束都应仅应用于 user_id 为 NULL 的行。如何做到这一点?

PostgreSQL …

postgresql database-design constraint interval

7
推荐指数
1
解决办法
685
查看次数