1

我有大约 100,000 到 1,000,000 行要插入到 Oracle18c 数据库中。我对 Oracle 和这个数量级的数据很陌生。我认为必须有一些最佳方法来做到这一点,但现在我只设法实现了逐行插入:

def insertLines(connection, tableName, column_names, rows):
    cursor = connection.cursor()
    if tableExists(connection, tableName):
        for row in rows:
            sql = 'INSERT INTO {} ({}) VALUES ({})'.format(tableName, column_names, row)
            cursor.execute(sql)
    cursor.close()

Oracle 中是否有一些明确的方法可以使用 cx_Oracle(python Oracle 库)批量处理行以达到更高的效率?

编辑:我从 CSV 文件中读取数据。

4

3 回答 3

2

我不知道您的数据格式是什么,但SQL Data Loader是一个命令行实用程序,专门用于向 Oracle 添加大量数据。

于 2019-03-21T00:29:12.833 回答
1

如果您的数据已经在 Python 中,请使用executemany(). 在您有这么多行的情况下,您可能仍会执行多次调用以插入批量记录。请参阅https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle

更新:请参阅新的 cx_Oracle 文档Batch Statement Execution and Bulk Loading

data = [
    (60, "Parent 60"),
    (70, "Parent 70"),
    (80, "Parent 80"),
    (90, "Parent 90"),
    (100, "Parent 100")
]
 
cursor.executemany("""
        insert into ParentTable (ParentId, Description)
        values (:1, :2)""", data)

正如其他人指出的那样

  • 避免在语句中使用字符串插值,因为它存在安全风险。这通常也是一个可扩展性问题。使用绑定变量。如果您需要对列名之类的内容使用字符串插值,请确保您对任何值都进行了处理。
  • 如果数据已经在磁盘上,那么使用 SQL*Loader 或 Data Pump 之类的东西会比将其读入 cx_Oracle 然后将其发送到 DB 更好。
于 2019-03-21T01:10:36.540 回答
1

就性能和易用性而言,最优化的方法是在 CSV 文件上创建一个外部表,然后使用 SQL 进行插入。

于 2019-03-21T23:13:06.963 回答