我知道sqlite对于非常大的数据库文件表现不佳,即使它们受支持(曾经在sqlite网站上发表评论,说明如果你需要的文件大小超过1GB,你可能要考虑使用企业rdbms.再找不到它,可能与旧版本的sqlite有关.
但是,出于我的目的,我想在考虑其他解决方案之前了解它到底有多糟糕.
我说的是数千兆字节的sqlite数据文件,从2GB开始.有人对此有经验吗?任何提示/想法?
或者我应该使用不同的锤子来解决这个问题.
我有一个非常简单的用例来存储数据,实际上是一个稀疏矩阵,我试图将其存储在SQLite数据库中.我创建了一个表:
create TABLE data ( id1 INTEGER KEY, timet INTEGER KEY, value REAL )
Run Code Online (Sandbox Code Playgroud)
我插入了大量数据(每10分钟800个元素,每天45次),一年中大部分时间.(id1,timet)的元组将始终是唯一的.
时间值是自纪元以来的秒数,并且将始终增加.出于所有实际目的,id1是随机整数.虽然可能只有20000个独特的ID.
然后我想访问id1 == someid的所有值或访问timet == sometime的所有元素.在我通过Linux上的C接口使用最新SQLite的测试中,查找其中一个(或此查找的任何变体)大约需要30秒,这对我的用例来说还不够快.
我尝试为数据库定义一个索引,但这减慢了插入到完全不可行的速度(虽然我可能做错了...)
上表导致对任何数据的访问速度非常慢.我的问题是:
请原谅我对SQL的基本理解!
谢谢
我包含一个代码示例,显示使用索引时插入速度如何减慢到爬行速度.使用'create index'语句,代码需要19分钟才能完成.没有它,它会在18秒内运行.
#include <iostream>
#include <sqlite3.h>
void checkdbres( int res, int expected, const std::string msg )
{
if (res != expected) { std::cerr << msg << std::endl; exit(1); }
}
int main(int argc, char **argv)
{
const size_t nRecords = 800*45*30;
sqlite3 *dbhandle = NULL;
sqlite3_stmt *pStmt = NULL;
char statement[512]; …Run Code Online (Sandbox Code Playgroud) 给一个简单的sqlite3 table(create table data (key PRIMARY KEY,value)),密钥大小为256字节,值大小为4096字节,这个sqlite3表中最大行数的限制(忽略磁盘空间限制)是多少?他们的限制是否与操作系统相关(win32,linux或Mac)
我想在Android中使用SQLite数据库.我有几个问题:
在您将此问题标记为重复之前,请听我说!
我已经阅读过这里提出的关于如何提高性能的问题,例如,提一下提高SQLite的每秒INSERT性能?和什么是源码的非常大的数据库文件的性能特点?
我正在努力使sqlite工作的数据库文件大小为5千兆字节.相反,那里有人,即使数据库大小高达160 GB,他们声称sqlite对他们来说"很棒".我自己没有尝试过,但是从提出的问题来看,我想所有的基准测试都可能只用数据库中的表来完成.
我使用的数据库
- 20页左右的表
-表中有一半以上的15列
-每个15或那么列的表都有6/7的外键列-其中的几个表已经长大在一个月内拥有2700万条记录
我使用的开发机器是3 GHz四核机器,有4 GB RAM,但只需要3分钟就可以查询这些大表中的row_count.
我找不到任何方法来水平划分数据.我拥有的最佳镜头是将数据分成多个数据库文件,每个表一个.但在这种情况下,据我所知,外键列约束不能使用,所以我将不得不创建一个自足表(没有任何外键).
所以我的问题是
a)我是否使用错误的数据库进行工作?
b)你觉得我哪里出错了?
c)我还没有在外键上添加索引,但如果只是行计数查询需要四分钟,外键索引如何帮助我?
编辑提供更多信息,即使没有人要求它:)我使用SQLite版本3.7.9与system.data.sqlite.dll版本1.0.77.0
EDIT2:我认为我与160位演员的不同之处在于他们可以选择单独的唱片或小范围的唱片.但是我必须在表中加载所有2700万行,将它们与另一个表连接起来,按照用户的要求对记录进行分组并返回结果.有什么输入是为这些结果优化数据库的最佳方法.
我不能缓存先前查询的结果,因为它在我的情况下没有意义.点击缓存的可能性相当低.