标签: sqlite

提高SQLite的每秒INSERT性能?

优化SQLite很棘手.C应用程序的批量插入性能可以从每秒85次插入到每秒超过96,000次插入!

背景:我们使用SQLite作为桌面应用程序的一部分.我们有大量的配置数据存储在XML文件中,这些数据被解析并加载到SQLite数据库中,以便在初始化应用程序时进行进一步处理.SQLite非常适合这种情况,因为它速度快,不需要专门配置,数据库作为单个文件存储在磁盘上.

理由: 最初我对我所看到的表现感到失望.事实证明,SQLite的性能可能会有很大差异(对于批量插入和选择),具体取决于数据库的配置方式以及如何使用API​​.弄清楚所有选项和技术是什么并不是一件小事,所以我认为创建这个社区wiki条目以与Stack Overflow读者分享结果是谨慎的,以便为其他人节省相同调查的麻烦.

实验:我不是简单地谈论一般意义上的性能提示(即"使用事务!"),而是认为最好编写一些C代码并实际测量各种选项的影响.我们将从一些简单的数据开始:

  • 多伦多市完整交通时间表的28 MB TAB分隔文本文件(约865,000条记录)
  • 我的测试机器是运行Windows XP的3.60 GHz P4.
  • 该代码使用Visual C++ 2005 编译为"Release",带有"Full Optimization"(/ Ox)和Favor Fast Code(/ Ot).
  • 我正在使用SQLite"Amalgamation",直接编译到我的测试应用程序中.我碰巧遇到的SQLite版本有点旧(3.6.7),但我怀疑这些结果与最新版本相当(如果你不这么想请发表评论).

我们来写一些代码吧!

代码:一个简单的C程序,它逐行读取文本文件,将字符串拆分为值,然后将数据插入SQLite数据库.在代码的这个"基线"版本中,创建了数据库,但我们实际上不会插入数据:

