我有以下场景:
一张巨大的桌子,也是目前系统中使用最多的桌子。我所说的巨大是指它的行数很大,实际磁盘大小也很大,因为它有 2 个字节的数组列,可以从我们的系统中保存文件。
问题是当我需要从中删除大量行时。首先,我只尝试了一个 delete within语句,但是当我决定重新启动数据库时,它冻结了整个表(不使用系统)大约 45 分钟。
然后我尝试删除 10 个注册表的块,并尝试删除 8k+ 行。它真的很慢,从那个表中获取数据的地方也很慢,当它删除了大约 700 行时,我启动了另一个使用同一个表的进程,并出现了死锁。
我应该如何从该表中进行这些批量删除?我考虑将表分成 2 个,一个用于包含大部分表卷的 2 字节数组,另一个用于包含其余信息(这些简单的东西,如 varchars、整数、日期时间等)。在这些删除情况下,这样做对我有好处吗?或者行数仍然会导致表上的这些锁?
SQL 的版本是 Microsoft SQL Server Standard(64 位)12.0.5000.0。
所以我问这个是为了看看这是否在 SQL 中是可能的。
我目前正在为一个 VB.Net 应用程序编写一些存储过程,我正在使用它与我的数据库中的数据进行交互。
我正在创建一个程序来删除一组记录,但想知道程序本身是否可以要求确认该项目将被删除。类似于消息提示或程序暂停以等待进一步输入的内容。
如果这不可行,我知道如何在 VB.Net 端管理它,我只是想在数据库本身中保留尽可能多的 SQL 和数据库内容。
我正在基于查询对非常大的 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)
如果按照上述逻辑删除数百万条记录如何。任何优点和缺点。
我们有一个相当大的 MS SQL 数据库,有数百万行。我创建了一个简单的脚本来删除超过 1 个月的行,但这似乎锁定了表并给应用程序带来了麻烦。
该表有一个索引的“ID”PK,还有一个我将用于此任务的“日期”列。
在不导致锁定的情况下执行此操作的最佳方法是什么?我正在考虑分区,但不确定它是否是最好的方法。提前致谢。
我在 Oracle 11 中的删除非常慢。这些表由外键链接,每个外键约束都设置了删除级联。
如果我在这样的语句上点击解释按钮,DELETE FROM TOP_LEVEL_TABLE WHERE SOMETHING = 'whatever'它只会显示我的TOP_LEVEL_TABLE参与,即使涉及 30 个其他表。
我怎样才能得到更真实的结果?
我想删除表中的一个条目,其中多个字段与另一个选择子查询的结果相匹配,该查询从另一个表中获取数据。
这是我到目前为止所拥有的,尽管它不起作用:
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) 在调查其他人编写的存储过程时,我遇到了以下 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 用于其他地方,但事实并非如此。我想不出有什么好的理由使简单的删除语句如此复杂。您是否也认为这是一个糟糕的设计,或者有什么我看不到的地方?
我有一个小问题。我必须从我们的数据库中删除所有数据。我不想删除表,只想删除数据集。
总共有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)
但这是无效的。如何有效地从所有表中删除所有数据?
我有多个表备份了数据,现在暂时删除旧数据,由于空间限制,目前无法选择存档。我试过运行以下命令:
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 的空间。我已经考虑将我想要保留的数据放在中间表中,截断和重新填充,但我担心在这些操作完成时我们会用完磁盘上的空间。这是一个生产数据库。我继承了这个烂摊子,我正在尝试清理它并试图清理这个数据库,这样我们就可以保持功能,直到我们可以安装新硬件。
是否有任何我(数据库管理的相对新手)没有遇到过的方法可以让我以更快、更有效的方式执行此操作?
*表名和列名已匿名。
编辑

我需要从大表中删除重复的行。实现这一目标的最佳方法是什么?
目前我使用这个算法:
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) delete ×10
sql-server ×6
oracle ×2
table ×2
deadlock ×1
duplication ×1
explain ×1
mysql ×1
oracle-11g ×1
partitioning ×1
performance ×1
plsql ×1
select ×1
subquery ×1