当前位置: 首页 > news >正文

那些网站是asp做的/关键词语有哪些

那些网站是asp做的,关键词语有哪些,做国外网站独特密码,黄骅市疫情防控最新通告最近项目中使用到了Sqlite3来保存结果数据,大约100万条数据,插入到sqlite数据库中竟然耗时5分钟,这在真个数据处理流程中占用了太多的时间,是不可接受的,那么如何优化sqlite的写数据的性能呢? 优化方式 通…

最近项目中使用到了Sqlite3来保存结果数据,大约100万条数据,插入到sqlite数据库中竟然耗时5分钟,这在真个数据处理流程中占用了太多的时间,是不可接受的,那么如何优化sqlite的写数据的性能呢?

优化方式
通过查阅资料和其他大牛们的博客,确定有几个点可以尝试:

关闭写同步,PRAGMA synchronous = OFF,在 sqlite3 中 synchronous 有三种模式,分别是 FULL,NORMAL 和 OFF,在系统意外终止的时候,安全性逐级减弱,FULL模式下,保证数据不会损坏,安全性最高,写入速度也最慢。OFF 模式会比 FULL 模式快50倍以上。
使用事务,如果有许多数据需要插入数据库,逐条插入,导致频繁的提交以及磁盘IO,使用事务机制,可以批量插入数据,可以极大的提升写入速度。实际测试中的情况是,开启事务之后,写入速度也可以提升近50倍。
执行准备,执行准备相当于将sql语句提前编译,省去每次执行sql语句时候的语法检查等操作,可以极大的优化sql语句的执行效率,其原理有点像 LuaJit 将 Lua 语言成静态机器码,提高运行速度。实测情况中,使用执行准备可以提升40倍的写入速度。
内存模式,sqlite3 支持内存模式,将数据库直接创建到内存中,打开地址传入”:memory:”即可,内存模式相比正常模式,可以省区IO的时间,使用内存模式的加速思路是,先将数据库创建到内存中,数据写入完整之后,再调用 “VACUUM INTO ‘out.db3’;” 语句将其写入到磁盘,在开启了执行准备的情况下,这种方式会稍微快上一点点。
效率对比
使用上面提到的方法,测试下来速度对比如下所示:

优化方法    无优化    关闭写同步    开启事务    执行准备    内存模式
每秒插入    13条    1321条    5万条    213万条    215万条
测试代码
错误检查宏定义:

