Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从临时表中删除需要100%的CPU时间_Oracle_Amazon Rds - Fatal编程技术网

Oracle 从临时表中删除需要100%的CPU时间

Oracle 从临时表中删除需要100%的CPU时间,oracle,amazon-rds,Oracle,Amazon Rds,我有一个非常复杂的查询,我们使用一个临时表(这是在运行AWS RDS服务的Oracle中) 如果我将delete更改为truncate,它的速度与开发中的速度一样快。 因此,我当然会部署这个更改。但我想了解为什么会发生这种情况。AWS团队非常有帮助,但他们对AWS有点偏见,他们喜欢告诉我,我每月3000美元的数据库服务器不够快(我不这么认为)。我对Oracle管理不是很熟练,但我知道如果重做日志不断被填充,这可能会导致问题。我已经大幅增加了大小,但再次强调,这并不是真正的增加。删除大量数据时,这

我有一个非常复杂的查询,我们使用一个临时表(这是在运行AWS RDS服务的Oracle中)

如果我将delete更改为truncate,它的速度与开发中的速度一样快。
因此,我当然会部署这个更改。但我想了解为什么会发生这种情况。AWS团队非常有帮助,但他们对AWS有点偏见,他们喜欢告诉我,我每月3000美元的数据库服务器不够快(我不这么认为)。我对Oracle管理不是很熟练,但我知道如果重做日志不断被填充,这可能会导致问题。我已经大幅增加了大小,但再次强调,这并不是真正的增加。

删除大量数据时,这是一个相当标准的问题。
delete
操作必须单独修改每一行。每一行都会被删除,添加到事务日志中,并获得一个LSN

另一方面,
truncate
,跳过所有这些,只需释放表中的数据


您会发现这种行为在各种RDMS解决方案中是一致的。Oracle、MSSQL、PostgreSQL和MySQL都会有相同的问题。

我建议您使用Oracle全局临时表。它们速度很快,在会话结束后不需要显式删除

例如:

CREATE GLOBAL TEMPORARY TABLE TMP_T     
  (
    ID NUMBER(32)       
  )
ON COMMIT DELETE ROWS;

请参见

谢谢,是的,但仍然需要100%的CPU 10分钟来删除一些数据(基本上是25000个数字,所以没有斑点或其他东西)?如果是数百万条记录,我可以接受。@JJohansson:行的内容多少是无关紧要的。这是RDMS的标准问题。这里没有更多的信息可以回答更多的问题。好的,谢谢。。。因此,接下来只需要找出为什么生产服务器不能处理它,而开发环境没有问题。我假设这归结为事务日志的大小。我可以看到每小时大约有12个事务日志开关,不确定这是否正常,因为即使没有人在使用数据库,它也有这个计数。@JJohansson:如果我不得不猜测,我会说这可能与服务器负载、备份设置或复制有关。啊,复制。。这实际上与DEV.有所不同。。生产一号标记为“多az”,这意味着数据被同步复制到另一个位置。。谢谢你的想法,正如你所说,插入临时表只需很少的时间,何必费心呢。只需使用在实际查询的联接中驱动插入的查询。然后您可以完全忘记删除。请注意,
delete
truncate
是非常不同的操作
delete
是事务性的(可以回滚),并且可以(通常应该)使用
where
子句
truncate
是DDL(即,它在运行之前和之后导致隐式提交),需要一个完整的表锁,无法回滚,并删除表中的所有数据。感谢您,是的,这是一个全局临时表,由于某些逻辑,它是在提交后使用保留而不是DEL创建的。。。值得思考的是改变这种逻辑以避免隐含删除。。
CREATE GLOBAL TEMPORARY TABLE TMP_T     
  (
    ID NUMBER(32)       
  )
ON COMMIT DELETE ROWS;