Shoorick писал(а):Более того - копирование части кэша внутри области и работа потом по результирующему кэшу (то есть обратная ситуация) по сути и будет таким индексированием.
Не понял.
Я о разнице между вариантами:
1. Есть произвольный кэш, выделяем произвольную область, работаем с ней.
2. Есть произвольный кэш, выделяем произвольную область, переносим её отдельно, работаем со всей перенесённой областью без использования области выделения.
Так вот случай 2 с точки зрения операций над кэшем фактически раносилен актуальному кластерному индексу над случаем 1.
Shoorick писал(а):сервисы предпочитают на некотором, заранее неизвестном, расстоянии от берега обрывать область хорошего разрешения. В результате заранее выделить полигон, в котором будет 100% данных, практически невозможно
Если в кэше будет сохранться TNE - попадание в индекс будет 100%-ным, ибо NULL или TNE в качестве тела тайла - это тоже данные. Причём в индекс они попадают на любой из поддерживаемых СУБД, если говорить про СУБД. Не попадание в индекс будет в том случае, если координата отсутствует в индексе, то есть если нет тайла и нет TNE.
Shoorick писал(а):Согласен, но геоданные по своей природе очень часто разреженные (если хотите, называйте их "почти пустыми", мне непринципиально)
Давайте я попробую объяснить разницу. Ибо с точки зрения хранилища и индексирования она принципиальна:
1. Если TNE сохраняется, и тайла нет, то в хранилище есть об этом запись. Так как все поля в первичном ключе (координаты тайла) не NULL, то на любой СУБД такая запись попадает в индекс. Соответственно используя этот индекс, можно быстро найти адрес, где физически хранится тело тайла. Обнаружим мы там реальный тайл или NULL - индексу совершенно по лампочки, потому что поле "тело тайла" очевидно само по себе не входит в первичный ключ и вообще не индексируется. Это конечно несколько упрощено, хотя бы исходя из наличия покрывающего индекса над первичным ключём. Но суть вполне отражает. Так вот разреженным хранилищем называется такое (возвращаясь к нашим баранам), где записи TNE есть, и их много, то есть в поле "тело тайла" очень много значений NULL. В этом случае имеет смысл хранить записи с NULL и не с NULL по-разному, чтобы не ходить лишний раз по индексу и тратить меньше места на хранение пустого поля. В этом и заключается оптимизация sparsed storage.
2. Если TNE не сохраняется, и тайла нет, то в хранилище нет об этом записи. Соответственно такая отсутствующая запись гарантированно не попадает ни в какие индексы, просто потому что невозможно предусмотреть логику предметной области: БД не знает, какие вообще могут быть записи внутри неё. Поэтому БД не может сделать никаких предположений о тайлах и TNE, которых у неё нет. Соответственно хранилище знать не знает, что оно не заполнено, и что там есть пустые места. Я это назвал "почти пустым", хотя специального названия такой ситуации нет (и уж точно это не разреженное хранилище), так как оно просто не нужно. Это самая обычная рабочая ситуация, и никакой оптимизации в хранении тут быть не может по определению: мы не знаем, что через секунду может упасть в БД, и как потребуется это "переоптимизировать". Соответственно в индекс отсутствующие записи не попадают, значит по индексу СУБД не сможет определить, где хранится то, чего нет (более того, даже индекс может быть неактуален из-за протухания статистики, так что всё ещё хуже чем могло бы быть).