【发布时间】:2014-01-04 00:40:19
【问题描述】:
我正在寻求有关如何批量更新包含多达 250,000 条记录的 Oralce SQL 表的帮助。
基本上,我有一个键列表,这些键被传递给需要更新 Oracle 表的函数。该列表最多可以包含 250,000 行,我可以使用普通的更新语句或使用“executemany”来执行此操作,但两种方法都效率太低,所以我需要进行批量更新,但我不熟悉如何执行此操作。我已经搜索了几个小时,但我无法弄清楚!
todays_date = datetime.now().strftime("%d-%b-%Y")
status = str("DONE")
try:
bind_values = {"status" : str(status),
"todays_date" : todays_date,
"keys_list" : list_of_keys}
query = ("""FORALL i IN :keys_list.FIRST .. :keys_list.LAST
UPDATE TABLE_NAME
SET COLUMN1 = :status,
UPDATE_DATE = :todays_date
WHERE KEY = :i""")
cursor.execute(query, bind_values)
conn.commit()
self.CloseConnection(conn)
except cx_Oracle.DatabaseError, e:
error, = e.args
print(" >> Database error: %s" % format(e))
conn.rollback()
return False
任何帮助将不胜感激。
更新 @abarnert - 非常感谢你的建议,你肯定在这里做一些事情,我设法做到了这一点
cursor.execute("""CREATE GLOBAL TEMPORARY TABLE TodaysKeys
(key STRING PRIMARY KEY)
on commit delete rows
AS (INSERT INTO TodaysKeys VALUES (:i))
UPDATE TABLE_NAME
SET COLUMN1 = :status,
UPDATE_DATE = :todays_date
WHERE KEY IN (SELECT * FROM TodaysKeys)
TABLE TodaysKeys""", i=keys_list,
status=str(updatestatus),
todays_date=todays_date)
但现在我得到的只是一个错误:“ORA-01036:非法变量名称/编号”。我确信这是非常明显的事情,但我已经检查了一遍又一遍,但我一生都看不到我哪里出错了!
从对这种方法的所有研究来看,这似乎是正确的方法……如果我可以让它工作测试! 请帮忙。
【问题讨论】:
-
“效率太低”是什么意思?你的意思是上传时间太长了?您如何知道解决方案何时足够高效?
-
如果跨 250K 行的单个
UPDATE语句太慢,则几乎可以肯定问题出在您的数据模型或数据库配置中,而 Python 无法加快速度。 -
如果表有 250K 行并且您尝试一次更新每一行,可能将其转储到文件、更改文件并@ 987654324@(或者可能使用单独的散装装载机)......但我对此表示怀疑。
-
“效率太低” - 是的,它需要太多时间,它会超时。例如更新 75,000 行,大约需要 3 个小时,这太疯狂了!这是对每条记录进行更新!不知道还能怎么做。