Позвольте мне предварить это, сказав, что я новичок в пространственных индексах.У меня есть sproc, который, как я знаю, использует мой пространственный индекс (занимает 1% запроса), однако фильтр замедляет мой запрос (занимает 52% запроса).Я изо всех сил пытаюсь выяснить, как ускорить это, поскольку у меня не много возвращаемых записей (примерно 1000).
SCENARIO
У меня есть таблицазаказы.Каждая запись имеет Zipcode
того, откуда происходит продукт, и Zipcode
того, куда продукт поставляется.
У меня также есть таблица всех почтовых индексов в стране вместе с точкой GEOGRAPHY
почтового индекса, основанной на широте / долготе (уже вычислена как столбец в таблице).
Мне нужно получить все заказы, которые происходят в радиусе 75 миль от переданного в почтовый индекс и отправлены в почтовый индекс в пределах 75 миль от переданного в почтовый индекс назначения.
Вот SQL у меня есть.Это работает, но мне нужно, чтобы это было быстрее.Я не думаю, что это займет больше 1 секунды.
DECLARE
@oCenterPoint GEOGRAPHY,
@dCenterPoint GEOGRAPHY,
@originCircle GEOGRAPHY,
@destCircle GEOGRAPHY,
@radiusInMeters DECIMAL
SELECT @oCenterPoint=GeographyPoint FROM MyZipcodeTable WHERE Zipcode=@prmOriginZip
SELECT @dCenterPoint=GeographyPoint FROM MyZipcodeTable WHERE Zipcode=@prmDestZip
SET @radiusInMeters = 75 * 1609.344
/* build the two circles to use STIntersects() function */
SET @originCircle = @oCenterPoint.Reduce(400).STBuffer(@radiusInMeters).Reduce(1000)
SET @destCircle = @dCenterPoint.Reduce(400).STBuffer(@radiusInMeters).Reduce(1000)
/* get our zips that are in our origin radius */
CREATE TABLE #oZips (Zipcode VARCHAR(15) NOT NULL PRIMARY KEY)
INSERT INTO #oZips ( Zipcode )
SELECT z.Zipcode
FROM MyZipcodeTable z
WHERE @originCircle.STIntersects(z.GeographyPoint)=1
/* get our zips that are in our destination radius */
CREATE TABLE #dZips (Zipcode VARCHAR(15) NOT NULL PRIMARY KEY)
INSERT INTO #dZips ( Zipcode )
SELECT z.Zipcode
FROM MyZipcodeTable z
WHERE @destCircle.STIntersects(z.GeographyPoint)=1
Это самая медленная часть запроса.Внутреннее соединение моей таблицы заказов с этими исходными и конечными таблицами почтовых индексов происходит быстро.Вставка действительных почтовых индексов является причиной проблем с производительностью.Как я уже говорил выше, он использует пространственный индекс, но в плане выполнения есть фильтр, который стоит 52%.Он делает что-то с оператором CASE, который должен быть частью функции STIntersects ().
Кроме того, несмотря на то, что он использует мой пространственный индекс, я вижу, что он также использует мой кластеризованный индекс, и он занимает 37% запроса.У меня нет включенного столбца в моем пространственном индексе.Не уверен, сможешь ли ты, или как мне это обойти.
Есть ли красные флажки, которые выпрыгивают на кого-либо?Любое перенаправление приветствуется!