标签: delete

管理和删除大表中的数据

我有以下场景:

一张巨大的桌子,也是目前系统中使用最多的桌子。我所说的巨大是指它的行数很大,实际磁盘大小也很大,因为它有 2 个字节的数组列,可以从我们的系统中保存文件。

问题是当我需要从中删除大量行时。首先,我只尝试了一个 delete within语句,但是当我决定重新启动数据库时,它冻结了整个表(不使用系统)大约 45 分钟。

然后我尝试删除 10 个注册表的块,并尝试删除 8k+ 行。它真的很慢,从那个表中获取数据的地方也很慢,当它删除了大约 700 行时,我启动了另一个使用同一个表的进程,并出现了死锁。

我应该如何从该表中进行这些批量删除?我考虑将表分成 2 个,一个用于包含大部分表卷的 2 字节数组,另一个用于包含其余信息(这些简单的东西,如 varchars、整数、日期时间等)。在这些删除情况下,这样做对我有好处吗?或者行数仍然会导致表上的这些锁?

SQL 的版本是 Microsoft SQL Server Standard(64 位)12.0.5000.0。

sql-server deadlock delete table

4
推荐指数
1
解决办法
1160
查看次数

存储过程在处理时要求输入

所以我问这个是为了看看这是否在 SQL 中是可能的。

我目前正在为一个 VB.Net 应用程序编写一些存储过程,我正在使用它与我的数据库中的数据进行交互。

我正在创建一个程序来删除一组记录,但想知道程序本身是否可以要求确认该项目将被删除。类似于消息提示或程序暂停以等待进一步输入的内容。

如果这不可行,我知道如何在 VB.Net 端管理它,我只是想在数据库本身中保留尽可能多的 SQL 和数据库内容。

sql-server delete

4
推荐指数
2
解决办法
2517
查看次数

调整对 sql server 表的巨大删除操作

我正在基于查询对非常大的 sql server 表执行删除操作,如下所述。

delete db.st_table_1
where service_date between(select min(service_date) from stg_table)
                   and (select max(service_date) from stg_table);
Run Code Online (Sandbox Code Playgroud)

stg_table 和 stg_table_1 在 service_date 上没有索引。

这两个表都加载了数百万行数据,删除操作需要很多时间。请求您的建议以提高此查询的性能。

我提到了下面问题中描述的策略,但无法理解如何实施它。

如何在不丢失数据的情况下删除sql server中的大量数据?

请求您对此提出善意的建议。

更新:

select * into db.temp_stg_table_1
from db.stg_table_1
where service_date not between( select min(service_date) from db.stg_table)
                             and (select max(service_date) from db.stg_table);

exec sp_rename 'stg_table_1' , 'stg_table_1_old'

exec sp_rename 'temp_stg_table_1' , 'test_table_1'

drop table stg_table_1_old
Run Code Online (Sandbox Code Playgroud)

如果按照上述逻辑删除数百万条记录如何。任何优点和缺点。

sql-server delete

4
推荐指数
1
解决办法
2016
查看次数

删除超过 x 天的行而不锁定表

我们有一个相当大的 MS SQL 数据库,有数百万行。我创建了一个简单的脚本来删除超过 1 个月的行,但这似乎锁定了表并给应用程序带来了麻烦。

该表有一个索引的“ID”PK,还有一个我将用于此任务的“日期”列。

在不导致锁定的情况下执行此操作的最佳方法是什么?我正在考虑分区,但不确定它是否是最好的方法。提前致谢。

sql-server delete partitioning table

4
推荐指数
1
解决办法
1036
查看次数

Oracle 对级联删除的解释是错误的

我在 Oracle 11 中的删除非常慢。这些表由外键链接,每个外键约束都设置了删除级联。

如果我在这样的语句上点击解释按钮,DELETE FROM TOP_LEVEL_TABLE WHERE SOMETHING = 'whatever'它只会显示我的TOP_LEVEL_TABLE参与,即使涉及 30 个其他表。

我怎样才能得到更真实的结果?

performance oracle delete oracle-11g-r2 explain

