【发布时间】:2012-10-16 22:37:51
【问题描述】:
我有一个测试设置来将行写入数据库。 每个事务插入 10,000 行,没有更新。 每一步都比最后一步花费更长的线性时间。 前十个步骤花费了以下毫秒数来执行提交
568、772、942、1247、1717、1906、2268、2797、2922、3816、3945
到将 10,00 行添加到 500,000 行的表时,提交需要 37149 毫秒!
我没有外键约束。
我发现使用 WAL,提高了性能(给出了上图),但仍然是线性退化
PRAGMA Synchronous=OFF 无效
PRAGMAlocking_mode=EXCLUSIVE 无效
在没有附加索引和附加索引的情况下运行。产生了大致恒定的时间差,因此仍然是线性退化。
我还有一些其他设置
- setAutocommit(false)
- PRAGMA page_size = 4096
- PRAGMA journal_size_limit = 104857600
- PRAGMA count_changes = 关闭
- PRAGMA 缓存大小 = 10000
- Schema 具有 Id INTEGER PRIMARY KEY ASC,其插入是增量的,由 Sqlite 生成
完整架构如下(我已经运行了有索引和没有索引,但都包含了)
create table if not exists [EventLog] (
Id INTEGER PRIMARY KEY ASC,
DocumentId TEXT NOT NULL,
Event TEXT NOT NULL,
Content TEXT NOT NULL,
TransactionId TEXT NOT NULL,
Date INTEGER NOT NULL,
User TEXT NOT NULL)
create index if not exists DocumentId ON EventLog (DocumentId)
create index if not exists TransactionId ON EventLog (TransactionId)
create index if not exists Date ON EventLog (Date)
这是使用在windows环境下运行的sqlite-jdbc-3.7.2
【问题讨论】:
-
除了主键还有索引吗?
-
尝试了附加索引并且没有
-
请显示您的整个数据库架构(命令行工具中的
.schema)。 -
这是我的测试平台生成的架构,希望够用了,看看命令行工具
-
你重新索引了吗? (不过,这与 sqlite 是否相关?)
标签: performance sqlite