#define CHECKZERO(a) if((a)!=0) throw("error.");
无优化
sqlite3* db = nullptr;
CHECKZERO(sqlite3_open(path, &db));
CHECKZERO(sqlite3_exec(db, "CREATE TABLE Test(ID INTEGER,var0 INTEGER,var1 REAL,var2 TEXT);", 0, 0, 0));
const int maxcount = 100;
for (int i = 0; i < maxcount; i++) {
    CHECKZERO(sqlite3_exec(db, "INSERT INTO Test (ID,var0,var1,var2) VALUES (0,1,2.0,\\"hello sqlite3.\\");", 0, 0, 0));
}
CHECKZERO(sqlite3_close(db));
关闭写同步
sqlite3* db = nullptr;
CHECKZERO(sqlite3_open(path, &db));
CHECKZERO(sqlite3_exec(db, "PRAGMA synchronous = OFF", 0, 0, 0));
CHECKZERO(sqlite3_exec(db, "CREATE TABLE Test(ID INTEGER,var0 INTEGER,var1 REAL,var2 TEXT);", 0, 0, 0));
const int maxcount = 10000;
for (int i = 0; i < maxcount; i++) {
    CHECKZERO(sqlite3_exec(db, "INSERT INTO Test (ID,var0,var1,var2) VALUES (0,1,2.0,\\"hello sqlite3.\\");", 0, 0, 0));
}
CHECKZERO(sqlite3_close(db));
开启事务
sqlite3* db = nullptr;
CHECKZERO(sqlite3_open(path, &db));
CHECKZERO(sqlite3_exec(db, "PRAGMA synchronous = OFF", 0, 0, 0));
CHECKZERO(sqlite3_exec(db, "CREATE TABLE Test(ID INTEGER,var0 INTEGER,var1 REAL,var2 TEXT);", 0, 0, 0));
CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
const int maxcount = 1000000;
for (int i = 0; i < maxcount; i++) {
    CHECKZERO(sqlite3_exec(db, "INSERT INTO Test (ID,var0,var1,var2) VALUES (0,1,2.0,\\"hello sqlite3.\\");", 0, 0, 0));
    if (i % 10000 == 9999) {
        CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
        CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
    }
}
CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
CHECKZERO(sqlite3_close(db));
执行准备
sqlite3* db = nullptr;
CHECKZERO(sqlite3_open(path, &db));
CHECKZERO(sqlite3_exec(db, "PRAGMA synchronous = OFF", 0, 0, 0));
CHECKZERO(sqlite3_exec(db, "CREATE TABLE Test(ID INTEGER,var0 INTEGER,var1 REAL,var2 TEXT);", 0, 0, 0));
// 执行准备
sqlite3_stmt *pPrepare = nullptr;
auto sql = "INSERT INTO Test (ID,var0,var1,var2) VALUES (?,?,?,?);";
CHECKZERO(sqlite3_prepare_v2(db, sql, strlen(sql), &pPrepare, 0));
CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
const int maxcount = 10000000;
for (int i = 0; i < maxcount; i++) {
    CHECKZERO(sqlite3_reset(pPrepare));
    CHECKZERO(sqlite3_bind_int(pPrepare, 1, 0));
    CHECKZERO(sqlite3_bind_int(pPrepare, 2, 1));
    CHECKZERO(sqlite3_bind_double(pPrepare, 3, 2.0));
    const char* str = "hello sqlite3.";
    CHECKZERO(sqlite3_bind_text(pPrepare, 4, str, strlen(str), 0));
    int err = sqlite3_step(pPrepare);
    assert(SQLITE_DONE == err);
    if (i % 10000 == 9999) {
        CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
        CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
    }
}
CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
CHECKZERO(sqlite3_finalize(pPrepare)); // 释放
CHECKZERO(sqlite3_close(db));
内存模式
sqlite3* db = nullptr;
CHECKZERO(sqlite3_open(":memory:", &db));
CHECKZERO(sqlite3_exec(db, "PRAGMA synchronous = OFF", 0, 0, 0));
CHECKZERO(sqlite3_exec(db, "CREATE TABLE Test(ID INTEGER,var0 INTEGER,var1 REAL,var2 TEXT);", 0, 0, 0));
// 执行准备
sqlite3_stmt *pPrepare = nullptr;
auto sql = "INSERT INTO Test (ID,var0,var1,var2) VALUES (?,?,?,?);";
CHECKZERO(sqlite3_prepare_v2(db, sql, strlen(sql), &pPrepare, 0));
CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
const int maxcount = 10000000;
for (int i = 0; i < maxcount; i++) {
    CHECKZERO(sqlite3_reset(pPrepare));
    CHECKZERO(sqlite3_bind_int(pPrepare, 1, 0));
    CHECKZERO(sqlite3_bind_int(pPrepare, 2, 1));
    CHECKZERO(sqlite3_bind_double(pPrepare, 3, 2.0));
    const char* str = "hello sqlite3.";
    CHECKZERO(sqlite3_bind_text(pPrepare, 4, str, strlen(str), 0));
    int err = sqlite3_step(pPrepare);
    assert(SQLITE_DONE == err);
    if (i % 10000 == 9999) {
        CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
        CHECKZERO(sqlite3_exec(db, "BEGIN", 0, 0, 0));
    }
}
CHECKZERO(sqlite3_exec(db, "COMMIT", 0, 0, 0));
CHECKZERO(sqlite3_finalize(pPrepare)); // 释放
// 导出
CHECKZERO(sqlite3_exec(db, "VACUUM INTO 'out.db3';", 0, 0, 0));
CHECKZERO(sqlite3_close(db));
总结
sqlite3作为如此强大轻量级的数据库引擎,插入速度必然不会很慢,如果自己使用过程中发现效率问题,那一定是自己没有找到合适的用法,在最终的测试结果中,sqlite3的写入速度达到惊人的200万条每秒。

完整的测试工程代码在此处下载:sqlite3性能优化源代码数据插入开启事务执行准备性能提升每秒百万条数据写入-其它文档类资源-CSDN文库
————————————————
版权声明:本文为CSDN博主「Ango_Cango」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Ango_/article/details/122074816

http://www.jmfq.cn/news/5057263.html

相关文章:

  • 网站开发按工时收费/网络营销策划方案论文
  • 老年人做网站/推荐6个免费国外自媒体平台
  • 高端品牌网站开发/广告联盟哪个比较好
  • 在美国建网站需要自己做服务器吗/厦门seo关键词优化代运营
  • 哪个网站做ic好/百度后台管理
  • 企业为什么做网站系统/山东服务好的seo
  • 青岛外贸建设网站制作/网站维护推广的方案
  • wordpress推广注册/东莞网站seo技术
  • 公会网站建设/朋友圈推广文案
  • 如何做网站迁移/app推广方式
  • 制作app的费用/windows优化大师是自带的吗
  • 海尔网站建设策划书/大批量刷关键词排名软件
  • 手机网站封装小程序/营销型网站建设服务
  • 企业网站建设立项书/seo服务哪家好
  • 牧童蝉网站建设/处理器优化软件
  • 兼职网站平台有哪些/百度推广做二级域名
  • 雅茂道网站建设/网络营销课程
  • 开发客户的70个渠道/优化大师兑换码
  • 便宜的做网站/哈尔滨seo优化公司
  • 智慧团建手机版登录注册入口/seo技术 快速网站排名
  • 网站改造设计方案/全国唯一一个没有疫情的城市
  • 外贸b2b网站大全排名/百度快照推广排名
  • 网站系统优点/外贸独立站怎么建站
  • 做网站订金是多少钱/关键词百度指数查询
  • 网站后台登录界面/网站代搭建维护
  • 免费网站建站排行榜/上海网络推广服务
  • 网站建设教程赚找湖南岚鸿认 可/百度网址安全检测
  • 时时彩网站建设开发/营销培训班
  • 宁波网站建设制作公司排名/什么是整合营销并举例说明
  • 建筑设计专业是干什么的/seo薪酬如何