2015-03-11 3 views
0

У нас есть две таблицы, в которых хранится геометрия полигона. Я хотел бы получить полигоны, присутствующие в одной таблице, и не присутствовать в другой таблице. На данный момент я делаю левое внешнее соединение и используя STAsText(), но это занимает много времени. FYI. У нас есть 120 миллионов полигонов в обеих таблицах. Есть ли быстрый способ получения? (может быть, используется пространственное индексирование, я не знаю об этом).Самый быстрый способ сравнения типов геометрии полигонов

FYI, я использую SQL Server 2012

+0

Данных в этой таблице нет. Это команда, которую я использую для сравнения. выберите newPolygon. * Из table1 newPolygon слева присоединиться table2 oldPolygon на newPolygon.Shape.STAsText() = oldPolygon.Shape.STAsText() где oldPolygon.Shape является нулевым – ABCDEFG

+0

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

+0

Эта форма проверки «LEFT OUTER JOIN» - это способ проверки значений в одной таблице, которые не находятся в другом, поскольку я нашел, что это быстрее, чем использование «EXCEPT» или «NOT IN()» и других альтернатив. Я не очень хорошо знаком с типом данных географии, поэтому я не уверен, сколько пространственных индексов вам поможет; они должны сделать некоторое улучшение. Попытайтесь удалить любые значения NULL перед индексированием, если вы это сделаете, поскольку я, кажется, помню, что есть проблема с производительностью с NULL в пространственных индексах. –

ответ

2

Это должно сделать:

select a.* 
from dbo.newPolygon as a 
left join dbo.OldPolygon as b 
    on a.Shape.STEquals(b.Shape) = 1 
where b.ID is null 

Если у вас есть пространственный индекс на столбце Shape в обеих таблицах, он должен поддерживать этот запрос. Из документации:

Пространственные индексы поддерживают следующие-ориентированный набор методов геометрии при определенных условиях: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches(), и STWithin(). Для поддержки пространственного индекса эти методы должны использоваться в предложении WHERE или JOIN ON запроса, и они должны встречаться в пределах предиката следующего общего вида:

geometry1. method_name (geometry2) comparison_operator valid_number

(курсив мой) Так как мы, на самом деле, используя STEquals() в порядке, установленном что документация говорит, что мы должны быть хорошо идти.

Смежные вопросы