Я возился с переключением с файлов ms-access на файлы SQLite для своих простых потребностей в базе данных; по обычным причинам: меньший размер файла, меньше накладных расходов, открытый исходный код и т. д.
Одна вещь, которая мешает мне сделать это, - это то, что кажется недостаточным в SQLite. Для простых запросов SELECT SQLite работает так же хорошо или лучше, чем MS-Access. Проблема возникает с довольно сложным запросом SELECT с несколькими операторами INNER JOIN:
SELECT DISTINCT
DESCRIPTIONS.[oCode] AS OptionCode,
DESCRIPTIONS.[descShort] AS OptionDescription
FROM DESCRIPTIONS
INNER JOIN tbl_D_E ON DESCRIPTIONS.[oCode] = tbl_D_E.[D]
INNER JOIN tbl_D_F ON DESCRIPTIONS.[oCode] = tbl_D_F.[D]
INNER JOIN tbl_D_H ON DESCRIPTIONS.[oCode] = tbl_D_H.[D]
INNER JOIN tbl_D_J ON DESCRIPTIONS.[oCode] = tbl_D_J.[D]
INNER JOIN tbl_D_T ON DESCRIPTIONS.[oCode] = tbl_D_T.[D]
INNER JOIN tbl_Y_D ON DESCRIPTIONS.[oCode] = tbl_Y_D.[D]
WHERE ((tbl_D_E.[E] LIKE '%')
AND (tbl_D_H.[oType] ='STANDARD')
AND (tbl_D_J.[oType] ='STANDARD')
AND (tbl_Y_D.[Y] = '41')
AND (tbl_Y_D.[oType] ='STANDARD')
AND (DESCRIPTIONS.[oMod]='D'))
В MS-Access этот запрос выполняется примерно за 2,5 секунды. В SQLite это занимает чуть более 8 минут . На выполнение запроса из кода VB или из командной строки с использованием sqlite3.exe уходит одинаковое количество времени.
Итак, мои вопросы следующие:
- SQLite просто не оптимизирован для обработки нескольких операторов INNER JOIN?
- Я сделал что-то явно глупое в своем запросе (потому что я новичок в SQLite), что делает его таким медленным?
И , прежде чем кто-либо предложит совершенно другую технологию, нет, я не могу переключиться . Мой выбор - MS-Access или SQLite. :)
UPDATE:
Присвоение INDEX каждому из столбцов в базе данных SQLite сократило время запроса с более чем 8 минут до примерно 6 секунд. Спасибо Ларри Люстигу за объяснение необходимости ИНДЕКСАЦИИ.