【问题标题】:Wrapping INSERT by BEGIN TRANSACTION and COMMIT通过 BEGIN TRANSACTION 和 COMMIT 包装 INSERT
【发布时间】:2018-04-06 23:50:07
【问题描述】:

我有一些课堂上的代码。这是关于从另一个数据库创建一个数据库。有一个 INSERT 方法。这需要很长时间。我阅读了常见问题解答,我知道我需要将 BEGIN TRANSACTION 和 COMMIT 放在多个 INSERT 周围,但我发誓,我尝试了 c.execute(''BEGIN TRANSACTION") 和 c.execute("COMMIT") 的每个地方- 总是相同的 ca 5 kb/s。请告诉我这些指令的正确位置,或者告诉我还有什么问题。

记录在案 - 我正在使用 5400 RPM 硬盘驱动器。

这里是原始代码:

import sqlite3

conn = sqlite3.connect('/path/to/database.db')
c = conn.cursor()

with open('sqlite-sakila-schema.sql', 'r', encoding='utf-8') as create_file:
    create_query = create_file.read()
with open('sqlite-sakila-insert-data.sql', 'r', encoding='utf-8') as insert_file:
    insert_query = insert_file.read()

c.executescript(create_query)
c.executescript(insert_query)

conn.commit()
conn.close()

编辑: 第一个文件: https://raw.githubusercontent.com/jOOQ/jOOQ/master/jOOQ-examples/Sakila/sqlite-sakila-db/sqlite-sakila-schema.sql

第二个: https://raw.githubusercontent.com/jOOQ/jOOQ/master/jOOQ-examples/Sakila/sqlite-sakila-db/sqlite-sakila-insert-data.sql

这都是关于 INSERT 的。有几个表,整个 sql 文件从这些表中删除开始,然后是 231K 行 INSERTS 代码,如下所示。

Insert into language
 (language_id,name,last_update)
Values
('1','English','2006-02-15 05:02:19.000')
;
Insert into language
 (language_id,name,last_update)
Values
('2','Italian','2006-02-15 05:02:19.000')
;
Insert into language
 (language_id,name,last_update)
Values
('3','Japanese','2006-02-15 05:02:19.000')
;
Insert into language
 (language_id,name,last_update)
Values
('4','Mandarin','2006-02-15 05:02:19.000')
;

【问题讨论】:

  • 事务不会使查询更快。
  • @Barmar 我认为他怀疑他启用了自动提交,在这种情况下会有所作为。但是,如果他不使用自动提交,当然,只是改变提交的位置不会有帮助......
  • 您能否发布一个小样本的sqlite-sakila-insert-data.sql 文件,以捕捉它的要点?
  • @abarnert 是不是因为提交执行了fsync(),所以当使用自动提交时,所有INSERTs 都没有流水线?
  • @zwer 听起来这只是INSERT 语句的序列。

标签: python sqlite


【解决方案1】:

尝试将您的 INSERT 查询合并为一个查询:

INSERT into language (language_id,name,last_update) VALUES
('1','English','2006-02-15 05:02:19.000'),
('2','Italian','2006-02-15 05:02:19.000'),
('3','Japanese','2006-02-15 05:02:19.000'),
('4','Mandarin','2006-02-15 05:02:19.000'),
...
;

SQLite 对单个查询的大小有限制,即SQLITE_MAX_SQL_LENGTH 的值,默认为 1,000,000 字节。因此,您需要增加此限制或将此查询拆分为适合限制的组。以 1,000 行为一组进行操作可能会产生明显的不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多