gpt4 book ai didi

postgresql - 30 行很少的表 - TRUNCATE 清空它们并重置附加序列的最快方法?

转载 作者:行者123 更新时间:2023-11-29 12:29:33 25 4
gpt4 key购买 nike

我想知道,在 PostgreSQL 中完成此类任务的最快方法是什么。我对最快的解决方案很感兴趣。

我自己发现了这样一种 MySQL 解决方案,它的执行速度比仅仅一张一张地截断表要快得多。但无论如何,我也对 MySQL 最快的解决方案感兴趣。在这里查看我的结果,当然它仅适用于 MySQL:https://github.com/bmabey/database_cleaner/issues/126

我有以下假设:

  • 我有 30-100 张 table 。让他们 30 岁。
  • 一半的 table 是空的。
  • 例如,每个非空表的行数不超过 100 行。我的意思是, table 并不大。
  • 我需要一个可选的可能性来从此过程中排除 2 个或 5 个或 N 个表。

  • 我不能!使用事务。

对于在 PostgreSQL 8 和 9 上工作的这种情况,我需要最快的清理策略。

我看到了以下方法:

  1. 截断每个表。我认为它太慢了,尤其是对于空表。

  2. 通过更快的方法检查每个表是否为空,如果为空,则将其唯一标识符列(类似于 MySQL 中的 AUTO_INCREMENT)重置为初始状态(1),即从序列中恢复其 last_value为 1,否则对其运行截断。

我使用 Ruby 代码遍历所有表,在每个表上调用下面的代码,我尝试设置针对每个表运行的 SQL 代码,例如:

DO $$DECLARE r record;
BEGIN
somehow_captured = SELECT last_value from #{table}_id_seq
IF (somehow_captured == 1) THEN
== restore initial unique identifier column value here ==
END

IF (somehow_captured > 1) THEN
TRUNCATE TABLE #{table};
END IF;
END$$;

由于我不熟悉 PostgreSQL 函数和 block (和变量),所以我在各个方面操纵这段代码,但无法使其正常工作。

另外我的猜测是 EXISTS(SELECT something FROM TABLE) 可以以某种方式用作“检查程序”单元之一,清理程序应该包括,但还没有完成。

对于如何以 PostgreSQL native 方式完成此过程的任何提示,我将不胜感激。

更新:

我需要所有这些来为 Ruby 或 Ruby on Rails 项目运行单元和集成测试。每个测试在运行之前都应该有一个干净的数据库,或者在运行之后进行清理(所谓的拆卸)。事务非常好,但在针对特定网络驱动程序运行测试时它们变得不可用,在我的情况下需要切换到截断策略。一旦我引用 RoR 更新了它,请不要在这里发布关于“显然,你需要 PG 的 DatabaseCleaner”等等的答案。

更新 2:

此处描述的策略最近已合并到 DatabaseCleaner 中,https://github.com/bmabey/database_cleaner作为 :pre_count 选项(请参阅那里的自述文件)。

最佳答案

PostgreSQL 可以在单个TRUNCATE TABLE 语句中截断多个表。不要打扰迭代,只是做

TRUNCATE TABLE table1,table2,table3,...,table30;

关于postgresql - 30 行很少的表 - TRUNCATE 清空它们并重置附加序列的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com