3
推荐指数
1
解决办法
1757
查看次数

从多个字段与其他表中的选择子查询匹配的表中删除

我想删除表中的一个条目,其中多个字段与另一个选择子查询的结果相匹配,该查询从另一个表中获取数据。

这是我到目前为止所拥有的,尽管它不起作用:

DELETE FROM table1
WHERE table1.id IN
   (SELECT id
   FROM table1 a JOIN table2 b
   ON a.field1 = b.field1
   AND a.field2 = b.field2
   AND a.field3 = b.field3
   AND b.id = ?
   )
Run Code Online (Sandbox Code Playgroud)

mysql delete subquery select

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

在删除记录之前检查记录是否存在是一种好习惯

在调查其他人编写的存储过程时,我遇到了以下 SQL/PLSQL:

1. V_COUNT NUMBER(5,0);
.........
2. SELECT COUNT(*) INTO V_COUNT FROM TABLE1 WHERE COL1='SOMEVALUE';
3. IF V_COUNT>0 THEN
4.   DELETE FROM TABLE1 WHERE COL1='SOMEVALUE';
5. END IF;
Run Code Online (Sandbox Code Playgroud)

仅第 4 行中的 DELETE 语句是否足以涵盖这 5 行中的所有逻辑?我首先想到可能 V_COUNT 用于其他地方,但事实并非如此。我想不出有什么好的理由使简单的删除语句如此复杂。您是否也认为这是一个糟糕的设计,或者有什么我看不到的地方?

oracle delete plsql

3
推荐指数
1
解决办法
2435
查看次数

删除所有表中的所有数据

我有一个小问题。我必须从我们的数据库中删除所有数据。我不想删除表,只想删除数据集。

总共有47张桌子。

我尝试了以下方法:

Delete FROM(select TABLE_NAME from USER_TABLES);
Delete FROM(select * from ALL_ALL_TABLES Where OWNER = 'DB_NAME')
Run Code Online (Sandbox Code Playgroud)

但这是无效的。如何有效地从所有表中删除所有数据?

delete oracle-11g-r2 oracle-11g

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

从具有非常少量扩展空间的表中删除行

我有多个表备份了数据,现在暂时删除旧数据,由于空间限制,目前无法选择存档。我试过运行以下命令:

WHILE 1 = 1 
BEGIN 
    DELETE TOP ( 4000 )
    FROM    [OLD_TABLE] WITH (TABLOCKX)
    WHERE   [Date] < '2014-01-01 00:00:00'
    IF @@ROWCOUNT = 0 
        BREAK    
END
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但非常缓慢……比如 17 多个小时,并且只删除了约 140,000 行。

这里的关键是这张表,其他需要减少的表非常大,大约有 50-6000 万行,大约有 16-17 GB 的空间。物理磁盘上只剩下 20 GB 的空间。我已经考虑将我想要保留的数据放在中间表中,截断和重新填充,但我担心在这些操作完成时我们会用完磁盘上的空间。这是一个生产数据库。我继承了这个烂摊子,我正在尝试清理它并试图清理这个数据库,这样我们就可以保持功能,直到我们可以安装新硬件。

是否有任何我(数据库管理的相对新手)没有遇到过的方法可以让我以更快、更有效的方式执行此操作?

*表名和列名已匿名。

编辑

查询执行计划

sql-server-2005 sql-server delete transaction-log

3
推荐指数
1
解决办法
147
查看次数

删除重复行的最快方法是什么?

我需要从大表中删除重复的行。实现这一目标的最佳方法是什么?

目前我使用这个算法:

declare @t table ([key] int  )

insert into @t select 1
insert into @t select 1
insert into @t select 1
insert into @t select 2
insert into @t select 2
insert into @t select 3
insert into @t select 4
insert into @t select 4
insert into @t select 4
insert into @t select 4
insert into @t select 4
insert into @t select 5
insert into @t select 5
insert into @t select 5
insert into …
Run Code Online (Sandbox Code Playgroud)

sql-server delete duplication sql-server-2014

3
推荐指数
1
解决办法
4088
查看次数