Как ускорить запрос с несколькими ВНУТРЕННИМИ СОЕДИНЕНИЯМИ - PullRequest
6 голосов
/ 13 октября 2009

Я возился с переключением с файлов 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 уходит одинаковое количество времени.

Итак, мои вопросы следующие:

  1. SQLite просто не оптимизирован для обработки нескольких операторов INNER JOIN?
  2. Я сделал что-то явно глупое в своем запросе (потому что я новичок в SQLite), что делает его таким медленным?

И , прежде чем кто-либо предложит совершенно другую технологию, нет, я не могу переключиться . Мой выбор - MS-Access или SQLite. :)

UPDATE: Присвоение INDEX каждому из столбцов в базе данных SQLite сократило время запроса с более чем 8 минут до примерно 6 секунд. Спасибо Ларри Люстигу за объяснение необходимости ИНДЕКСАЦИИ.

Ответы [ 3 ]

11 голосов
/ 30 октября 2009

В соответствии с просьбой я публикую свой предыдущий комментарий как фактический ответ (когда я впервые опубликовал комментарий, по какой-то причине я не смог опубликовать его как ответ):

MS Access очень агрессивно относится к индексации столбцов от вашего имени, тогда как SQLite потребует от вас явного создания необходимых вам индексов. Таким образом, вполне возможно, что Access проиндексировал для вас [Description] или [D], но эти индексы отсутствуют в SQLite. У меня нет опыта работы с таким количеством JOIN в SQLite. Я использовал его в одном проекте Django с относительно небольшим объемом данных и не обнаружил никаких проблем с производительностью.

6 голосов
/ 13 октября 2009

У вас есть проблемы с ссылочной целостностью? Я спрашиваю, потому что создается впечатление, что у вас есть ненужные объединения, поэтому я переписал ваш запрос как:

SELECT DISTINCT 
       t.[oCode] AS OptionCode, 
       t.[descShort] AS OptionDescription 
  FROM DESCRIPTIONS t
  JOIN tbl_D_H h ON h.[D] = t.[oCode]
                AND h.[oType] = 'STANDARD'
  JOIN tbl_D_J j ON j.[D] = t.[oCode]
                AND j.[oType] = 'STANDARD'
  JOIN tbl_Y_D d ON d.[D] = t.[oCode]
                AND d.[Y] = '41'
                AND d.[oType] ='STANDARD'
 WHERE t.[oMod] = 'D'
0 голосов
/ 05 февраля 2014

Если DESCRIPTIONS и tbl_D_E имеют многократное сканирование строк, то oCode и D должны быть проиндексированы. Посмотрите на приведенный здесь пример, чтобы узнать, как индексировать и определить количество сканирований строк (http://www.siteconsortium.com/h/p1.php?id=mysql002).

Это может исправить это, хотя ..

CREATE INDEX ocode_index ON ОПИСАНИЕ (oCode) ИСПОЛЬЗОВАНИЕ BTREE; CREATE INDEX d_index ON tbl_D_E (D) ИСПОЛЬЗУЯ BTREE;

и т.д ....

Правильная индексация - это одна часть головоломки, которая может легко удвоить, утроить или увеличить скорость запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...