小编gue*_*tli的帖子

跟踪对 PostgreSQL 表的所有修改

我们有一个只有大约 500 行的表,但这对我们来说非常重要。

我想查看发生在此表上的所有更改。应使用时间戳跟踪更改。

我不希望在应用程序代码中进行跟踪,因为我也想跟踪通过psqlshell发生的更改。

我对特定于 PostgreSQL 的解决方案感到满意,因为在这种情况下我没有使用不同的数据库。

postgresql audit change-tracking

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

CTE:让所有父母和所有孩子都在一个声明中

我有这个有效的 CTE 示例。

我可以选择所有祖父母和所有孩子。

但是如何在一个语句中选择所有祖父母和所有孩子?

在这个例子中,如果我给“父亲”作为输入,我想要祖父,父亲,儿子作为输出。

我使用 PostgreSQL。但我认为这个问题应该是标准的SQL。

如果我使用 PostgreSQL 特定的语法,请纠正我。

DROP table if exists tree;

CREATE TABLE tree (
 id SERIAL PRIMARY KEY,
 name character varying(64) NOT NULL,
 parent_id integer REFERENCES tree NULL
);

insert into tree values (1, 'Grandfather', NULL);
insert into tree values (2, 'Father', 1);
insert into tree values (3, 'Son', 2);


-- -------------------------------------
-- Getting all children works  

WITH RECURSIVE rec (id) as
(
  SELECT tree.id, tree.name from tree where name='Father'

  UNION ALL

  SELECT tree.id, …
Run Code Online (Sandbox Code Playgroud)

postgresql cte recursive

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

两条 SQL 语句的数学相等性

有没有办法检查两个 SQL 语句的数学相等性?

我有两个 SQL 语句:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

对数据运行这两个语句并比较输出根本没有帮助。

需要评估语句背后的集合数学,就像方程求解器一样。

超出我的问题范围的是:

  • 等式以外的比较(大于、小于、LIKE、...)
  • 存储过程或触发器
  • 公用表表达式 (WITH)

范围内:

  • 子选择:WHERE other_id IN (SELECT id FROM other WHERE ...)
  • 加入

database-theory

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

psql: SELECT * ... 除了一列

我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。

随着psql我的意思是交互式命令行。

我会很高兴有一个工具可以扩展到*引用的列名列表。然后我可以移除列以手动移除。

我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。

postgresql psql

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

自动检测“random_page_cost”与“seq_page_cost”

我阅读了这篇关于 SSD 上 PostgreSQL 性能的文章:

https://amplitude.engineering/how-a-single-postgresql-config-change-improved-slow-query-performance-by-50x-85593b8991b0

这两个配置似乎很重要random_page_costvsseq_page_cost

由于两个参数都需要匹配特定的硬件,我想知道是否可以自动检测匹配值?

更新

我脑子里有这些步骤:

  1. 脚本创建一些虚拟表
  2. 脚本向表中插入数据
  3. 脚本执行一些查询
  4. 脚本显示 random_page_cost 和 seq_page_cost 的匹配值
  5. 人工或自动化系统获取这些值并更新配置。这一步不是问题的一部分。

postgresql ssd

10
推荐指数
1
解决办法
9188
查看次数

如何防止更改我的 PostgreSQL 数据库?

我的步骤:

  1. pg_dumpall在服务器上运行 finalprod-server-old
  2. 关掉 prod-server-old永远。
  3. 将输出复制到不同的服务器 ( prod-server-new)
  4. 在那里恢复数据库。
  5. 所有流量都到prod-server-new现在

如何避免在pg_dumpall(step1和step2之间)期间对数据库进行修改,使这段时间的修改不会丢失?

在我的情况下,有一个小的停机时间是 100% 可以的。

“集群”中有几个数据库(顺便说一句,我不喜欢“集群”这个词。我想大多数人认为“集群”是一组多台计算机,但在这种情况下,它指的是一台 Postgres 服务器,其中包含几个数据库)。

我的问题被标记为可能与“使 Postgres 数据库暂时只读(用于执行卷快照)”重复。我不认为它是重复的,因为在我的情况下是不同的,因为我不要求临时只读状态。

postgresql migration pg-dump

9
推荐指数
1
解决办法
3473
查看次数

非事务保存操作的术语

如果你只看数据库,一切都很好。您有事务,如果出现问题,一切都会回滚。这很好 - 我喜欢这个。

但是:我想发送邮件。现在我遇到了麻烦,因为我无法回滚。

例子:

  1. 交易开始
  2. 邮件被发送
  3. 其他事情完成(在 DB 内)
  4. 出了点问题。
  5. 回滚。

如何解决这个问题是另一个问题,而不是这个问题。

这个问题一般怎么称呼这个。在这个例子中是关于发送邮件。但是,一旦您在事务边界之外的系统中修改某些内容,就会出现同样的问题。

这个问题名字吗?

如果您想从目录中导入文件,大致会出现同样的问题。如果您删除事务内的文件,则事务可能会失败并且文件被删除但从未导入。或者您在交易后删除该文件。然后文件的删除可能会失败,并且该文件会再次导入。

我不想为此重新发明解决方案。这就是为什么我需要这个问题的匹配项。然后我可以阅读一些论文,了解什么是 2018 年的“最新技术”。

terminology

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

事务中的 TRUNCATE:死锁

在单元测试中,我们运行:

BEGIN;
TRUNCATE table1;
TRUNCATE table2;
...
UPDATE ...;
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果 cron 作业启动并且该作业在 table1 和 table2 上运行,这会导致死锁。

DatabaseError: deadlock detected
DETAIL:  Process 15815 waits for AccessExclusiveLock on relation 291262 of database 290999; blocked by process 16391.
Process 16391 waits for RowShareLock on relation 291431 of database 290999; blocked by process 15815.
Run Code Online (Sandbox Code Playgroud)

有没有办法将单元测试与 cron 作业隔离(以避免死锁)?

我们在 x86_64 linux 上运行 PostgreSQL 9.0.10

postgresql deadlock

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

PostgreSQL:范围差异的结果不会是连续的

如何从较大的范围中减去较小的子范围?

123456789
    567
Run Code Online (Sandbox Code Playgroud)

结果:

1234   89
Run Code Online (Sandbox Code Playgroud)

查询语句:

select '[1,9]'::int4range - '[5,7]'::int4range;
ERROR:  result of range difference would not be contiguous
Run Code Online (Sandbox Code Playgroud)

结果不适合 int4range,因为它不连续。

如何将结果作为一组 int4ranges?

postgresql range-types

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

子选择需要“年龄” - EXCEPT要快得多

创建表的脚本

DROP TABLE IF EXISTS history;
CREATE TABLE history (
    id integer NOT NULL,
    ticket_id integer NOT NULL);
ALTER TABLE ONLY history ADD CONSTRAINT history_pkey PRIMARY KEY (id);
CREATE INDEX history_ticket_id ON history USING btree (ticket_id);
DROP TABLE IF EXISTS ticket;
CREATE TABLE ticket (
    id integer NOT NULL
);
ALTER TABLE ONLY ticket ADD CONSTRAINT ticket_pkey PRIMARY KEY (id);
Run Code Online (Sandbox Code Playgroud)

虚拟数据

INSERT INTO history values (generate_series(1, 30000), generate_series(1, 30000));
ANALYZE history;

INSERT INTO ticket values (generate_series(1, 40000));
ANALYZE ticket;
Run Code Online (Sandbox Code Playgroud)

使用子选择查询 …

performance subquery postgresql-9.3 except postgresql-performance

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