SQL - мой запрос с курсором, похоже, начинает загружать процессор - PullRequest
0 голосов
/ 16 июня 2020

Я написал запрос, который по большей части сегодня работает нормально. Он в основном исправляет SQL геометрию, буферизуя геометрию внутри переменной, захватывая любые пересекающиеся с ней геометрии, а затем изменяя их. Теория верна и не проблема (по иронии судьбы, мы исправляем геометрию, исправляя окружающие ее).

Однако, я думаю, проблема с курсором. Запрос работал нормально большую часть дня, и только после примерно 6 часов его выполнения в разных геометриях (см. @IngoingSWMember) он сразу замедлился, а затем начал зависать. Его убийство тоже ничего не дало, поэтому нам пришлось перезапустить экземпляр.

Запрос ниже, но в основном: есть ли что-нибудь очевидное, что могло бы вызвать это?

declare @IngoingSWMember int
set @IngoingSWMember = 1746

declare @BufferAmount decimal(18,10)
set @BufferAmount = 0.00001

declare @IngoingGeom geometry
set @IngoingGeom = (select geom from base.LAND_OF_INTEREST where sw_member = @IngoingSWMember).STBuffer(@BufferAmount)

declare SurroundingGeoms cursor
for select
    sw_member,
    geom
from base.land_of_interest
where geom.STIntersects(@IngoingGeom) = 1 and sw_member != @IngoingSWMember

open SurroundingGeoms

declare @TempGeom geometry
declare @TempSWMember int
declare @IntersectingGeom geometry

fetch next from SurroundingGeoms into @TempSWMember, @TempGeom

while @@FETCH_STATUS = 0
    begin
        print @TempSWMember
        set @TempGeom = @TempGeom.STBuffer(@BufferAmount)
        set @IntersectingGeom = (select geometry::UnionAggregate(geom) from base.land_of_interest where geom.STIntersects(@TempGeom) = 1 and sw_member != @TempSWMember)
        set @TempGeom = (select @TempGeom.STDifference(@IntersectingGeom).MakeValid())
        update base.land_of_interest set geom = @TempGeom where sw_member = @TempSWMember
        fetch next from SurroundingGeoms into @TempSWMember, @TempGeom
    end;

close SurroundingGeoms

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