我们有一个只有大约 500 行的表,但这对我们来说非常重要。
我想查看发生在此表上的所有更改。应使用时间戳跟踪更改。
我不希望在应用程序代码中进行跟踪,因为我也想跟踪通过psqlshell发生的更改。
我对特定于 PostgreSQL 的解决方案感到满意,因为在这种情况下我没有使用不同的数据库。
我有这个有效的 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) 有没有办法检查两个 SQL 语句的数学相等性?
我有两个 SQL 语句:
对数据运行这两个语句并比较输出根本没有帮助。
需要评估语句背后的集合数学,就像方程求解器一样。
超出我的问题范围的是:
范围内:
我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。
随着psql我的意思是交互式命令行。
我会很高兴有一个工具可以扩展到*引用的列名列表。然后我可以移除列以手动移除。
我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。
我阅读了这篇关于 SSD 上 PostgreSQL 性能的文章:
这两个配置似乎很重要random_page_costvsseq_page_cost
由于两个参数都需要匹配特定的硬件,我想知道是否可以自动检测匹配值?
更新
我脑子里有这些步骤:
我的步骤:
pg_dumpall在服务器上运行 finalprod-server-oldprod-server-old永远。prod-server-new)prod-server-new现在如何避免在pg_dumpall(step1和step2之间)期间对数据库进行修改,使这段时间的修改不会丢失?
在我的情况下,有一个小的停机时间是 100% 可以的。
“集群”中有几个数据库(顺便说一句,我不喜欢“集群”这个词。我想大多数人认为“集群”是一组多台计算机,但在这种情况下,它指的是一台 Postgres 服务器,其中包含几个数据库)。
我的问题被标记为可能与“使 Postgres 数据库暂时只读(用于执行卷快照)”重复。我不认为它是重复的,因为在我的情况下是不同的,因为我不要求临时只读状态。
如果你只看数据库,一切都很好。您有事务,如果出现问题,一切都会回滚。这很好 - 我喜欢这个。
但是:我想发送邮件。现在我遇到了麻烦,因为我无法回滚。
例子:
如何解决这个问题是另一个问题,而不是这个问题。
这个问题一般怎么称呼这个。在这个例子中是关于发送邮件。但是,一旦您在事务边界之外的系统中修改某些内容,就会出现同样的问题。
这个问题有名字吗?
如果您想从目录中导入文件,大致会出现同样的问题。如果您删除事务内的文件,则事务可能会失败并且文件被删除但从未导入。或者您在交易后删除该文件。然后文件的删除可能会失败,并且该文件会再次导入。
我不想为此重新发明解决方案。这就是为什么我需要这个问题的匹配项。然后我可以阅读一些论文,了解什么是 2018 年的“最新技术”。
在单元测试中,我们运行:
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
如何从较大的范围中减去较小的子范围?
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?
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
postgresql ×7
audit ×1
cte ×1
deadlock ×1
except ×1
migration ×1
performance ×1
pg-dump ×1
psql ×1
range-types ×1
recursive ×1
ssd ×1
subquery ×1
terminology ×1