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

时间:2017-11-14 16:07:50

标签: oracle amazon-rds

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

import tensorflow as tf
import numpy as np



x1 = tf.Variable(tf.constant(0, shape=[2, 2]))


ret1 = tf.Variable(tf.constant(0, shape=[2, 2]))
ret2 = tf.Variable(tf.constant(0, shape=[2, 2]))

def condition1(i1,x1):
    return tf.less(i1, 2)
def condition2(i2,x2):
    return tf.less(i2, 2)

def body1(i1,x1):
    i2 = tf.constant(0)
    a= tf.constant(np.array([[1, 1], [1, 1]]), dtype=tf.int32)
    b = tf.constant(np.array([[1, 1], [1, 1]]), dtype=tf.int32)
    x1 = a + b
    i1=tf.add(i1,1)

    def body2(i2,x1):        
        a= tf.constant(np.array([[1, 1], [1, 1]]), dtype=tf.int32)
        x1=x1 + a
        return i2,x1

    index,ret2=tf.while_loop(condition2, body2, loop_vars=[i2,x1])


    return i1,x1


i1 = tf.constant(0)
index,ret1=tf.while_loop(condition1, body1,  loop_vars=[i1,x1])    
init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())



with tf.Session() as sess:
    sess.run(init_op)   
    print(sess.run(ret1))
    print(sess.run(ret2))
    sess.close()      

如果我将删除更改为截断,则它与开发中一样快。 所以这个改变我当然会部署。但我想了解为什么会发生这种情况。 AWS团队非常乐于助人,但他们对AWS有点偏颇,并且想告诉我每月3000美元的数据库服务器速度不够快(我不这么认为)。我不是那么流利的Oracle管理,但我已经明白,如果重做日志不断填写,这可能会导致问题。我已经大大增加了尺寸,但是再次,这并没有真正加起来。

2 个答案:

答案 0 :(得分:0)

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

另一方面,

truncate会跳过所有这些并简单地释放表中的数据。

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

答案 1 :(得分:0)

我建议您使用Oracle Global Temporary表。它们很快,在会话结束后不需要明确删除。

例如:

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

请参阅https://docs.oracle.com/cd/B28359_01/server.111/b28310/tables003.htm#ADMIN11633