/*************************************************************
    Baseline code to experiment with SQLite performance.

    Input data is a 28 MB TAB-delimited text file of the
    complete Toronto Transit System schedule/route info
    from http://www.toronto.ca/open/datasets/ttc-routes/

**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "sqlite3.h"

#define INPUTDATA "C:\\TTC_schedule_scheduleitem_10-27-2009.txt"
#define DATABASE "c:\\TTC_schedule_scheduleitem_10-27-2009.sqlite"
#define …
Run Code Online (Sandbox Code Playgroud)

c sqlite optimization performance

2880
推荐指数
9
解决办法
38万
查看次数

选择每个GROUP BY组中的第一行?

正如标题所示,我想选择用a组成的每组行的第一行GROUP BY.

具体来说,如果我有一个purchases看起来像这样的表:

SELECT * FROM purchases;
Run Code Online (Sandbox Code Playgroud)

我的输出:

id | customer | total
---+----------+------
 1 | Joe      | 5
 2 | Sally    | 3
 3 | Joe      | 2
 4 | Sally    | 1

我想查询每个产品id的最大购买量(total)customer.像这样的东西:

SELECT FIRST(id), customer, FIRST(total)
FROM  purchases
GROUP BY customer
ORDER BY total DESC;
Run Code Online (Sandbox Code Playgroud)

预期产出:

FIRST(id) | customer | FIRST(total)
----------+----------+-------------
        1 | Joe      | 5
        2 | Sally    | 3

sql sqlite postgresql group-by greatest-n-per-group

1205
推荐指数
16
解决办法
95万
查看次数

如何列出使用ATTACH打开的SQLite数据库文件中的表?

什么SQL可用于列出表,以及SQLite数据库文件中这些表中的行 - 一旦我ATTACH在SQLite 3命令行工具上附加了命令?

sql database sqlite metadata

1151
推荐指数
17
解决办法
96万
查看次数

如何在SQLite中检查表是否存在?

我如何可靠地检查SQLite,是否存在特定的用户表?

我不是要求不可靠的方法,比如检查表上的"select*"是否返回错误(这是一个好主意吗?).

原因是这样的:

在我的程序中,我需要创建并填充一些表,如果它们不存在的话.

如果它们已经存在,我需要更新一些表.

我是否应该采取其他路径来表示已经创建了相关表格 - 例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志或其他东西?

或者我的方法有意义吗?

sqlite

856
推荐指数
15
解决办法
43万
查看次数

Android上SQLite的最佳做法是什么?

在Android应用程序中对SQLite数据库执行查询时,最佳做法是什么?

从AsyncTask的doInBackground运行插入,删除和选择查询是否安全?或者我应该使用UI线程?我认为数据库查询可能"很重",不应该使用UI线程,因为它可以锁定应用程序 - 导致应用程序无响应(ANR).

如果我有几个AsyncTasks,他们应该共享一个连接还是应该分别打开一个连接?

这些方案是否有最佳实践?

database sqlite android

681
推荐指数
8
解决办法
22万
查看次数

多列上的Sqlite主键

在SQLITE中在多于1列上指定主键的语法是什么?

sqlite ddl primary-key composite-primary-key

590
推荐指数
7
解决办法
25万
查看次数

是否可以在SQLite数据库中一次插入多行?

在MySQL中,您可以插入多行,如下所示:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试做这样的事情时,我收到了一个错误.是否可以在SQLite数据库中一次插入多行?这样做的语法是什么?

sql sqlite syntax

527
推荐指数
17
解决办法
36万
查看次数

在.NET 4.0项目中引用.NET 2.0混合模式程序集需要什么"附加配置"?

我有一个项目,其中我想使用一些.NET 4.0功能,但核心要求是我可以使用针对2.X编译的System.Data.SQLite框架.我看到提到这是可能的,例如这里接受的答案,但我不知道如何实际实现这一点.

当我在参考2.X程序集时尝试运行我的4.0项目时,我得到:

混合模式程序集是针对运行时的版本"v2.0.50727"构建的,如果没有其他配置信息,则无法在4.0运行时加载.

什么"附加配置"是必要的?

.net c# sqlite .net-4.0 system.data.sqlite

517
推荐指数
8
解决办法
18万
查看次数

SQLite - UPSERT*不*INSERT或REPLACE

http://en.wikipedia.org/wiki/Upsert

在SQL Server上插入更新存储过程

在SQLite中有没有一些我没想到的聪明方法?

基本上,如果记录存在,我想更新四列中的三列,如果它不存在,我想用第四列的默认(NUL)值插入记录.

ID是主键,因此UPSERT只会有一条记录.

(我试图避免SELECT的开销,以确定我是否需要更新或插入显然)

建议?


我无法在SQLite网站上确认SQL CREATE的语法.我还没有构建一个演示来测试它,但它似乎不支持..

如果是,我有三列,所以它实际上看起来像:

CREATE TABLE table1( 
    id INTEGER PRIMARY KEY ON CONFLICT REPLACE, 
    Blob1 BLOB ON CONFLICT REPLACE, 
    Blob2 BLOB ON CONFLICT REPLACE, 
    Blob3 BLOB 
);
Run Code Online (Sandbox Code Playgroud)

但是前两个blob不会引起冲突,只有ID会因此我asusme Blob1和Blob2不会被替换(根据需要)


绑定数据时SQLite中的UPDATE是一个完整的事务,这意味着每个要更新的发送行都需要:Prepare/Bind/Step/Finalize语句,与允许使用重置函数的INSERT不同

语句对象的生命周期如下:

  1. 使用sqlite3_prepare_v2()创建对象
  2. 使用sqlite3_bind_接口将值绑定到主机参数.
  3. 通过调用sqlite3_step()运行SQL
  4. 使用sqlite3_reset()重置语句,然后返回步骤2并重复.
  5. 使用sqlite3_finalize()销毁语句对象.

更新我猜测与INSERT相比速度慢,但它与使用主键的SELECT相比如何呢?

也许我应该使用select来读取第4列(Blob3),然后使用REPLACE编写一条新记录,将原始的第4列与前3列的新数据混合在一起?

sql sqlite upsert

505
推荐指数
11
解决办法
28万
查看次数

是否有一个等同于MySQL的DESCRIBE [table]的SQLite?

我刚刚开始学习SQLite.能够看到像MySQL这样的表的详细信息会很高兴DESCRIBE [table].PRAGMA table_info [table]不够好,因为它只有基本信息(例如,它不显示列是否是某种类型的字段).SQLite有办法做到这一点吗?

mysql sqlite

425
推荐指数
6
解决办法
21万
查看次数