Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
Добрый вечер!
Есть некий код для определения региона, округа, города, пункта, улицы по текстовой строке.
В лоб через курсоры и справочник кладр.
Последовательно определяется региона, округ, город, пункт, улица.
Пункты и улицы отрабатывают очень долго.

Гуру подскажите как можно это оптимизировать или может быть переписать?

Часть кода на пример района, для всего остального аналогично
+

if @type in (1)
begin
set nocount on

print '---Определяем district---'

print '---Определяем часть 1 по району и типу---нач:'+(CONVERT( VARCHAR(24), GETDATE(), 121))


DECLARE address_cursor CURSOR LOCAL FORWARD_ONLY STATIC FOR
select district mask, region,region_type,district,district_type from sprav_kladr_street
where district is not null and district<>'--'
--and patindex('%'+district+'%', region)>0
group by region,region_type,district,district_type
order by len(district) desc

OPEN address_cursor
FETCH NEXT FROM address_cursor
INTO @mask,@region,@region_type,@district,@district_type
WHILE @@FETCH_STATUS=0
BEGIN
set @region = @region
set @region_type=@region_type
set @district = @district
set @district_type=@district_type


update dbo.sheet1
set region=@region, region_type=@region_type
,district=@district,district_type=@district_type
where (district is null) and region=@region
and (dbo.RegexMatch(Адрес,'((\W|^)'+@district+'.{1,3}'+@district_type+'(\W|$))')=1
or dbo.RegexMatch(Адрес,'((\W|^)'+@district_type+'.{1,3}'+@district+'(\W|$))')=1)

--print @mask + ' ' + @region

FETCH NEXT FROM address_cursor
INTO @mask,@region,@region_type,@district,@district_type
END
CLOSE address_cursor

DEALLOCATE address_cursor

print '---Определяем часть 1---кон:'+(CONVERT( VARCHAR(24), GETDATE(), 121))


28 ноя 13, 23:58    [15209038]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
sdet
Member

Откуда:
Сообщений: 463
Alexey I.G.,
Без всякого курсора, обычное обновление одной таблицы значениями другой
29 ноя 13, 01:06    [15209214]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
sdet, а можно поподробнее на примере, не совсем понятно как это реализовать без курсора
29 ноя 13, 01:21    [15209243]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
sdet
Member

Откуда:
Сообщений: 463
Alexey I.G.
sdet, а можно поподробнее на примере, не совсем понятно как это реализовать без курсора

Приблизительно так
;with kladr
as
(select district mask, region,region_type,district,district_type from sprav_kladr_street
where district is not null and district<>'--'
--and patindex('%'+district+'%', region)>0
group by region,region_type,district,district_type 
order by len(district) desc
) 
update sh
set sh.region=k.region, sh.region_type=k.region_type
,sh.district=k.district,sh.district_type=k.district_type
from dbo.sheet1 sh join kladr on sh.region=k.region
where (k.district is null) 
and (dbo.RegexMatch(Адрес,'((\W|^)'+k.district+'.{1,3}'+k.district_type+'(\W|$))')=1
or dbo.RegexMatch(Адрес,'((\W|^)'+k.district_type+'.{1,3}'+k.district+'(\W|$))')=1)
29 ноя 13, 01:35    [15209275]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
sdet
Member

Откуда:
Сообщений: 463
Alexey I.G.,
псевдонимы перепутал
kladr k on sh.region=k.region
where (sh.district is null) .....
29 ноя 13, 01:38    [15209281]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
sdet
Member

Откуда:
Сообщений: 463
Alexey I.G.,
В первом запросе вы group by region,region_type,district,district_type
для какой цели делаете?
29 ноя 13, 02:03    [15209315]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
sdet, таблица с КЛАДР у меня денормализованная, group by для группировки по району, городу и т.д. - уникальные записи получаю)
29 ноя 13, 11:58    [15211001]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
sdet, спасибо за мысль, попробую Ваш запрос.
единственная проблема есть, что делать когда нет поля по которому join-ить таблицу КЛАДР и таблицу с исходными данными.
через курсор я это делаю так:
+
DECLARE address_cursor CURSOR  LOCAL FORWARD_ONLY STATIC  FOR
select region mask, region,region_type  from sprav_kladr_street
group by region,region_type
order by len(region) desc

