Qt之Sqlite3 Insert优化

  最近在项目遇到一个问题,就是插入大量数据时启动程序会特别卡,一开始我使用线程缓解了一点,但是仍然会卡很久,今天在复习Sqlite相关内容时,突然发现了一个与我很相似的情况。究其主要原因还是执行INSERT语句时还有很大问题。在Sqlite官网关于INSERT的方式中INSERT过程中最后如果使用VALUES那条路会比select-stmt和DEFAULT -VALUES多走很多路,可能这样就导致了INSERT性能差异吧,实际测下来确实挺大的,当然也主要是old fraction那块太多的INSERT了,精简后只有5条INSERT语句,最终的结果就是old fraction执行会超过10S,而精简后只需要不到1S。

以下几个是相关的链接:

https://www.jianshu.com/p/faa5e852b76b

https://stackoverflow.com/questions/1609637/is-it-possible-to-insert-multiple-rows-at-a-time-in-an-sqlite-database/1734067

https://www.sqlite.org/lang_insert.html

/**
*    old fraction
*/
bool SqlInit::InitSql()
{
    QSqlQuery query(DBThreadConn);
    bool bSuccessLogCountTable = query.exec("create table LogCountTable (id INTEGER PRIMARY KEY, Type varchar(10), ucIndex varchar(10), LogCount varchar(10))");
    if(bSuccessLogCountTable)
    {
        uint8_t ucTemp = 1U;
        for (uint8_t i = ucTemp; i < ucTemp + COMMON::EBC_NUMBER; i++)
        {
            QString strtemp = "EB";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i) + "','" + QString::number(0) + "')";
            query.exec(str);
        }

        ucTemp += COMMON::EBC_NUMBER;

        for (uint8_t i = ucTemp; i < ucTemp + COMMON::EBC_NUMBER; i++)
        {
            QString strtemp = "FSB";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i - COMMON::EBC_NUMBER) + "','" + QString::number(0) + "')";
            query.exec(str);
        }
        ucTemp += COMMON::EBC_NUMBER;
        for (uint8_t i = ucTemp; i < ucTemp + COMMON::WC_MAX_NUM; i++)
        {
            QString strtemp = "Warning";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i - COMMON::EBC_NUMBER - COMMON::EBC_NUMBER) + "','" + QString::number(0) + "')";
            query.exec(str);
        }
        ucTemp += COMMON::WC_MAX_NUM;

        for (uint8_t i = ucTemp; i < ucTemp + COMMON::CC_FAULT_MAX; i++)
        {
            QString strtemp = "CC";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i - COMMON::EBC_NUMBER - COMMON::EBC_NUMBER - COMMON::WC_MAX_NUM - 1) + "','" + QString::number(0) + "')";
            query.exec(str);
        }

        ucTemp += COMMON::CC_FAULT_MAX;

        for (uint8_t i = ucTemp; i < ucTemp + COMMON::ATO_FAULT_MAX; i++)
        {
            QString strtemp = "CC(ATO)";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i - COMMON::EBC_NUMBER - COMMON::EBC_NUMBER - COMMON::WC_MAX_NUM - COMMON::CC_FAULT_MAX - 1) + "','" + QString::number(0) + "')";
            query.exec(str);
        }

        ///创建触发器,使得自动更新LogCountTable表中的LogCount值
        QSqlQuery TriggerLogCountquery(DBThreadConn);
        bool bSuccessTriggerLogCount = TriggerLogCountquery.exec("CREATE TRIGGER trigger_updateLogcount AFTER INSERT ON LogTable FOR EACH ROW WHEN new.id > 0 BEGIN update LogCountTable set LogCount = (select count(*) from LogTable where LogTable.ucIndex = new.ucIndex and LogTable.Type = new.Type) where LogCountTable.ucIndex = new.ucIndex and LogCountTable.Type = new.Type; END");
        if(bSuccessTriggerLogCount == false)
        {
            return ret = false;
        }
        ret = true;
    }
    else
    {
        TOD_LOG(TOD_LOG_WARNING, QString("[TOD] %1(TOD Datetime)[%2,LineNo:%3]:Create Database failed.") \
            .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")).arg(__FUNCTION__).arg(__LINE__));
        ret = false;
    }
    return ret;
}
/**
*    new fraction
*/
bool SqlInit::InitSql()
{
    QSqlQuery query(DBThreadConn);
    bool bSuccessLogCountTable = query.exec("create table LogCountTable (id INTEGER PRIMARY KEY, Type varchar(10), ucIndex varchar(10), LogCount varchar(10))");
    if(bSuccessLogCountTable)
    {
        uint8_t ucTemp = 1U;
		
        QString strtempEb = "EB";
        QString strunionEb;
        QString strEb = "INSERT INTO LogCountTable SELECT '" + QString::number(ucTemp) + "'AS 'id','"  + strtempEb +"'AS 'Type','" + QString::number(ucTemp) + "'AS 'ucIndex', '" + QString::number(0) + "'AS 'LogCount'";
        for (uint8_t i = ucTemp + 1; i < ucTemp + COMMON::EBC_NUMBER; i++)
        {
            strunionEb = "UNION ALL SELECT '" + QString::number(i) + "','" + strtempEb + "','" + QString::number(i) + "','" + QString::number(0) + "' ";
            strEb = strEb +strunionEb;
        }
        query.exec(strEb);
        ucTemp += COMMON::EBC_NUMBER;

        QString strtempFsb = "FSB";
        QString strunionfsb;
        QString strfsb = "INSERT INTO LogCountTable SELECT'"+ QString::number(ucTemp) + "'AS 'id','"  + strtempFsb +" 'AS 'Type','" + QString::number(ucTemp) + "'AS 'ucIndex', '" + QString::number(0) + "'AS 'LogCount'";
        for (uint8_t i = ucTemp + 1; i < ucTemp + COMMON::EBC_NUMBER; i++)
        {
            strunionfsb = "UNION ALL SELECT '"+ QString::number(i) + "','"  + strtempFsb + "','" + QString::number(i) + "','" + QString::number(0)+ "' ";
            strfsb = strfsb +strunionfsb;
        }
        query.exec(strfsb);
        ucTemp += COMMON::EBC_NUMBER;
        for (uint8_t i = ucTemp; i < ucTemp + COMMON::WC_MAX_NUM; i++)
        {
            QString strtemp = "Warning";
            QString str = "insert into LogCountTable(Type, ucIndex, LogCount) values('" + strtemp + "','" + QString::number(i - COMMON::EBC_NUMBER - COMMON::EBC_NUMBER) + "','" + QString::number(0) + "')";
            query.exec(str);
        }
        QString strtempWarning = "Warning";
        QString strunionwarning;
        QString strwarning = "INSERT INTO LogCountTable SELECT'" + QString::number(ucTemp) + "'AS 'id','" + strtempWarning +" 'AS 'Type','" + QString::number(ucTemp) + "'AS 'ucIndex' ,'" + QString::number(0) + "'AS 'LogCount'";
        for (uint8_t i = ucTemp + 1; i < ucTemp + COMMON::WC_MAX_NUM; i++)
        {
            strunionwarning = "UNION ALL SELECT '"+ QString::number(i) + "','"  + strtempWarning + "','" + QString::number(i) + "','" + QString::number(0)+ "' ";
            strwarning = strwarning +strunionwarning;
        }
        query.exec(strwarning);
        ucTemp += COMMON::WC_MAX_NUM;

        QString strtempCc = "CC";
        QString strunioncc;
        QString strcc = "INSERT INTO LogCountTable SELECT'" + QString::number(ucTemp) + "'AS 'id','"+ strtempCc +" 'AS 'Type','" + QString::number(ucTemp) + "'AS 'ucIndex', '" + QString::number(0) + "'AS 'LogCount'";
        for (uint8_t i = ucTemp + 1; i < ucTemp + COMMON::CC_FAULT_MAX; i++)
        {
            strunioncc = "UNION ALL SELECT '"+ QString::number(i) + "','" + strtempCc + "','" + QString::number(i) + "','" + QString::number(0) + "' ";
            strcc = strcc +strunioncc;
        }
        query.exec(strcc);
        ucTemp += COMMON::CC_FAULT_MAX;

        QString strtempCcAto = "CC(ATO)";
        QString strunionccato;
        QString strccato = "INSERT INTO LogCountTable SELECT'"+ QString::number(ucTemp) + "'AS 'id','" + strtempCcAto +" 'AS 'Type','" + QString::number(ucTemp) + "'AS 'ucIndex' ,'" + QString::number(0) + "'AS 'LogCount'";
        for (uint8_t i = ucTemp + 1; i < ucTemp + COMMON::CC_FAULT_MAX; i++)
        {
            strunionccato = "UNION ALL SELECT '" + QString::number(i) + "','" + strtempCcAto + "','" + QString::number(i) + "','" + QString::number(0) + "' ";
            strccato = strccato +strunionccato;
        }
        query.exec(strccato);
        ///创建触发器,使得自动更新LogCountTable表中的LogCount值
        QSqlQuery TriggerLogCountquery(DBThreadConn);
        bool bSuccessTriggerLogCount = TriggerLogCountquery.exec("CREATE TRIGGER trigger_updateLogcount AFTER INSERT ON LogTable FOR EACH ROW WHEN new.id > 0 BEGIN update LogCountTable set LogCount = (select count(*) from LogTable where LogTable.ucIndex = new.ucIndex and LogTable.Type = new.Type) where LogCountTable.ucIndex = new.ucIndex and LogCountTable.Type = new.Type; END");
        if(bSuccessTriggerLogCount == false)
        {
            return ret = false;
        }
        ret = true;
    }
    else
    {
        ret = false;
    }
    return ret;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,可用于开发图形界面和嵌入式应用程序。CMake是一个跨平台的构建工具,用于管理项目的构建过程。SQLite是一个轻量级的关系型数据库管理系统。 使用Qt和CMake来构建一个包含SQLite的应用程序,需要先安装Qt5和CMake,并确保CMake的版本高于2.8.11。然后,进入项目的构建目录,并执行以下步骤: 1. 在终端中使用cd命令进入项目的构建目录。 2. 使用cmake命令生成构建文件。可以使用以下命令: ``` cmake ../ ``` 3. 使用make命令进行编译。可以使用以下命令: ``` make ``` 4. 最后,运行构建生成的可执行文件。可以使用以下命令: ``` ./stock_manager ``` 如果在运行应用程序时遇到"QSqlDatabase: QSQLITE driver not loaded"等SQLite相关的错误,可能是因为应用程序无法加载SQLite的驱动程序。此时,需要将D:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins目录下的文件复制到cmake-build-debug目录下。这样,应用程序就能够正确加载SQLite驱动程序,并正常使用SQLite模块了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [stockmanager:[WIP]管理商店库存的程序](https://download.csdn.net/download/weixin_42129970/16159198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt使用CMake在Clion中运行显示出的UI界面看起来很老,很过时怎么办?CMake下的Qt怎么使用SQLite?](https://blog.csdn.net/qq_35485875/article/details/128427868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值