|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
Добрый день, к сожалению я не профи в по работе с бд, заранее извиняюсь если вопрос тривиальный. работаю с sqlite встроенной в adobe air Столкнулся с очень низкой производительностью запроса на базе конструкции LEFT OUTER JOIN. Интерес вызван тем, что в документации рекомендуется использовать именно JOIN и избегать подзапросов и IN Возможно я не правильно готовлю LEFT OUTER JOIN. Иходные таблицы: 1) Groups - (в запросе не участвует привидена для общей картины) , 2000 строк 2) Devices - (устройства) , 30000 строк Код: plaintext 1. 2. 3. 4. 5. 6. 7.
3) DeviceDetails - таблица связей. Один device может входить в несколько групп. 80000 строк Код: plaintext 1. 2. 3. 4. 5. 6.
Задача получить девайсы (Device) по заданной группе. Конструкция с JOIN на рутовой группе отрабатывает 38 секунд (результат 14000 элементов): Код: plaintext 1. 2. 3.
Код: plaintext 1. 2.
добавление индексов, ощутимого прироста производитьльности не даёт. Код: plaintext 1. 2. 3. 4. 5.
Буду благодарен если поможете прояснить ситуацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 10:17 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
Сначала попробуй Код: plaintext 1.
Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 11:30 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
agakhovЗадача получить девайсы (Device) по заданной группе. Здесь действительно нужен inner а не outer join. Можно сделать как уже показал Bard, а можно перевернуть порядок таблиц и сделать вот так: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 17:26 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
Спасибо Bard, White Owl смысл комадны ANALYZE, я не осознал. Возможно её нужно запускать из командной строки. По крайней мере все GUI инструменты по работе с sqlite, молча её выполнили, оставив меня в неведении о происходящем. Данный запрос у меня работает 1656 ms, что гораздо лучше чем OUTER JOIN и сравнимо с подзапросом(953ms) Код: plaintext 1. 2. 3. 4.
Вариант OUTER JOIN и без Where отрабатывает быстрее(653ms) чем конструкция с подзапросом(953ms), за что отдельная благодарность White Owl Код: plaintext 1. 2. 3.
p/s Вернулась вера в документацию, буду изучать матчасть по работе с конструкцией JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2009, 19:02 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
agakhovсмысл комадны ANALYZE, я не осознал. Возможно её нужно запускать из командной строки. По крайней мере все GUI инструменты по работе с sqlite, молча её выполнили, оставив меня в неведении о происходящем.sb-news.netКоманда ANALYZE собирает статистику о индексах и их хранении в специальных таблицах базы данных, когда оптимизатор запросов может использовать их для выбора лучших индексов.На больших объемах при использовании индексов весьма полезная команда. Обычно выполняется после вставки/изменении большого объёма данных. См. ANALYZE White OwlПодобный запрос обычно более эффективен чем фильтрующий после соединения таблиц.Век живи... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2009, 13:18 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
White Owl Код: plaintext 1. 2.
Спасибо! Действительно, джойны без where быстрее... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2009, 17:18 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
Смотрите Код: plaintext
Эта команда покажет, какие таблицы и индексы используются. Еще была в сети презенташка от DRH, кажется, 2004-го года, где было подробно расписано, как работает планировщик в эскулайт - он полностью детерминирован, так что вы можете заранее оценить план выполнения запроса. Также бывает полезно при выборках пользоваться конструкцией indexed by, чтобы планировщик использовал именно указанный вами индекс (если это невозможно, будет сгенерирована ошибка). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2009, 23:52 |
|
SQLite: Как правильно готовить LEFT OUTER JOIN ?
|
|||
---|---|---|---|
#18+
White Owl, объясните, что означает a.groupId = :groupId в вашем примере? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2013, 08:48 |
|
|
start [/forum/topic.php?fid=54&msg=38465950&tid=2008854]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 266ms |
total: | 405ms |
0 / 0 |