标签: delete

MySQL DELETE 因大量行而变得异常缓慢

对 Prices 表中的大量行执行 DELETE 时,DELETE 会逐渐变慢。如果删除 15,000 行,它会在大约 15 秒内运行。20K 行需要 3 或 4 分钟。40,000 行需要 15 分钟,100,000 行运行一个多小时。

下面的 After DELETE 触发器使用可用价格类型的计数更新 Items 表。这用于计算价格以加快生产过程。

两个表都是InnoDB,我把innodb_buffer_pool_size更新为4G,没有效果。

我已经验证所有 SQL 语句都使用索引。Prices 表上有一个PriceType + ItemID 索引,ItemID 是Items 表的主键。

不幸的是,这个架构是由另一个应用程序确定的,我无法修改表结构。我可以修改触发器、索引等。无法更改该应用程序以直接更新 Items 表中的计数。

BEGIN

    DECLARE iPriceTypeA INT;
    DECLARE iPriceTypeB INT;
    DECLARE iPriceTypeC INT;

    SET iPriceTypeA = (SELECT COUNT(*) FROM Prices WHERE PriceType='A' AND ItemID=OLD.ItemID),
        iPriceTypeB = (SELECT COUNT(*) FROM Prices WHERE PriceType='B' AND ItemID=OLD.ItemID),
        iPriceTypeC = (SELECT COUNT(*) FROM Prices WHERE PriceType='C' AND ItemID=OLD.ItemID);

    UPDATE …
Run Code Online (Sandbox Code Playgroud)

mysql trigger performance delete query-performance

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

删除 SQL Server 14.0 上的数百万条记录

我有两个表,每个表包含 2 亿条记录。我必须根据列中的整数值从它们中删除大约 7000 万条记录。

我使用以下脚本以 4000 块为单位删除它们:

DECLARE @BATCHSIZE INT, @ITERATION INT, @TOTALROWS INT, @MSG VARCHAR(500)
DECLARE @STARTTIME DATETIME, @ENDTIME DATETIME

SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @ITERATION = 0 
SET @TOTALROWS = 0 

WHILE @BATCHSIZE>0
BEGIN   
    SET @STARTTIME = GETDATE();

    BEGIN TRANSACTION
    DELETE TOP(@BATCHSIZE)
    FROM [mydb].[dbo].tableA 
    WHERE [mydb].[dbo].tableA.Code not IN (
            SELECT Code
            FROM [mydb].[dbo].TableB)

    SET @BATCHSIZE=@@ROWCOUNT
    SET @ITERATION=@ITERATION+1
    SET @TOTALROWS=@TOTALROWS+@BATCHSIZE
    COMMIT TRANSACTION;

    SET @ENDTIME = GETDATE();

    SET @MSG = 'Iteration: ' + …
Run Code Online (Sandbox Code Playgroud)

sql-server delete sql-server-2017

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

使用复合键删除

我正在尝试为具有复合键的表创建删除语句。

我想创建类似的东西:

DELETE 
FROM 
    table_example1
WHERE
    COLUMN1, COLUMN2
    IN
    (SELECT COLUMN1, COLUMN2 FROM table_example2
    WHERE
        COLUMN_DATETIME > @Period);
Run Code Online (Sandbox Code Playgroud)

在脑海中只有的组合保持COLUMN1COLUMN2是独一无二的,在自己的每一列不是唯一的。

我似乎无法理解我将如何实际执行此操作。

sql-server delete t-sql

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

删除数据的问题

我一直试图删除我的 MySQL 数据库上的一些信息。

我从来没有用过这么大的数据库,当我开发这个应用程序时,我没想到它会变得这么大(对你们来说可能很小,但对我来说它很大)。

我的想法是:

  • 我有一张带有“mos”托管对象(PK moid)的表(图 1)
  • 我有一张带有“句号”的表格(PK periodid)(图 1)
  • 我有一个将“Period”与 MO(PK moperiodid, FKs periodid, moid)连接起来的表(图 1)
  • 我有 200 个使用moperiodidas FK 的表(表的数量根据用户输入而变化)(图 2)

  • 然后,当我想清理“历史数据”时,我只需从 MO 或 PERIOD 中删除级联。

我就是这么想的,但在我的现实世界中,情况并不好。

对于 Selects 和 Inserts 一切正常,但是我第一次想开始清理数据时,主要想法是只保留最后 X 天(也根据用户输入进行配置)。

我每天有 3094555 个新的 moperiods,即使只删除一个也不起作用:

0   13  22:46:19    delete from parser_customer_period_mo where id = 1  Error Code: 1205. Lock wait timeout exceeded; try restarting transaction    51.169 sec
Run Code Online (Sandbox Code Playgroud)

每次尝试后,InnoDB 每秒写入/读取数会疯狂 1 小时。(图 3)

我不知道如何删除旧信息,这是一个小系统,我正在构建30个系统中的第二个,第二个将有12倍的数据量。

图 1:

解析器周期

图 2:

200 表模式

图 …

mysql foreign-key delete

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

硬删除与软删除性能

