Я работал с переходом из файлов доступа MS в файлы SQLite для моих простых потребностей в базе данных; по обычным причинам: меньший размер файла, меньше накладных расходов, с открытым исходным кодом и т. д.Как ускорить запрос с несколькими INNER JOINs
Одна вещь, которая мешает мне сделать коммутатор, - это то, что кажется недостатком скорости в SQLite. Для простых запросов SELECT SQLite, похоже, работает так же хорошо, как и MS-Access. Проблема возникает с довольно сложной запрос на выборку с несколькими операторами внутреннего соединения:
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. :)
ОБНОВЛЕНИЕ: Назначение индекса для каждого из столбцов в базе данных SQLite уменьшается время запроса из более чем 8 минут до около 6 секунд. Благодаря Larry Lustig для объяснения причин необходимости применения INDEXing.
Вы используете ИНДЕКСЫ? –
@Phill Pafford: Я не использую индексы на MS-Access или SQLite-данных. Я пытаюсь сравнить доступ к sqlite, поэтому я оставил структуру данных одинаковой в обоих. – Stewbob
Невозможно отправить ответ, поэтому попробуйте комментарий: MS Access очень агрессивно относится к индексированию столбцов от вашего имени, тогда как SQLite потребует от вас явно создавать нужные вам индексы. Таким образом, возможно, что Access проиндексировал либо [Description], либо [D] для вас, но эти индексы отсутствуют в SQLite. У меня нет опыта с этим количеством активности JOIN в SQLite. Я использовал его в одном проекте Django с относительно небольшим объемом данных и не обнаружил никаких проблем с производительностью. –