我有一个非常复杂的查询,我们使用临时表(这是在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管理,但我已经明白,如果重做日志不断填写,这可能会导致问题。我已经大大增加了尺寸,但是再次,这并没有真正加起来。
答案 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