我在 PostgreSQL 9.2 上有一个数据库,它有一个包含大约 70 个表的主模式和可变数量的相同结构的每个客户端模式,每个模式有 30 个表。客户端模式具有引用主模式的外键,而不是相反。
我刚刚开始用一些从以前版本中获取的真实数据填充数据库。当我不得不在主模式的一个非常中心的表中进行批量删除时,数据库已经达到大约 1.5 GB(预计在几周内会增长到几十 GB)。所有相关的外键都标记为 ON DELETE CASCADE。
这将需要很长时间,这并不奇怪,但 12 小时后很明显,我最好重新开始,删除数据库并再次启动迁移。但是,如果我稍后需要在数据库处于活动状态且更大时重复此操作怎么办?有没有替代的、更快的方法?
如果我编写一个脚本来浏览依赖表,从离中心表最远的表开始,逐表删除依赖行,会快得多吗?
一个重要的细节是某些表上有触发器。
我想在 Web 应用程序中实现“取消删除”功能,以便用户可以改变主意并恢复已删除的记录。关于如何实现这一点的想法?我考虑过的一些选项实际上是删除有问题的记录并将更改存储在单独的审计表中,或者不删除记录并使用布尔“已删除”列将其标记为已删除。后一种解决方案需要额外的应用程序逻辑来在正常情况下忽略“已删除”的记录,但会更容易在应用程序端实现恢复记录。
使用 SQL Server 2005。
我正在执行一个没有 where 子句的巨大 DELETE FROM。它基本上等同于 TRUNCATE TABLE 语句 - 除了我不允许使用 TRUNCATE。问题是表很大 - 1000 万行,需要一个多小时才能完成。有没有办法让它更快,没有:
t-log 已经在一个单独的磁盘上。
欢迎任何建议!
我有一张桌子占用了我们服务器上接近 90% 的高清空间。我决定删除几列以释放空间。但我需要将空间归还给操作系统。但是,问题是我不确定如果我运行 VACUUM FULL 并且没有足够的可用空间来制作表的副本会发生什么。
我知道不应使用 VACUUM FULL,但我认为这是这种情况下的最佳选择。
任何想法,将不胜感激。
我正在使用 PostgreSQL 9.0.6
我想知道从 PostgreSQL 中删除大量行的最有效方法是什么,这个过程将是每天重复性任务的一部分,以将数据(插入 + 删除的增量)批量导入表中。可能有数千甚至数百万行要删除。
我有一个主键文件,每行一个。我想到的两个选项与下面的内容一致,但我对 PostgreSQL 的内部结构知之甚少,无法做出最好的明智决定。
DELETE使用简单WHERE的主键对文件中的每一行执行查询(或n使用IN()子句分批删除)COPY命令将主键导入到临时表中,然后使用连接从主表中删除任何建议将不胜感激!
我的老板昨天收到一个客户的询问,询问他们如何找出谁删除了他们 SQL Server 数据库中的某些数据(如果重要的话,它是快速版)。
我认为这可以从事务日志中找到(前提是它没有被截断) - 这是正确的吗?如果是这样,您实际上如何查找这些信息?
我在 PostgreSQL 9.3 数据库中有两个表: Tablelink_reply有一个which_group指向 table的外键link_group。
我想删除link_group不link_reply存在相关行的所有行。听起来很基本,但我一直在努力。
会不会像这样简单(不工作)?
DELETE FROM link_group WHERE link_reply = NULL;
Run Code Online (Sandbox Code Playgroud) 我继承了一个数据库,并希望对其进行清理和加速。我有一个包含 30,000,000 行的表,其中许多是由于我们程序员的错误而插入的垃圾数据。在添加任何新的、更优化的索引之前,我将表从 MyISAM 转换为 InnoDB,并希望删除大量包含垃圾数据的行。
数据库是 MySQL 5.0,我有服务器的 root 访问权限。我首先通过 Adminer 运行这些命令,然后通过 phpMyAdmin 运行,结果相同。
我正在运行的命令是,
DELETE
FROM `tablename`
WHERE `columnname` LIKE '-%'
Run Code Online (Sandbox Code Playgroud)
本质上,删除此列中以 dash 开头的任何内容-。
它运行了大约 3-5 分钟,然后当我查看进程列表时,它消失了。
然后我跑,
SELECT *
FROM `tablename`
WHERE `columnname` LIKE '-%'
Run Code Online (Sandbox Code Playgroud)
它返回数百万行。
为什么我的删除语句没有完成?
PS,我知道 MySQL 5.0 已经过时了。我正在将数据库移动到 MySQL 5.6 w InnoDB(可能是 MariaDB 10 w XtraDB),但在此之前,我希望按原样使用 DB 来回答这个问题。
——
编辑已删除,请参阅我的答案。
我的restrictionsPostgreSQL 数据库中有一个小(约 10 行)表,其中每天删除和插入值。
我想要一个名为 的表restrictions_deleted,从中删除的每一行都restrictions将自动存储。由于restrictions具有序列号,因此不会有重复项。
如何在 PostgreSQL 中编写这样的触发器?
最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了 - 性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。
@Table Variable #Temp (delete) #Temp (truncate)
--------------- -------------- ----------------
5723 5180 5506
15636 14746 7800
14506 14300 5583
14030 15460 5386
16706 16186 5360
Run Code Online (Sandbox Code Playgroud)
只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka GetDate()) 是在语句时使用的,而不是批处理时,因此 TRUNCATE/DELETE 与SET @StartTime = CURRENT_TIMESTAMP语句之间不应有交互。
select current_timestamp
waitfor delay '00:00:04'
select current_timestamp
-----------------------
2012-10-21 11:29:20.290
-----------------------
2012-10-21 11:29:24.290
Run Code Online (Sandbox Code Playgroud)
当使用 DELETE 清除表时,第一次运行和后续运行之间的跳转非常一致。我对DELETE 的理解缺少什么?我已经重复了很多次,交换了顺序,调整了 tempdb 的大小以使其不需要增长等。
CREATE TABLE #values (
id int identity primary key, -- will be clustered …Run Code Online (Sandbox Code Playgroud) delete ×10
postgresql ×5
performance ×3
sql-server ×3
audit ×2
alter-table ×1
bulk ×1
innodb ×1
join ×1
myisam ×1
mysql ×1
mysql-5.0 ×1
plpgsql ×1
transaction ×1
trigger ×1
truncate ×1
vacuum ×1