小编Zil*_*ilk的帖子

是否可以使用 PostgreSQL 快速创建/恢复数据库快照?

首先,我是一名开发人员,而不是 DBA 或系统管理员;请温柔:)

我正在开发一个应用程序工作流,其中单个用户操作将触发数据库中的复杂更改 - 在某些表中创建数百条记录,在其他表中更新数百条记录,等等。总而言之,大约 12 个表(大约 100 ) 被这个动作感动了。由于复杂性,我很难在运行另一个测试之前手动恢复所有更改。在我的大部分开发时间中,我可以简单地在工作流末尾插入一个“ROLLBACK”语句,但是当我接近提交我的更改时,我需要测试真实的东西。

我有要使用的生产数据库的本地副本。就我而言,测试之间的转储和恢复比编写脚本来撤消所有更改要快。它更快,但它仍然让我慢了很多(在我老化的笔记本电脑上恢复大约需要 20 分钟)。有什么办法可以保存数据库当前状态的快照,然后快速恢复它?

我保证是系统上唯一的用户,并且我有 root 访问权限。tar'ed 和 gzip'ed 后,数据库转储约为 100MB。PostgreSQL 版本是 8.3。

在此先感谢您提供任何有用的想法。

postgresql snapshot restore

58
推荐指数
3
解决办法
3万
查看次数

为什么复合外键需要单独的唯一约束?

这是一个简单的表,其中记录可以引用同一个表中的父记录:

CREATE TABLE foo (
    id         SERIAL  PRIMARY KEY,
    parent_id  INT     NULL,
    num        INT     NOT NULL,
    txt        TEXT    NULL,
    FOREIGN KEY (parent_id) REFERENCES foo(id)
);
Run Code Online (Sandbox Code Playgroud)

由于增加了其他字段值之一 ( num) 在父记录和子记录之间必须相同的要求,我认为复合外键应该可以解决问题。我将最后一行更改为

    FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
Run Code Online (Sandbox Code Playgroud)

并得到错误:没有唯一约束匹配给定键的引用表 "foo"

我可以很容易地添加这个约束,但我不明白为什么它是必要的,当引用的列 ( id) 之一已经保证是唯一的?在我看来,新的约束将是多余的。

postgresql foreign-key constraint unique-constraint

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

过滤 UNION ALL 结果比过滤每个子查询慢得多

编辑:请参阅结尾以获得更简单的示例)

我在一个名为“cases”(135k 行,29 列)的表中搜索。此表中的某些行具有父子关系类型(不同类型),这意味着对于这些记录,必须混合使用父/子字段来过滤和显示。

我已经确定了四种不同的父子关系并为它们创建了视图:

  • caselist_no_specials:不是子记录,按原样使用记录数据;总共 116106 行。
  • caselist_disputes_with_ipr:子记录;共 138 行。
  • caselist_mark_children:子记录;总共 18132 行。
  • caselist_design_children:子记录;共 671 行。

这些视图的结果不重叠,共同覆盖了表格的 100%。

当我选择所有这些的联合并分别过滤每个视图时,查询需要大约 9 毫秒。选择所有视图的联合并过滤其结果大约需要 500 毫秒。

我还在没有视图的情况下对此进行了测试,内联了它们包含的查询,但没有产生可衡量的改进。

这是快速查询(解释):

  SELECT  c.*
    FROM  caselist_no_specials c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id = 12046

   UNION ALL

  SELECT  c.*
    FROM  caselist_disputes_with_ipr c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id = 12046

   UNION ALL

  SELECT  c.*
    FROM  caselist_mark_children c
    JOIN  case_clients cacl ON cacl.case_id = c.main_id
   WHERE  cacl.client_id …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view union postgresql-performance

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