标签: delete

软删除以提高性能:全错了吗?

几年前我读到软删除会提高删除的性能,因为它不会实际删除项目并影响聚集(和所有其他)索引,它只会改变一个值。

我最近尝试了这个,但我的表现非常令人失望。

所以我在网上搜索了一个很好的软删除实现,我最终阅读的第一件事是文章/博客说“软删除是不好的”。

显然,当桌子变大时,它弊大于利......

我不认为我所做的会使表格变得更大,因为每晚(每天)的维护都会删除(真正的)所有标记为删除的行。

那么,软删除真的不利于性能吗?真正的删除是否会导致整个聚簇表完全重新排序(这将是很多磁盘操作!!!)?

performance database-design sql-server delete sql-server-2008-r2

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

在 PostgreSQL 中使用 JSONB 从数组中删除对象

我试图从我的数据库中删除一个元素。我要删除的元素位于一个名为 playerContainer 的 JSON 对象中,该对象包含一个名为玩家的数组。这一切都位于一个名为 site_content 的表中。我正在尝试根据它的 ID 删除该对象。

这是示例 JSON

"playersContainer": {
        "players": [
            {
                "id": "1",
                "name": "Nick",
                "teamName": "Shire Soldiers",
                "ratings": [
                    1,
                    5,
                    6,
                    9
                ],
                "assists": 17,
                "manOfTheMatches": 20,
                "cleanSheets": 1,
                "data": [
                    3,
                    2,
                    3,
                    5,
                    6
                ],
                "totalGoals": 19

            },
}
Run Code Online (Sandbox Code Playgroud)

下面是我试图用来删除数组中的对象的查询

UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'id'->'players' #- '{1}'::jsonb
Run Code Online (Sandbox Code Playgroud)

但是,这似乎删除了表中内容行中的所有数据,而不仅仅是我的玩家数组中 ID 为 1 的数组。

postgresql delete update json

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

从分区表的分区中删除所有数据的最快方法是什么?

我有一个分区表,在现实生活中它有 8000 万行。

出于测试目的,我在这里创建并分区了这个表

当我运行以下查询时:

select * from countries
where visit >= '20110101'
  and visit <= '20111231'
Run Code Online (Sandbox Code Playgroud)

正如您在此处和下图的查询计划中看到那样,它使用分区消除,所以我知道我在做一些正确的事情。

在此处输入图片说明

我知道分区通常不是为了加速我的查询,它是一个管理功能,但是,它可以加速对大表的查询

我将首先说明我不想要的东西。我不想从我的表中删除任何分区

我想要的是?

我想以最快的方式从分区中删除所有数据:

有什么比这更快的吗? 不考虑批量删除

BEGIN TRANSACTION T1

DELETE 
FROM dbo.countries WITH (TABLOCKX)
WHERE visit >= '20110101'
  AND visit <= '20111231'

--COMMIT TRANSACTION T1
Run Code Online (Sandbox Code Playgroud)

查询计划在这里

在此处输入图片说明

sql-server delete optimization partitioning sql-server-2014

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

从表中分块删除

我想清理我的一张有 400 万的表。所以我准备这个查询来清理它。但它抛出了一个错误,有人可以帮我解决这个问题吗?

DELIMITER $$
DROP PROCEDURE IF EXISTS archive_table $$
create procedure archive_table () 
set @min=(select min(dob) from test
              where dob < DATE_SUB(CURDATE(), INTERVAL 30 day));
while @min is not null
begin   
    delete from test where dob = @min;
    commit ;
    select min(dob) from test
            where dob > @min
              and dob < DATE_SUB(CURDATE(), INTERVAL 30 day) );
END WHILE;
END$$
Run Code Online (Sandbox Code Playgroud)

错误:

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your …
Run Code Online (Sandbox Code Playgroud)

mysql delete batch-processing

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

我可以在 DELETE 时避免 TABLOCKX 吗?

目标

删除三个表中数十亿条旧记录(大约 600GB),停机时间为零。

方法论和背景

我计划一次删除与 100 万个 MyID 关联的批量记录(即 MyID 介于 1 和 1000000 之间)。当删除运行时,其中两个表将非常热,但第三个表上的活动可以安全地暂停。在两个热表中,MyID是聚簇键。在第三个冷表中,我在 MyID 上有一个非聚集索引。

除了 DELETE 操作之外,热表中的其他活动将包括 INSERT,可能每秒几次。MyID 是一个 IDENTITY,新插入的记录不会在任何 DELETE 批次的范围内。

如果有助于了解潜在性能,则在由 MyID 聚集的表上对这些行的样本批次进行聚合的 SELECT 花费的时间不到 1 秒,而在非聚集的表上则花费大约 2 秒。我没有这个特定数据库的产品副本可供使用,所以我不能说删除需要多长时间,但是一旦我将其部署到 DEV,我就会有一个更好的想法。

旁注:为了解决日志大小问题,我将这些批次包装在事务中,并将 TLog 备份频率从 15 分钟提高到 5 分钟。我有 150GB 的可用日志空间。

问题

我在 MS 文档中读到:

默认情况下,DELETE 语句始终在其修改的表上获取排它 (X) 锁,并保持该锁直到事务完成。

我对使用锁定提示非常谨慎,但在这种情况下我可以安全地使用锁定提示来避免 TABLOCKX 吗?除了锁定提示之外还有其他方法可以避免 TABLOCKX 吗?

sql-server delete locking sql-server-2016

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

删除 postgres 表中的旧数据但保留已删除数据的副本的最佳实践

目前,我们的数据库服务器中有一个大约有 20 列(其中一列是 timestamptz 数据类型)的表,该表有 8.34 亿行。就大小而言,这是一个很大的表(大约 250GB(包括索引等)。

我想找到最有效和最好的方法来删除超过 2 年的旧数据,但如果我们需要它用于报告目的,也可以定期保留这些数据,该表也有 FK 约束。

处理这个问题的最佳方法是什么?我们希望能够在需要时查看这些数据。可能位于也可能不在同一服务器上。

最好首先运行选择数据的 COPY

COPY (SELECT * FROM TABLENAME WHERE CAST((timecreated_on AT TIME ZONE 'GMT') AS date) > DATE '2020-01-01 00:00:01') TO '/path/to/a/dump/file';
Run Code Online (Sandbox Code Playgroud)

那么删除表中的数据呢?

DELETE FROM TABLENAME where CAST((timecreated_on AT TIME ZONE 'GMT') AS date) > DATE '2020-01-01 00:00:01'
Run Code Online (Sandbox Code Playgroud)

我只是在寻找一种方法,这是一个自动化的过程,我可以通过 Linux 服务器上的 cronjob 安排每年之后删除超过 1 年的数据。

知道这可能不是最好的方法,但需要查看如何管理 FK 键约束,我是否会删除它们并重新应用,这可能会导致数据完整性问题?

任何帮助深表感谢。

postgresql delete archive

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

我已从 mysql 中删除数据库,但未释放存储空间

我已经从 amazon RDS 上的 mysql 中删除了多个数据库(架构),但没有释放存储空间,我还应该做些什么来释放存储空间?

我有一个总存储量为 15GB 的 mysql 数据库。添加多个数据库(从另一个 mysql 数据库复制)并删除它们后,可用的可用存储空间为 0。我不能简单地删除 RDS 实例,因为此实例上还有另一个我需要它的数据库。但我 100% 确定数据库没有使用 15GB 的存储空间。

我已经在其他线程上阅读过这个问题,但大多数解决方案都在谈论删除所有数据并关闭服务器,因为数据库一直在使用,我无法这样做。

mysql innodb delete storage amazon-rds

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

全表扫描 - 高水位

做全表扫描时,为什么Oracle会扫描高水位线以下的所有行?它不知道某些行已被删除并且不应扫描它们吗?

oracle delete

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

SQL Server:触发器 FOR DELETE

我想创建一个触发器,它并不如他的名字删除客户Peter。我怎样才能做到这一点?

CREATE TRIGGER trgCUSTOMER ON customer
FOR DELETE
AS
BEGIN
    IF (SELECT name FROM deleted) not like 'Peter'
    BEGIN
        delete from customer where name = (select name from deleted);
    END
END;
Run Code Online (Sandbox Code Playgroud)

trigger sql-server delete

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

如果在更新或删除之前存在?

  1. 在写更新语句之前,我应该检查它是否存在吗?

    有人告诉我这样做

    1. 所以它避免了无用的写入事务日志中已经存在的值,

    2. 并且只需要一个允许其他读取的共享锁而不是一个排他锁。
      他们说想象一个事务像这样针对不同的值多次运行,你会一直使用排他锁而不是共享锁。

    3. 同事提到,看锁兼容性图表,搜索时不能有两个更新锁,但可以有两个共享锁。因此,当“搜索要更新的行”没有要更新的值时,假更新锁可以阻止真正的更新。有人可以使此声明无效吗?

      if not exists 
      (
          select FavoriteColor 
          from dbo.Person 
          where Name = 'Bob' 
          and FavoriteColor = 'Green'
      )
      update dbo.Person
      set FavoriteColor = 'Green'
      where Name = 'Bob'
      
      Run Code Online (Sandbox Code Playgroud)
  2. 同样的问题,除了现在删除,我应该检查它是否存在吗?

    if exists 
    (
        select FavoriteColor 
        from dbo.Person 
        where Name = 'Bob' 
        and FavoriteColor = 'Green'
    )
    delete dbo.Person
    where Name = 'Bob' and FavoriteColor = 'Green'
    
    Run Code Online (Sandbox Code Playgroud)

我们使用 SQL Server 2016。

sql-server delete ddl update sql-server-2016

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