У меня проблемы с конкретным запросом при использовании функции 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
Я разместил только те части запроса, которые имеют отношение к делу.
Для запросов к базе данных я использую этот код .
При отладке он висит на
while(true)
{
---> result = sqlite3_step(statement);
if(result == SQLITE_ROW)
{
std::vector<std::string> values;
...
}
...
}
В зависимости от размера базы данных,иногда требуется несколько минут, чтобы получить результат.Но при использовании плагина Firefox «SQLite Manager» это занимает всего 1-2 секунды.
В тех случаях, когда запрос занимает несколько минут, таблицы «соседей» и «ссылок» содержат более 150 тыс. Записей.
Для создания базы данных я использовал функцию инженера-форварда инструмента 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