У нас есть миллионы записей в таблице. У нас есть столбец с пробелами после текста. Мы попробовали следующее:

update schema.table_name 
set column_name = trim(column_name);

Это очень медленно 20+ часов. Мы попытались использовать предложение WHERE и RTRIM, однако это не имело никакого значения. Что можно сделать, чтобы ускорить эту обрезку?

0
Mike 28 Дек 2019 в 19:02
Какой продукт СУБД вы используете? Но если вы обновите все строки, это будет не очень быстро. однако обновление «миллионов» строк не должно занимать часы. Может ждет блокировки?
 – 
a_horse_with_no_name
28 Дек 2019 в 19:05
1
Обычно предложение where, где trim (column_name) <> column_name должно хоть немного помочь
 – 
Thomas Strub
28 Дек 2019 в 19:05
Я подозреваю, что вы пытаетесь обновить таблицу myisam, которая все еще используется. В таком случае попробуйте UPDATE LOW_PRIORITY .... Вы также проверили vmstat и top?
 – 
Toto
28 Дек 2019 в 19:16
Спасибо всем за быстрый ответ. База данных - это Oracle ec2 (aws). В настоящее время мы запускаем оператор select, чтобы увидеть, сколько из миллионов строк записей имеют пробелы после текста в этом столбце.
 – 
Mike
28 Дек 2019 в 20:10

1 ответ

То, что делает запрос медленным, это, вероятно, не trim(), а необходимость обновления каждой строки. trim() будет медленным, если столбец особенно большой.

Предполагая, что нужно обновить только несколько строк, вы можете отфильтровать с помощью where:

update schema.table_name
    set column_name = trim(column_name)
    where column_name like ' %' or column_name like '% ';

Если нужно обновить большинство строк, то восстановление таблицы часто является самым быстрым решением:

create table temp_table_name
    select . . ., -- all the other columns
           trim(column_name) as column_name
    from t;

truncate table table_name;  -- BACKUP THE TABLE FIRST!

insert into table_name
    select *
    from temp_table_name;

Точный синтаксис может варьироваться в зависимости от базы данных. Кроме того, это сложно, если у вас есть автоинкрементные столбцы. Но идея та же самая.

1
Gordon Linoff 28 Дек 2019 в 19:05
Спасибо за быстрый ответ. База данных - это Oracle ec2 (aws). В настоящее время мы запускаем оператор select, чтобы увидеть, сколько из миллионов строк записей имеют пробелы после текста в этом столбце.
 – 
Mike
28 Дек 2019 в 20:10