对 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) 我有两个表,每个表包含 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) 我正在尝试为具有复合键的表创建删除语句。
我想创建类似的东西:
DELETE
FROM
table_example1
WHERE
COLUMN1, COLUMN2
IN
(SELECT COLUMN1, COLUMN2 FROM table_example2
WHERE
COLUMN_DATETIME > @Period);
Run Code Online (Sandbox Code Playgroud)
在脑海中只有的组合保持COLUMN1和COLUMN2是独一无二的,在自己的每一列不是唯一的。
我似乎无法理解我将如何实际执行此操作。
我一直试图删除我的 MySQL 数据库上的一些信息。
我从来没有用过这么大的数据库,当我开发这个应用程序时,我没想到它会变得这么大(对你们来说可能很小,但对我来说它很大)。
我的想法是:
moid)的表(图 1)periodid)(图 1)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:
图 …
我有这张桌子,打算有很多活动。其中的任何内容都表明用户操作仍在等待中。一旦删除,它将表明该操作不再处于待处理状态。系统的其他区域依赖于此,因此表格本身并不能真正解释这种情况。但是,我的问题是我是否应该保持表原样并删除,当挂起的操作完成时,或者我是否应该添加一个标志列并更新。
请注意,记录可能会在插入的同一秒内被删除。我希望每秒最多支持 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) 我想知道是否可以覆盖 MySQLDELETE命令的功能来更新所选行上的字段而不是完全删除它。
这使得可以设置一个标志,例如deletedfrom 0/ nullto 1,而不使用UPDATE。
是否可以这样做,如果可以,如何做?
我可以使用带有 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 个表。我想从整个数据库中删除特定名称及其对应的列。该名称分布在整个数据库中,因此我想一次性删除它,而不是转到每个表并单独删除它。
我有一个看似简单的删除:
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并且我有一些以前的记录指向它,但是它们已经被删除了。
我试图:
VACUUM我最近遇到了一个我不知道的删除语法。
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)
我对我写的命令有些困惑:
在 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) delete ×10
sql-server ×5
mysql ×3
postgresql ×2
t-sql ×2
foreign-key ×1
performance ×1
slow-query ×1
trigger ×1
truncate ×1
update ×1