Объединение двух простых запросов SQL Server занимает много времени - PullRequest
0 голосов
/ 16 ноября 2018

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

SELECT OBJECTID AS OID FROM PST_35053_SNAPPED;

Занимает меньше секунды и возвращает около 3000 строк.Второй запрос:

SELECT DISTINCT PST.OBJECTID as OID FROM PST_35053_SNAPPED 
PST INNER JOIN  POWNERS_35053 POW
ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1;

Занимает секунду, возвращая около 2500 строк.

При объединении их с EXCEPT для получения polygon IDs без падающих в них точек (около 500 строк),выполнение результирующего запроса занимает более двух минут (около 122 секунд):

SELECT OBJECTID AS OID FROM PST_35053_SNAPPED
EXCEPT
SELECT DISTINCT PST.OBJECTID as OID FROM PST_35053_SNAPPED 
PST INNER JOIN  POWNERS_35053 POW
ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1

Есть что-то, что я пропускаю или делаю неправильно?Я использую SQL Server 2012 SP3

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Попробуйте вставить свой скрипт во временную таблицу, а затем объединить его.У нас нет плана выполнения, мы можем показать вам только выполнение вашего запроса под разными углами.:

SELECT DISTINCT PST.OBJECTID as OID INTO #Temp FROM PST_35053_SNAPPED 
PST INNER JOIN  POWNERS_35053 POW
ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1;

SELECT OBJECTID AS OID FROM PST_35053_SNAPPED
EXCEPT
SELECT OID FROM #Temp;

или попробуйте не существует:

SELECT OBJECTID AS OID 
FROM PST_35053_SNAPPED PST1
WHERE NOT EXISTS 
    (SELECT 1 FROM 
        (
            SELECT DISTINCT PST.OBJECTID as OID FROM PST_35053_SNAPPED 
            PST INNER JOIN  POWNERS_35053 POW
            ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
            convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1
        ) PST2
        WHERE PST1.OBJECTID=PST2.OBJECTID
    )

или попробуйте С:

WITH Cte AS 
(
    SELECT DISTINCT PST.OBJECTID as OID FROM PST_35053_SNAPPED 
    PST INNER JOIN  POWNERS_35053 POW
    ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
    convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1
)
SELECT OBJECTID AS OID FROM PST_35053_SNAPPED
EXCEPT
SELECT OID FROM Cte;
0 голосов
/ 16 ноября 2018

Сложно сказать без плана выполнения запроса.Однако, если я правильно понимаю, следующий запрос должен получить тот же результат и будет быстрее.

SELECT PST.OBJECTID as OID 
FROM PST_35053_SNAPPED PST 
LEFT JOIN  POWNERS_35053 POW
ON geometry::STGeomFromText('POINT(' + convert(varchar(16),POW.x) + ' ' +
convert(varchar(17),POW.y) + ')', 2100).STWithin(PST.Shape)=1
WHERE POW.OBJECTID IS NULL
...