Почему этот статус обновления Sybase IQ такой медленный? - PullRequest
1 голос
/ 18 марта 2011

У меня есть одна таблица (Table1) с некоторой информацией и идентификатором строки

У меня есть другая таблица (Table2) с дополнительной информацией и идентичным идентификатором строки (в середине отсутствует дополнительный символ).

Я изначально присоединился к столам на

t2.StringID = substring(t1.StringID,0,2)+substring(t1.StringID,4,7)

Но это было слишком медленно, поэтому я решил создать новый столбец в Таблице 1, который уже сопоставлен с PrimaryID в Таблице 2, а затем проиндексировать этот столбец.

Итак, чтобы обновить этот новый столбец, я делаю это:

select distinct PrimaryID, 
                substring(t2.StringID,0,2)+
                substring(t2.StringID,4,7)) as StringIDFixed
into #temp
from Table2 t2

update Table1 tl
set t1.T2PrimaryID = isnull(t.PrimaryID, 0)
from Table1 t11, #temp t
where t11.StringID = t.StringIDFixed
and t1.T2PrimaryID is null  

Он создает временную таблицу за несколько секунд, но обновление работает уже 25 минут, и я не знаю, будет ли оно когда-либо завершено.

Таблица 1 имеет 45 мм строк, Таблица 2 имеет 1,5 мм

Я знаю, что это большой объем данных, но, тем не менее, я чувствую, что это не должно быть так сложно.

Это Sybase IQ 12,7

Есть идеи?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Создал индекс для временной таблицы, который занял несколько секунд, а затем повторно запустил то же обновление, которое затем заняло всего 7 секунд.

create index idx_temp_temp on #temp (StringIDFixed)

Я ненавижу Sybase.

1 голос
/ 27 апреля 2011
select distinct isnull(t2.PrimaryID, 0),
                substring(t2.StringID,0,2)+
                substring(t2.StringID,4,7)) as StringIDFixed
into #temp
from Table2 t2

create HG index idx_temp_temp_HG on #temp (StringIDFixed)
or 
create LF index idx_temp_temp_LF on #temp (StringIDFixed)

--check if in Table1 exists index HG or LF in StringID if not.. create index

update Table1 tl
set t1.T2PrimaryID = t.PrimaryID
from Table1 t11, #temp t
where t11.StringID = t.StringIDFixed

-- check if is necesary 
-- and t1.T2PrimaryID is null  replace for t11.T2PrimaryID is null  
0 голосов
/ 21 октября 2013

Попробуйте заменить обновление внутренним объединением, чтобы избежать использования функции isnull () для большого набора данных.

update Table1 
set a.T2PrimaryID = b.PrimaryID
from        Table1  a
inner join  #temp   b
on a.StringID = b.StringIDFixed
...