我有这张桌子,打算有很多活动。其中的任何内容都表明用户操作仍在等待中。一旦删除,它将表明该操作不再处于待处理状态。系统的其他区域依赖于此,因此表格本身并不能真正解释这种情况。但是,我的问题是我是否应该保持表原样并删除,当挂起的操作完成时,或者我是否应该添加一个标志列并更新。

请注意,记录可能会在插入的同一秒内被删除。我希望每秒最多支持 100 个,但不希望将其作为限制。

我使用的是 SQL Server 2014 企业版。

这是表的定义(所有索引都基于使用此表的选择查询):

CREATE TABLE [dbo].[OpenRounds](
    [OpenRoundId] [bigint] IDENTITY(1,1) NOT NULL,
    [UserId] [int] NOT NULL,
    [GameActivityId] [bigint] NOT NULL,
    [VendorId] [int] NOT NULL,
    [Date] [datetime] NOT NULL,
    [UserBonusId] [bigint] NULL,
    [VendorRoundId] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_GamesOpenRounds] PRIMARY KEY CLUSTERED 
(
    [OpenRoundId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [IX_GameOpenRoundsUserIdUserBonusId] ON [dbo].[OpenRounds]
(
    [UserId] ASC, …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server delete sql-server-2014

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

如何覆盖 MySQL DELETE 命令来更新字段而不是删除行?

我想知道是否可以覆盖 MySQLDELETE命令的功能来更新所选行上的字段而不是完全删除它。

这使得可以设置一个标志,例如deletedfrom 0/ nullto 1,而不使用UPDATE

是否可以这样做,如果可以,如何做?

mysql delete update

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

用 where 子句截断

我可以使用带有 where 子句的 truncate 命令吗?我需要从几个表中删除特定的行。

如何从整个数据库中删除特定数据?

SELECT DimEmployee.[FirstName], DimEmployee.[LastName], [SalesOrderNumber], [ShipDateKey]
    FROM DimEmployee
    JOIN [FactResellerSales] 
        ON DimEmployee.[EmployeeKey] = [FactResellerSales].[ProductKey] 
    WHERE DimEmployee.[FirstName] like 'kevin%' <--have to truncate this specific name from entire DB
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以从整个数据库中删除特定数据?

在我的数据库中有 172 个表。我想从整个数据库中删除特定名称及其对应的列。该名称分布在整个数据库中,因此我想一次性删除它,而不是转到每个表并单独删除它。

sql-server delete sql-server-2008-r2 truncate

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

PostgreSQL 9.5.2 DELETE 永远占用

我有一个看似简单的删除:

DELETE FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

在具有 ~20k 行(w ~10k 受影响行)的表上,但它已经运行了 2000+ 秒。

SELECT * FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

需要几毫秒。

我还有其他一些带有FOREIGN KEYs 的表,id并且我有一些以前的记录指向它,但是它们已经被删除了。

我试图:

postgresql delete

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

Sql Server 删除语法

我最近遇到了一个我不知道的删除语法。

delete #fooTbl from #fooTbl where attr ='some'
Run Code Online (Sandbox Code Playgroud)

微软官方文档指出:

DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
[ WHERE <search_condition> ]   
[ OPTION ( <query_options> [ ,...n ]  ) ]
[; ]  
Run Code Online (Sandbox Code Playgroud)

我对我写的命令有些困惑:

  • delete 关键字之前的参数是什么以及需要什么(在我的示例中与表名一致)?
  • 最佳做法是什么?

sql-server delete t-sql

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

为什么 PostgreSQL 数据库表上的“DELETE”操作异常缓慢?

在 PostgreSQL 数据库表上执行“DELETE”操作时,我遇到了严重的性能问题。删除 15488 条记录的执行时间为 79423.768 毫秒,与“INSERT”或“SELECT”等其他操作相比非常慢。对于为什么会发生这种情况以及优化删除操作的可能方法,我将不胜感激。

背景:我使用 PostgreSQL 引擎版本 12.14 作为应用程序的后端,并且我注意到从一个表中删除记录需要花费出乎意料的长时间。涉及的表定义了索引和约束,数据库大小相对较小,预计会增长到几 GB。然而,对于这个特定的表,这个问题似乎更加明显,而其他表则表现良好。

硬件是 AWS db.t2.micro 实例,具有 1 个 CPU 核心、1 (GiB) 内存和 20 (GiB) 通用 SSD 用于存储。

column_name_loading表架构,我们尝试从中删除的表。

列名称 数据类型 描述
ID 文本 首要的关键
散列 文本 首要的关键
日期_从 时间戳 首要的关键
日期到 时间戳
测量位置uuid 通用唯一标识符 主键、外键
列名 文本 不为空
统计类型id 文本
被忽略 布尔值
笔记 文本
更新时间 时间戳
更新者 通用唯一标识符

可以看到,上表有一个复合主键,涉及4列。有两个表具有对该column_name_loading表的外键引用

第一桌

ALTER  TABLE
logger_main_config_column_name_loading 
ADD
CONSTRAINT column_name_loading_fkey FOREIGN KEY (
column_name_loading_measurement_location_uuid,
column_name_loading_id,
column_name_loading_hash,
column_name_loading_date_from
) REFERENCES …
Run Code Online (Sandbox Code Playgroud)

postgresql delete postgresql-performance slow-query

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