Производительность SQL Server 2008 STFilter - PullRequest
0 голосов
/ 06 июня 2018

Позвольте мне предварить это, сказав, что я новичок в пространственных индексах.У меня есть 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% запроса.У меня нет включенного столбца в моем пространственном индексе.Не уверен, сможешь ли ты, или как мне это обойти.

Есть ли красные флажки, которые выпрыгивают на кого-либо?Любое перенаправление приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...