zed писал(а):Зато можно выполнить несколько таких запросов
Можно. Но накладно.
Вот буквально сейчас полечил в одном проекте старт EXE-хи к оракловой базе. Вместо кучки запросов - один. Ничего больше не поменялось. Запуск стал не 2-3 минуты, а 5 секунд.
zed писал(а):Или можно построить Rect по массиву, выполнить один запрос в СУБД и отфильтровать результат по массиву
Внезапно - это примерно то же, что предлагает Виктор, правда ВНЕ хранилища )))
zed писал(а):И есть мнение, что подавляющее большинство юзеров использует тайловый/Беркли кэш, а не СУБД. Соответственно, в большинстве случаев из хранилища выборка идёт по-тайловая и есть смысл в оптимизации запросов
Во-первых, мы оба прекрасно понимаем, почему в основной ветке нет тайлохранилищ SQlite и фактически не используется СУБД. Наверняка это оттого, что файловый кэш офигенно быстрый, а бекрли меганадёжен и сломать его крайне сложно, и даже если он сломался, то никаких специальных процедур восстановления обычно не требуется. Ирония * Сарказм, если что.
Уж сколько я всю жизнь отработал с целым зоопарком СУБД и у меня нет проблемы админить любую поделку любых индусов - но всё больше люблю SQLite: база доступна под любой платформой, восстановление после сбоев автоматическое, бэкапы делаются из консоли обычным копированием файлов, быстрая карта заполнения одним запросом,... есть ровно одна проблема - доступ по сети, но я предполагаю её решать.
Во-вторых, построение карты заполнения по массиву RECT - уже достаточная оптимизация по сравнению с всеми тайлами на экране, см. текст тикета.
В-третьих, можно даже RECTы с дырками передавать, причём не обязательно сохранять связь, просто будет в случае SQL запрос вида WHERE (... between ... and ...) and (not (... between ... and ...)). Будет экономия и для файлового итератора (попали в дырку - пропуск) и для БД (экономия на io: не надо поднимать тайл и гнать его по сети).
Так что я предлагаю даунгрейдить функциональность ровно в том месте, которое не справляется: если тайлохранилище не поддерживает такие плюшки - путь и разворачивает как ему надо, пусть возможно кэширует наличие тайлов и сохраняет карту заполнения.
zed писал(а):vasketsov писал(а):И я не понимаю, почему RECT избыточен.
Ну, объяснение на прошлой странице. По Rect мы проверяем наличие 16 тайлов, хотя нас интересует только 8. Двукратная избыточность в данном конкретном примере.
Не, это я понял. Я про избыточность в решении задачи.
Мне вот например не очевидно, что критерий оптимальности = минимизация суммарного количества тайлов, которое надо прочитать из тайлохранилища.
Причём это касается и оптимальности как минимизации времени работы, так и оптимальности в смысле реализации доработки и дальнейшей её поддержки, в том числе и для новых типов тайлохранилищ.