Каков самый быстрый способ выполнить более 64 объединений таблиц в SQlite?

Я планирую генерировать запросы для SQLite, которые будут включать в себя множество соединений с 12 таблицами, что превысит ограничение на объединение 64 таблиц в SQLite. (~ 250 соединений таблиц или, возможно, больше). В конечном итоге это будет работать на Android. Цель этого состоит в том, чтобы иметь X пользовательских полей в наборе результатов в зависимости от создаваемого отчета.

К сожалению, я не администратор баз данных и не знаю оптимального способа добиться этого.

Пока думаю варианты такие:

  • Используйте 2 временные таблицы, чтобы манипулировать набором результатов, объединяя максимально возможное количество. (Мое предыдущее решение в SQLServer, довольно медленное)
  • Создайте наборы результатов из нескольких столбцов и ключа для объединения и сохраните их в n временных таблицах. (где n меньше 64) Затем соедините все временные таблицы по их общему ключу.
  • Создайте одну временную таблицу и заполняйте ее одной вставкой или обновлением за раз.
  • Не делайте большого объединения, вместо этого выполняйте много выборок и заполняйте какой-то контейнер данных.

Есть ли что-то еще, что я должен рассмотреть?


person Biff MaGriff    schedule 05.05.2011    source источник
comment
Ничего себе, вам действительно нужно так много таблиц? Сколько столбцов у каждого? В этом случае я бы сказал, что ни один метод не будет быстрым на телефоне, если возможно, выполните все соединения на сервере и просто отправьте окончательный результат в виде файла XML или JSON.   -  person Joseph Earl    schedule 05.05.2011
comment
Таблицы, к которым я присоединяюсь, тонкие, 2-3 столбца, но я присоединяюсь к одним и тем же много-много раз. У меня, скорее всего, будет возможность выполнять обработку через веб-службу, однако я хотел бы, чтобы у пользователя была возможность сделать это локально без подключения к данным.   -  person Biff MaGriff    schedule 05.05.2011
comment
@Biff MaGriff: Есть ли еще один вариант, который я могу упустить? -- Я скромно предполагаю, что SQLite, возможно, не является правильным механизмом хранения данных для того, чем вы занимаетесь.   -  person CommonsWare    schedule 05.05.2011
comment
Другой подход может заключаться в денормализации вашей базы данных. Иногда вы можете свернуть несколько таблиц в одну таблицу с NULL столбцами, не увеличивая количество строк.   -  person Ted Hopp    schedule 05.05.2011
comment
Если вы отступите от запроса... можно ли где-нибудь воспроизвести тот же набор результатов, используя множество предложений WHERE вместо множества операторов JOIN?   -  person Mark D    schedule 13.05.2011
comment
@ Марк Нет, я не думаю, что смогу.   -  person Biff MaGriff    schedule 13.05.2011
comment
Вопрос с примером кода, как я могу сделать эти 65 соединений меньше, может быть успешным на codegolf.stackexchange.com;)   -  person JOG    schedule 11.01.2018


Ответы (3)


Согласно вашему комментарию к ответу Майка, «запрос для создания отчета должен объединяться и повторно присоединяться много раз».

Часто при работе с отчетами вам нужно разбить запрос на небольшие фрагменты и сохранить промежуточные результаты во временных таблицах, где это применимо.

Кроме того, ваш вопрос звучит так, как будто у вас есть хранилище сущностей/атрибутов/значений и вы пытаетесь повернуть все это. Если это так, вы можете вернуться к использованию этого анти-шаблона проектирования, поскольку он, вероятно, является источником вашей проблемы.

person Denis de Bernardy    schedule 16.05.2011

Я не думаю, что вы можете добиться «быстрой» работы на любой платформе реляционной базы данных, когда пытаетесь присоединиться к такому количеству таблиц — любая встроенная оптимизация испустит дух. Я, вероятно, пересмотрю свой дизайн, когда увижу до десяти таблиц в запросе.

Я думаю, что ваш дизайн схемы необходимо пересмотреть. 250+ таблиц в схеме (на телефоне!) Для меня не имеет смысла - я запускаю несколько корпоративных приложений в одной БД с 200+ ГБ данных, и все еще есть только 84 таблицы. И я никогда не присоединяюсь ко всем. Все ваши таблицы имеют разные столбцы? Действительно разные? Не могли бы вы опубликовать несколько записей от sqlite_master?

person Mike Woodhouse    schedule 05.05.2011

Поскольку ваше приложение работает на устройстве Android, я предполагаю, что оно где-то синхронизируется с базой данных корпоративного класса на сервере. Реальное решение состоит в том, чтобы сгенерировать денормализованное представление данных сервера в базе данных устройства, чтобы к ним можно было получить более легкий доступ.

person Tony the Pony    schedule 11.05.2011