也许我在这里遗漏了一些东西:
CREATE TABLE public.example_table (
id integer UNIQUE
);
CREATE TABLE public.foreign_table (
id integer,
example_table_id integer,
CONSTRAINT fk_example_table_id
FOREIGN KEY (example_table_id)
REFERENCES public.example_table (id)
ON DELETE SET NULL
);
INSERT INTO public.example_table (id) VALUES
(1);
INSERT INTO public.foreign_table (id, example_table_id) VALUES
(1, 1),
(2, null);
Run Code Online (Sandbox Code Playgroud)
如果我运行TRUNCATE CASCADE,两个表都会被擦除,这不是我预期会发生的情况。
TRUNCATE example_table CASCADE;
SELECT COUNT(*) FROM public.foreign_table;
0
Run Code Online (Sandbox Code Playgroud)
我期望发生的情况会foreign_table改变为:
(1, null)
(2, null)
Run Code Online (Sandbox Code Playgroud)
我是否不明白 SET NULL 应该完成什么?
有没有办法使用 TRUNCATE CASCADE 而不将其从另一个表中删除?我在可以调用的地方使用 Laravel Model::truncate();,它会自动截断表并重置我的索引,我希望我可以调用它example_table并让它重置所有行foreign_table, …
PostgreSQL 版本:我的本地安装是 11.3,下面的小提琴是 10.0。两者的行为相同。
我有一个页面架构,每个页面都有部分,每个部分可以有不同类型的内容。当我查询某个页面时,我希望在 JSON 文档中输出有关该页面的所有信息。
我将 CTE 用于json_agg()每个部分的各种内容。最后,我将各个部分连接起来json_object_agg(),将部分标题映射到部分内容。
问题: json_object_agg()当页面没有任何部分时抛出错误。我已经通过使用没有章节标题的常规来验证有罪json_agg()。确切的错误:
error: field name must not be null
Run Code Online (Sandbox Code Playgroud)
我想要的:无论如何都不是错误。我不想在接收方进行自定义错误处理。如果查询可以返回 JSONNull来代替json_object_agg()没有部分的情况,那就更好了,但这是可选的。(欢迎其他优雅的解决方案)
文档
可能文档不完整或者我遗漏了一些东西。仅供参考。
在聚合表达式上它说(强调我的):
大多数聚合函数都会忽略 null 输入,因此一个或多个表达式产生null 的行将被丢弃。除非另有说明,对于所有内置聚合,这可以 假定为 true 。
在聚合函数中,json_object_agg()没有评论不处理null:
将名称/值对聚合为 JSON 对象
摆弄错误的域参数。将域更改为其他选项可以使其正常工作。使用不存在的域也可以正常工作并返回 0 行。
询问
with secs as (
select p.page_id, p.domain, s.section_id as sid, s.title as title
from pages p
left …Run Code Online (Sandbox Code Playgroud) 我有一个表,每天都会添加大约 2000 万条记录,我试图对其进行分页,以便人们可以访问其中的所有数据,但查询时间必须“合适”(在我的例子中)定义为少于 30 秒/查询)。
为此,我过去一直使用键集分页,但对于这个特定的查询和表,我的查询时间非常慢,这似乎是因为查询规划器决定过滤掉一天的数据,然后对其运行过滤器而不是索引条件扫描。
该表如下所示:
create table mmsi_positions_archive
(
id bigserial not null
constraint mmsi_positions_archive_pkey
primary key,
position_id uuid,
previous_id uuid,
mmsi bigint not null,
collection_type varchar not null,
accuracy numeric,
maneuver numeric,
rate_of_turn numeric,
status integer,
speed numeric,
course numeric,
heading numeric,
position geometry(Point,4326),
timestamp timestamp with time zone not null,
updated_at timestamp with time zone default now(),
created_at timestamp with time zone default now()
);
create index ix_mmsi_positions_archive_mmsi
on mmsi_positions_archive (mmsi);
create index ix_mmsi_positions_archive_position_id
on mmsi_positions_archive …Run Code Online (Sandbox Code Playgroud) postgresql performance postgresql-9.6 postgresql-performance
也许双重帖子,但我在这里找不到任何答案。
我看到了几篇如何命名我的表的帖子,我明白(半官方)它应该包含小写字母,应该下划线和单数(fe my_table)
当我必须执行以下操作时,我的问题出现了。我有一个应用程序,其中有用户、平台和 user_info,其中平台是用户正在使用的内容(例如 MAC、PC、LINUX)。如果我需要在用户和平台之间创建联结表,我该如何命名它,以便下一个浏览模式的人了解用户和平台有一个名为 user_platform 的联结表,但当他看到表 user_info 时不会感到困惑?
BR
我正在尝试配置最新的 pgbouncer 以与 postgres 9 一起使用。我可以使用psql正确的密码连接到我的数据库,但是当我使用时,psql -p 6432我无法连接,错误消息为psql: ERROR: auth failed
这似乎可能是由我的 userlist.txt 文件引起的,但我不确定。我检查过,所有必需的文件均由 Postgres 系统用户完全拥有
pgbouncer.ini
[databases]
postgres = host=localhost port=5433 auth_user=postgres dbname=postgres
[pgbouncer]
pidfile = /usr/local/pgbouncer-1.9.0/pgbouncer.pid
logfile = /usr/local/pgbouncer-1.9.0/log/pgbouncer.log
user = postgres
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /usr/local/pgbouncer-1.9.0/etc/userlist.txt
Run Code Online (Sandbox Code Playgroud)
用户列表.txt
"postgres" "md5<MD5 SUM>"
用于启动 pgbouncer 的命令
./bin/pgbouncer -d etc/pgbouncer.ini
日志输出显示失败
2019-08-20 13:46:01.080 16446 LOG C-0x1028ce0: postgres/postgres@127.0.0.1:43286 login attempt: db=postgres user=postgres tls=no
2019-08-20 13:46:01.080 16446 LOG C-0x1028ce0: postgres/postgres@127.0.0.1:43286 closing …Run Code Online (Sandbox Code Playgroud) 我正在尝试对 RDS 实例上的 PostgreSQL 数据库进行我认为常见的设置。我希望有:
public架构上,还是在自定义架构上,我都不太关心GRANT我已尝试以下操作但无济于事,postgres用户是由 RDS 创建的具有角色的用户rds_superuser:
-- Making sure roles can't do anything on the database without explicit grant
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE my_database FROM PUBLIC;
CREATE SCHEMA my_schema;
-- Read-write
CREATE ROLE read_write;
GRANT CONNECT ON DATABASE my_database TO read_write;
GRANT USAGE, CREATE ON SCHEMA my_schema TO read_write;
GRANT SELECT, INSERT, UPDATE, …Run Code Online (Sandbox Code Playgroud) 我想使用 TABLESAMPLE 从 PostgreSQL 满足特定条件的行中随机采样。
这运行良好:
select * from customers tablesample bernoulli (1);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将条件嵌入脚本中。例如这个
select * from customers where last_name = 'powell' tablesample bernoulli (1);
Run Code Online (Sandbox Code Playgroud)
抛出这个错误:
SQL 错误 [42601]:错误:“tablesample”位置或附近的语法错误
:71
目前 Postgres 12.5 上有一个非常大的表,包含超过 22 亿行。表的总大小(包括索引)为 500 GB。我们需要执行一个查询,以便从数据集中找到一组有效行并对它们进行更新。该查询看起来像这样:
select id, col4 from table where col1=$1 and col2=$2 and col3='f' and col4>0 order by col5 limit 10
Run Code Online (Sandbox Code Playgroud)
为了服务此查询,表上有一个索引ON (col1, col2, col5),并且查询使用此索引。到目前为止,一切都很好。当缓冲区未命中时数据库需要执行大量磁盘查找时,就会出现问题。这会导致查询等待DataFileRead。
到目前为止,我们使用的是 16 vCPU 和 128 GB 的机器,存储类型为 io1,预配置 IOPS 为 20000 进行托管(托管在 AWS RDS 上)。我们一开始配置的 IOPS 约为 3000,并不断增加它,希望通过积极的自动清理和数据本地化,它能够稳定在某个值。autovacuum 的配置方式是每隔几天在此表上运行一次。我们最近遇到一个问题,读取 IOPS 开始达到 20000,并且应用程序变得太慢。由于我们无法再在之前的机器上提供超过 20000 的 IOPS,因此我们升级到了一台更大的机器,其大小恰好是原来的两倍。
在较大的计算机上,我们观察到即使读取 IOPS 现在也已降至约 5000,并且该计算机现在在峰值时间消耗的总体 IOPS 约为 6000,并且查询时间精确地减半。我们假设,这肯定与shared_bufferpostgres 现在可用于将热引用行保留在缓存中的更高版本有关。
问题是我们现在使用的机器以大约 5% 的 CPU 负载运行,并且还有 184 GB 的 RAM 仍未使用。总而言之,这台机器的利用率严重不足。我们希望通过对参数进行任何更改来使用较小的机器,以便该查询可以在一些可容忍的延迟限制下运行。我们在之前的机器上尝试过多次内存调整,以充分利用RAM。但增加到shared_buffer …
我用来pg_stat_statements查找生产 PostgreSQL 13 中的慢查询。有两件事:
我不确定此扩展对性能的影响。
我可以做些什么来提高其性能吗?下面的查询需要 > 1 秒 - 有什么建议吗?
-- add the plugin
create extension pg_stat_statements;
select pg_stat_reset();
select pg_stat_statements_reset();
Run Code Online (Sandbox Code Playgroud)
进而:
-- find slow queries using the extension:
select * from pg_stat_statements order by total_exec_time desc limit 50;
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中有一列的值为外键,但外键的目标表因行而异。相关表可以仅根据键值来确定,并且存在一小组固定的此类表。
\n我想在此处添加外键约束,以便我的 DBMS 可以确保引用完整性。当然,我不能直接执行此操作,但我有一个建议的解决方案,其中涉及带有传入和传出外键约束的中间“转发表”。我正在寻找评论:
\nGENERATED ALWAYS AS ... STOREDPostgres列的这种使用是否合理或可疑;为了说明该解决方案,请考虑一个存储“用户”和“组”的简单数据库。用户和组均由整数 ID 作为键控,\n并且 ID 的某些位被保留以告知其 ID 类型:
\n-- User and group IDs are both integers, but are in disjoint subsets of the key\n-- space, distinguished by the low 8 bits.\nCREATE DOMAIN userid AS int8 CHECK ((VALUE & 255) = 1);\nCREATE DOMAIN groupid AS int8 CHECK ((VALUE & 255) = 2);\n\nCREATE TABLE users(\n user_id userid …Run Code Online (Sandbox Code Playgroud) postgresql ×10
amazon-rds ×2
aggregate ×1
json ×1
performance ×1
permissions ×1
pgbouncer ×1
query ×1
random ×1
table ×1
truncate ×1
where ×1