2015-06-10 8 views
0

Я пытаюсь сгруппировать по пространственной локальности (Не просто создать пространственный индекс), но SQL Server этого не допускает. Чтобы создать пространственный индекс, он сначала хочет, чтобы я создал кластерный первичный ключ, который не имеет смысла для кластера. Я хочу создать пространственный индекс, а затем каким-то образом сгруппировать по пространству.Кластер по пространственному индексу

У меня есть идея создать мусорные корзины, в которых каждая геометрия будет помещена в определенную ячейку, которая затем получает целое число. Затем установите это как необходимый кластерный первичный ключ, таким образом, по крайней мере некоторые из моих данных группируются вместе пространственно.

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

Я хочу сгруппировать по пространственному местоположению, потому что я имею дело с большими данными, и первый фильтр, который я делаю, - это пространственное расположение (создание плиток карт), без кластеризации в пространственном местоположении мои страницы теперь разбросаны на основе какого-то бессмысленного авто increment integer.

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

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

ответ

0

Я не вижу, как это было бы возможно, независимо от реализации. В частности, идея ключа кластеризации заключается в том, что вы (механизм db) можете указать порядок, в котором должны храниться строки. Это возможно с любым другим типом данных (и их комбинацией), потому что в конечном итоге вы можете сказать, больше ли данный кортеж, меньше или равен другому. Какую метрику вы бы использовали для обобщенных пространственных данных, чтобы сказать, что один экземпляр больше или меньше другого? Размер? Близость к происхождению? Некоторые другие меры? В общем случае нет четкого представления об этом, и поэтому вы не можете этого сделать.

Но все не потеряно. Просто присвойте произвольный идентификатор вашим строкам (т. Е. Столбец идентификатора или столбец, заполненный последовательностью) и кластер. Затем вы можете разместить на нем пространственный указатель и перейти в город. Рассматривая свою проблему, если ваши корзины предварительно определены, вы можете поместить их в другую таблицу и сделать соединение, используя STIntersects. Но это может поставить телегу перед лошадью.

+0

Да, теперь я кластер на произвольный ключ и добавил свой пространственный указатель. Пространственный индекс игнорируется SQL-сервером, потому что он предпочел бы сначала использовать другой кластер PK из таблицы JOINed, а затем просто выполнить проверку PK на моей гео-таблице (он делает это, потому что прямо сейчас, если он использовал мою пространственную индекс, тогда данные будут разбросаны). Если бы я мог найти способ сгруппировать в какой-то значимый пространственный способ, я думаю, что SQL-сервер будет использовать мой пространственный индекс, потому что листовые узлы не будут на таких некластеризованных страницах. – ParoX

+0

Использование пространственного индекса оптимизатором невелика. Вы пытались использовать подсказку запроса, чтобы влиять на оптимизатор, чтобы использовать его? –

+0

В этом случае он совершает интеллектуальное перемещение, потому что таблица геометрии кластеризуется случайным образом (потому что я кластеризую ключ автоматического увеличения). Есть 100 миллионов геометрий, и он находит 2000 результатов. Эти 2000 результатов, вероятно, принадлежат к примерно 2000 отдельным страницам, потому что это кластер. Мое предположение заключается в том, что SQL-сервер реализован, в то время как пространственный индекс будет лучше выполнять фильтрацию, его слишком нечеткие и предпочитает использовать фильтр, который не так хорош, но более сгруппирован. – ParoX