ВНУТРЕННЯЯ РЕШЕНИЕ Оптимизация - PullRequest
2 голосов
/ 04 мая 2011

У меня есть две таблицы для объединения. TABLE_A (содержит столбцы «a») и TABLE_BC (содержит столбцы «b» и «c»). На TABLE_BC есть условие. Две таблицы объединены строкой 'rowid'.

Что-то вроде:

SELECT a, b, c FROM main.TABLE_A INNER JOIN main.TABLE_BC WHERE (b > 10.0 AND c < 10.0) ON main.TABLE_A.rowid = main.TABLE_BC.rowid ORDER BY a;

В качестве альтернативы:

SELECT a, b, c FROM main.TABLE_A AS s1 INNER JOIN (SELECT rowid, b, c FROM main.TABLE_BC WHERE (b > 10.0 AND c < 10.0)) AS s2 ON s1.rowid = s2.rowid ORDER BY a;

Мне нужно сделать это пару раз с другим TABLE_A, но TABLE_BC не изменится ... Поэтому я мог бы ускорить процесс, создав временную базу данных в памяти (mem) для постоянной части запроса.

CREATE TABLE mem.cache AS SELECT rowid, b, c FROM main.TABLE_BC WHERE (b > 10.0 AND c < 10.0);

с последующим (много)

SELECT a, b, c FROM main.TABLE_A INNER JOIN mem.cache ON main.TABLE_A.rowid = mem.cache.rowid ORDER BY a;

Я получаю один и тот же набор результатов из всех приведенных выше запросов, но последний вариант, безусловно, самый быстрый.

Проблема в том, что я хотел бы не разбивать запрос на две части. Я ожидал бы, что SQLite сделает для меня то же самое автоматически (по крайней мере, во втором сценарии), но, похоже, этого не происходит ... Почему это так?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

SQLite довольно легок в оптимизации.Общее правило: SmallTable Inner Join BigTable быстрее, чем наоборот.

При этом мне интересно, будет ли ваш первый запрос работать быстрее в следующей форме:

SELECT a, b, c 
FROM main.TABLE_A 
  INNER JOIN main.TABLE_BC ON main.TABLE_A.rowid = main.TABLE_BC.rowid 
WHERE (b > 10.0 AND c < 10.0) 
ORDER BY a;
1 голос
/ 04 мая 2011

Ответ из Списка рассылки пользователей SQLite :

Короче говоря, потому что SQLite не может читать ваши мысли. Чтобы понять ответ, сравните скорости выполнения одного запроса (с один TABLE_A) и создание базы данных в памяти, создание таблицы в это и использование этой таблицы в одном запросе (с тем же TABLE_A). держу пари первый вариант (простой запрос без базы данных в памяти) будет намного быстрее Поэтому SQLite выбирает самый быстрый способ выполнить запрос. Он не может предсказать, что будут понимать будущие запросы Как выполнить весь набор запросов быстрее. Вы можете сделать это и Вы должны разделить ваш запрос на две части. Павел
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...