【问题标题】:Using "BEGIN TRANSACTION" and "END TRANSACTION" to improve the performance使用“BEGIN TRANSACTION”和“END TRANSACTION”来提高性能
【发布时间】:2018-09-27 09:33:24
【问题描述】:

我正在阅读Improve INSERT-per-second performance of SQLite? 的帖子以提高我的 SQLite 的性能。

一个问题是:如果我需要执行以下查询:

INSERT INTO
INSERT INTO
...
INSERT INTO(more than 10000 times)

SELECT ...
SELECT 

UPDATE ...

如果我想提高性能,是否应该在所有代码的开头和结尾插入“BEGIN TRANSATION”和“END TRANSATION”,如下所示:

BEGIN TRANSACTION

INSERT INTO
INSERT INTO
...
INSERT INTO(more than 10000 times)

SELECT ...
SELECT 

UPDATE ...
UPDATE ...

END TRANSACTION

或者我应该只为插入操作插入 BEGIN/END TRANSACTION 吗?

BEGIN TRANSACTION

INSERT INTO
INSERT INTO
...
INSERT INTO(more than 10000 times)

END TRANSACTION

SELECT ...
SELECT 

UPDATE ...
UPDATE ...

【问题讨论】:

  • 您当然可以运行类似于该帖子的测试 - 您也可以将更新包装在它自己的开始/结束以及插入中
  • @Andrew 我建议使用一个事务而不是两个事务,每个事务一个。

标签: sql sqlite


【解决方案1】:

如果 INSERT 是针对同一张表,插入了相同的列,则使用一次插入将显着提高性能,这是因为每个单独的插入命令都包括从数据库来回执行的时间,比实际查询时间长得多。

基于服务器的限制(登录的其他进程等),我会设置插入行数的限制,例如一次 1000 行。

INSERT INTO table (col1, col2, col3,...) VALUES
{(v1, v2, v3,...), }X 1000;

快很多
{
INSERT INTO table (col1, col2, col3,...) VALUES
(v1, v2, v3,...);
}
X 1000

希望对你有帮助

【讨论】:

  • 谢谢。但这会产生很长的 SQL 语句吗? SQLite 对 SQL 语句的长度有限制吗?同样使用“INSERT INTO table (col1, col2, col3,...) VALUES (v1, v2, v3,...);”,我可以使用 sqlite3_prepare_v2 准备 SQL 语句并将参数绑定到此后的语句.但是使用 INSERT INTO 表 (col1, col2, col3,...) VALUES {(v1, v2, v3,...), }X 1000;看来prepared statement的优势已经不存在了。
  • 首先,字符串限制是相当长的,即使1000太长,500也可以。第二,您询问了性能......一次插入更多行可以提高性能。你的代码舒适度是另一回事......
猜你喜欢
  • 2010-09-15
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多