Производительность SQL (Заменить) - PullRequest
1 голос
/ 02 сентября 2010

У меня есть таблица с 400 000+ строк. Я пишу некоторый код сопоставления с образцом, но мне нужно очистить столбец, прежде чем я это сделаю. Это сводится к выполнению операции, подобной замене.

Я пытался перечислить их всех по одному ...

 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southeast ',' se ')
 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southwest ',' sw ')

Так как у меня их более 500 ... это заняло слишком много времени.

Теперь я пытаюсь их вложить ...

 Update T_ADDRESS set ADDR_LINEONE = REPLACE(REPLACE(ADDR_LINEONE,' southwest ',' sw '),' southeast ',' se ')

Но это все еще мучительно медленно. Мне нужно, чтобы этот код работал с таблицами всех размеров (от 1 записи до 5 миллионов записей).

У кого-нибудь есть совет? Кстати, я использую SQL Server.

Ответы [ 4 ]

7 голосов
/ 02 сентября 2010

Вы должны всегда сканировать таблицу целиком, независимо от того, насколько вы любезны ЗАМЕНИТЬ. Это то, что убивает производительность, и ее нельзя изменить, поскольку вам нужно каким-либо разумным способом индексировать поле ADDR_LINEONE.

Поскольку это должна быть однократная операция, длительное время не должно иметь значения.

Если это повторяющаяся операция, то проблема не в том, как загрузить данные в таблицу: выполните преобразование до , сохраните данные, иначе у вас не останется никаких шансов.

2 голосов
/ 02 сентября 2010

Напишите процедуру CLR.TSQL не очень хорош (или предназначен для) обработки большого числа операций со строками.

Регулярные выражения упрощают сопоставление с образцом и извлечение данных

0 голосов
/ 02 сентября 2010

Вы можете написать оператор обновления, чтобы использовать оператор CASE вместо нескольких REPLACE, хотя я не знаю, будет ли он выполняться быстрее для вас.

0 голосов
/ 02 сентября 2010

Создайте таблицу #TEMP с новыми значениями, затем внутреннее соединение Как то так

create table #TempValues
(oldAres varchar(12),newadres varchar(2))

insert into #TempValues
select 'southeast','se'
union all 
select 'southwest','sw'

update T_ADDRESS
set addr_lineone=t.newadres
from T_ADDRESS inner join #TempValues t on T_ADDRESS.addr_lineone=t.oldAdres
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...