OPEN address_cursor
FETCH NEXT FROM address_cursor
INTO @mask,@region,@region_type
WHILE @@FETCH_STATUS=0
BEGIN
set @region = @region
set @region_type=@region_type


update dbo.sheet1
set region=@region, region_type=@region_type
where (region is null)
and (actuary.dbo.RegexMatch(Адрес,'((\W|^)'+@region+'.{1,3}'+@region_type+'(\W|$))')=1
or actuary.dbo.RegexMatch(Адрес,'((\W|^)'+@region_type+'.{1,3}'+@region+'(\W|$))')=1)


 

FETCH NEXT FROM address_cursor
INTO @mask,@region,@region_type
END
CLOSE address_cursor

DEALLOCATE address_cursor
29 ноя 13, 12:23    [15211219]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31426
Alexey I.G.
group by для группировки по району, городу и т.д. - уникальные записи получаю
Зачем группировку испльзовать вместо distinct?
Alexey I.G.
что делать когда нет поля по которому join-ить таблицу КЛАДР и таблицу с исходными данными.
Не бывает "поля по которому join-ить", если условия, по которым делают join

То есть видите WHERE и всё, что в нём? Вот по этому и JOIN
29 ноя 13, 12:33    [15211272]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
alexeyvg,

а есть большая разница в скорости при группировки или distincte?
просто если join без условия, то это cross join получится (декартово произведение).
и к декартову произведению применить условие where - вы это имеете в виду?
29 ноя 13, 12:54    [15211433]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
sdet
Member

Откуда:
Сообщений: 463
Alexey I.G.
alexeyvg,

а есть большая разница в скорости при группировки или distincte?
просто если join без условия, то это cross join получится (декартово произведение).
и к декартову произведению применить условие where - вы это имеете в виду?

Какая то каша у вас в голове.
Причем здесь cross join? Вам же объяснили, что в условии, то и join-ится
29 ноя 13, 13:34    [15211796]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31426
Alexey I.G.
просто если join без условия, то это cross join получится (декартово произведение).
и к декартову произведению применить условие where - вы это имеете в виду?
Нет, cross join не надо, просто join с условием.

update dbo.sheet1
set region=@region, region_type=@region_type
join sprav_kladr_street
	on (actuary.dbo.RegexMatch(dbo.sheet1.Адрес,'((\W|^)'+sprav_kladr_street.region+'.{1,3}'+sprav_kladr_street.region_type+'(\W|$))')=1
	or actuary.dbo.RegexMatch(dbo.sheet1.Адрес,'((\W|^)'+sprav_kladr_street.region_type+'.{1,3}'+sprav_kladr_street.region+'(\W|$))')=1)
where (dbo.sheet1.region is null)
29 ноя 13, 16:01    [15213641]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31426
Alexey I.G.
Есть некий код для определения региона, округа, города, пункта, улицы по текстовой строке.
В лоб через курсоры и справочник кладр.
Последовательно определяется региона, округ, город, пункт, улица.
Пункты и улицы отрабатывают очень долго.

Гуру подскажите как можно это оптимизировать или может быть переписать?
Без курсора всё равно будет долго.

Нужно при вводе данных как то это парсить и привязывать.
29 ноя 13, 16:04    [15213669]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли оптимизировать данный cursor или заменить на не курсор  [new]
Alexey I.G.
Member

Откуда:
Сообщений: 18
alexeyvg,
понял, спасибо.
к сожаления пока на этапе ввода данных это парсить нельзя.
29 ноя 13, 16:47    [15214039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить