c++ - SQLite3 sqlite3_step 函数的性能问题

标签 c++ sqlite

我在使用 sqlite3_step 函数时遇到特定查询的问题:

SELECT DISTINCT interfaces_int_id,device_dev_id FROM devInterface 
INNER JOIN interfaces ON devInterface.interfaces_int_id=interfaces.intf_id 
INNER JOIN nlink ON nlink.interfaces_intf_id=interfaces.intf_id 
INNER JOIN neighbor ON neighbor.neighbor_id=nlink.neighbor_neighbor_id 

我只发布了查询的相关部分。

为了查询数据库,我使用 this code .

调试时卡在

    while(true)
    {
--->    result = sqlite3_step(statement);

        if(result == SQLITE_ROW)
        {
            std::vector<std::string> values;
            ...
        }
        ...
    }

根据数据库的大小,有时需要几分钟才能得到结果。但是当使用Firefox插件“SQLite Manager”时,只需要1-2秒。

在查询需要几分钟的情况下,“neighbor”和“nlink”表有超过 150k 的条目。

为了构建数据库,我使用了 MySQL Workbench 工具的正向工程师功能,并修改了适用于 sqlite3 的语法:

CREATE TABLE IF NOT EXISTS device(dev_id INTEGER PRIMARY KEY AUTOINCREMENT, type INT, hwtype INT, dataSource INT, hostname TEXT, sw_version TEXT, stpBridgeID TEXT, stpProtocol TEXT);

CREATE TABLE IF NOT EXISTS interfaces(intf_id INTEGER PRIMARY KEY AUTOINCREMENT, intfName TEXT, intfType TEXT, phl INT, macAddress TEXT, ipAddress TEXT, subnetMask TEXT, duplex TEXT, speed TEXT, status TEXT, description TEXT, l2l3 TEXT, errLvl INT, loadLvl INT, channel_intf_id INT, vpc_id INT, CONSTRAINT fk_interfaces_interfaces1 FOREIGN KEY (channel_intf_id) REFERENCES interfaces (intf_id) ON DELETE CASCADE ON UPDATE CASCADE);

CREATE TABLE IF NOT EXISTS devInterface (interfaces_int_id INT, device_dev_id INT, cdp_cdp_id INT, PRIMARY KEY (interfaces_int_id, device_dev_id, cdp_cdp_id), CONSTRAINT fk_dev_interface_interfaces1 FOREIGN KEY (interfaces_int_id) REFERENCES interfaces (intf_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_dev_interface_device1 FOREIGN KEY (device_dev_id) REFERENCES device (dev_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_devInterface_cdp1 FOREIGN KEY (cdp_cdp_id) REFERENCES cdp (cdp_id) ON DELETE CASCADE ON UPDATE CASCADE);

CREATE TABLE IF NOT EXISTS neighbor (neighbor_id INTEGER PRIMARY KEY AUTOINCREMENT, l2_addr TEXT NULL , l3_addr TEXT NULL);

CREATE TABLE IF NOT EXISTS nlink (neighbor_neighbor_id INT, interfaces_intf_id INT, PRIMARY KEY (neighbor_neighbor_id, interfaces_intf_id), CONSTRAINT fk_table1_neighbor1  FOREIGN KEY (neighbor_neighbor_id ) REFERENCES neighbor (neighbor_id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_table1_interfaces1 FOREIGN KEY (interfaces_intf_id) REFERENCES interfaces (intf_id) ON DELETE CASCADE ON UPDATE CASCADE);  

编辑:SQLITE 版本:3.6.22

最佳答案

将SQLite升级到最新版本(3.7.6.2)后,性能提升很多。

关于c++ - SQLite3 sqlite3_step 函数的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5678551/

相关文章:

sql - ORDER BY 后跟一个数字

java - 尝试存储SQLite数据时,我的Android应用程序崩溃

python - 在链接到自定义 sqlite3 时使用 pyenv 构建 Python 3 版本

android - 如何在多列sqlite数据库上过滤多个数据

c++ - 使用用于传递参数的寄存器的预定顺序调用约定是否有特殊原因?

c++ - 变量会影响性能吗?

c++ - 在命令行上将 HRESULT 作为字符串传递

c++ - 从输入文件的最后一列确定例程

c++ - OCX 的调试和发布版本不兼容 "Variable uses an Automation type not supported in Visual Basic"

android - 如何使用 SQLiteDatabase.query 进行查询