powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать вставку данных
15 сообщений из 15, страница 1 из 1
Можно ли оптимизировать вставку данных
    #35398587
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите, пожалуйста, найти решение
Имеются:
- таблица A со столбцами rnn, name
- несколько таблиц B вида rnn, name
rnn - уникальные.
Необходимо обновить поле name таблицы A значениями из полей name таблиц B, связывая их по rnn.
Для этого сейчас используется несколько (по количеству таблиц B) запросов вида
update A set name = (select name from B1 where rnn = A.rnn)
...
update A set name = (select name from Bn where rnn = A.rnn)
что есть очень неоптимально (таблички большие).
Можно ли это сделать как-то по-другому?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35398883
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErkeshНеобходимо обновить поле name таблицы A значениями из полей name таблиц B, связывая их по rnn.
Для этого сейчас используется несколько (по количеству таблиц B) запросов вида
update A set name = (select name from B1 where rnn = A.rnn)
...
update A set name = (select name from Bn where rnn = A.rnn)
что есть очень неоптимально (таблички большие).
Можно ли это сделать как-то по-другому?
У вас противоречие - топик называется "Можно ли оптимизировать вставку данных", а в тексте написано "Необходимо обновить поле". Для каждого случая м.б. свои подходы.
А что такое "очень неоптимально" ? сколько времени выполняется один запрос ? Сколько времени вам бы хотелось ? Что такое "таблички большие" в вашем понимании ?
Надеюсь, что нужные индексы у вас построены ?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35398918
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisУ вас противоречие - топик называется "Можно ли оптимизировать вставку данных", а в тексте написано "Необходимо обновить поле".
Обновить. Так, как в тексте.

vasilisсколько времени выполняется один запрос ? Сколько времени вам бы хотелось ? Что такое "таблички большие" в вашем понимании ?
Надеюсь, что нужные индексы у вас построены ?
Размер основной таблицы (таблицы A) - в первом случае - 173 000 строк, во втором случае - 1 200 000 строк. Размеры связываемых таблиц (таблиц B) - в среднем - по 200 000 строк (таких таблиц 14). Запросы запустил на две основные таблицы параллельно вчера. До сегодняшнего дня закончилось только одно обновление (из 14 таблиц). Хотелось бы, чтобы все закончилось до понедельника (за 2-3 суток). Построены индексы по полям rnn таблиц B.
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35398975
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле rnn в таблице B1 может быть равно полю rnn в таблице Bn?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35398991
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IkirПоле rnn в таблице B1 может быть равно полю rnn в таблице Bn?
Да.
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399073
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно соптимизировать количество операций UPDATE через TEMP TABLE WITH NO LOG.
Хотя 2-3 суток на таких обьёмах - это что-то в "консерватории" не так. На каком аппарате работает INFORMIX?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399150
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IkirХотя 2-3 суток на таких обьёмах - это что-то в "консерватории" не так. На каком аппарате работает INFORMIX?
HP-UX B.11.11 U 9000/800
1 процессор, 2 Гб ОЗУ. Чанки на сырых устройствах.
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399158
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IkirМожно соптимизировать количество операций UPDATE через TEMP TABLE WITH NO LOG.
Значит, для ускорения работы я делаю приблизительно следующее.
---
create temp table t1 with no log as select * from A;
update table A set name = (select name from B1 where rnn = A.rnn);
...
update table A set name = (select name from Bn where rnn = A.rnn);
create table A1 as select * from t1;
---
Правильно?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399305
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErkeshПомогите, пожалуйста, найти решение
Имеются:
- таблица A со столбцами rnn, name
- несколько таблиц B вида rnn, name
rnn - уникальные.
Необходимо обновить поле name таблицы A значениями из полей name таблиц B, связывая их по rnn.
Для этого сейчас используется несколько (по количеству таблиц B) запросов вида
update A set name = (select name from B1 where rnn = A.rnn)
...
update A set name = (select name from Bn where rnn = A.rnn)
что есть очень неоптимально (таблички большие).
Можно ли это сделать как-то по-другому?

Для начала опеределитесь - мне кажется даже в начальном вашем варианте вы забыли добавить условие WHERE в UPDATE, и на самом деле хотели сделать что-то типа:
Код: plaintext
1.
2.
3.
4.
update A set name = (select name from B1 where rnn = A.rnn) 
  WHERE EXISTS(select * from B1 B1_2 where  B1_2.mn = A.rnn);
...
update A set name = (select name from Bn where rnn = A.rnn)
  WHERE EXISTS(select * from Bn Bn_2 where  Bn_2.mn = A.rnn);
не так ли?

Иначе неприятно удивитесь корректности полученных результатов...
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399309
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, из-за того что топикстартер не пользовался кнопкой SRC - в моём посте
Код: plaintext
mn
и
Код: plaintext
rnn
считать одинаковыми
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399331
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы начал не с этого, а сформировал бы в TEMP TABLE минимально необходимый список update.
Например так:
CREATE TEMP TABLE all_upd ( u_rrn ..., u_name ...) WITH NO LOG;
SELECT rnn,name FROM B14 INTO TEMP u_temp WITH NO LOG;
INSERT into all_upd(u_rrn,u_name) SELECT rnn,name FROM u_temp;
DROP TABLE u_temp;
SELECT rnn,name FROM B13 WHERE rnn not in (SELECT u_rnn FROM all_upd) INTO TEMP u_temp WITH NO LOG;
INSERT into all_upd(u_rrn,u_name) SELECT rnn,name FROM u_temp;
DROP TABLE u_temp;
SELECT rnn,name FROM B12 WHERE rnn not in (SELECT u_rnn FROM all_upd) INTO TEMP u_temp WITH NO LOG;
INSERT into all_upd(u_rrn,u_name) SELECT rnn,name FROM u_temp;
DROP TABLE u_temp;
............................................ и так далее до
SELECT rnn,name FROM B1 WHERE rnn not in (SELECT u_rnn FROM all_upd) INTO TEMP u_temp WITH NO LOG;
INSERT into all_upd(u_rrn,u_name) SELECT rnn,name FROM u_temp;
DROP TABLE u_temp;
посмотреть сколько это будет работать.
посмотреть количество записей в all_upd.
(Если вдруг в таблицах Bn могут быть значения , которых нет в A , то можно усилить фильтр в условии WHERE.)
( возможно создать индекс в таблице all_upd по полю u_rrn).
update A set name = (select name from all_upd where u_rnn = A.rnn)
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35399612
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErkeshПомогите, пожалуйста, найти решение
Имеются:
- таблица A со столбцами rnn, name
- несколько таблиц B вида rnn, name
rnn - уникальные.
Необходимо обновить поле name таблицы A значениями из полей name таблиц B, связывая их по rnn.
Для этого сейчас используется несколько (по количеству таблиц B) запросов вида
update A set name = (select name from B1 where rnn = A.rnn)
...
update A set name = (select name from Bn where rnn = A.rnn)
что есть очень неоптимально (таблички большие).
Можно ли это сделать как-то по-другому?


Еще одни вариант
1. создаем таблицу B_ALL
2. сторим PK индекс по rnn
3. включаем filtering на PK
4. запускаем таблицу исключений

5. В обратном порядке n копируем содержимое таблиц Bn.......B1.
В таблице B_ALL получаем уникальные последние версии сочетаний rnn ,name.
Все прочие записи лежат в таблице B_ALL_vio, или как вы ее там обозовете.

6. собираем статистику по B_ALL

7. пускаем update предложенный АнатоЛой
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35411290
Erkesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой
Для начала опеределитесь - мне кажется даже в начальном вашем варианте вы забыли добавить условие WHERE в UPDATE, и на самом деле хотели сделать что-то типа:
Код: plaintext
1.
2.
3.
4.
update A set name = (select name from B1 where rnn = A.rnn) 
  WHERE EXISTS(select * from B1 B1_2 where  B1_2.mn = A.rnn);
...
update A set name = (select name from Bn where rnn = A.rnn)
  WHERE EXISTS(select * from Bn Bn_2 where  Bn_2.mn = A.rnn);
не так ли?

Иначе неприятно удивитесь корректности полученных результатов...
Возможно, что я слабо знаю язык sql, но, первоначально мне показалось, что предложение where в данном запросе на обновление - лишнее. Эксперименты в оракловом sqlplus показывают
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> select * from t1;

       RNN NAME
---------- ----------------------------------------
          1 
          2 
          3 
          5 

SQL> select * from t2;

       RNN NAME
---------- ----------------------------------------
          1  A
          2  B
          4  D
          3  E

SQL> update t1 set name = (select name from t2 where rnn = t1.rnn);

 4  rows updated.

SQL> commit;

Commit complete.

SQL> select * from t1;

       RNN NAME
---------- ----------------------------------------
          1  A
          2  B
          3  E
          5 
АнатоЛой, поясните, пожалуйста, - зачем нужна проверка, представленная Вами в where для данного запроса?
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35411985
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erkesh АнатоЛой
Для начала опеределитесь - мне кажется даже в начальном вашем варианте вы забыли добавить условие WHERE в UPDATE, и на самом деле хотели сделать что-то типа:
Код: plaintext
1.
2.
3.
4.
update A set name = (select name from B1 where rnn = A.rnn) 
  WHERE EXISTS(select * from B1 B1_2 where  B1_2.mn = A.rnn);
...
update A set name = (select name from Bn where rnn = A.rnn)
  WHERE EXISTS(select * from Bn Bn_2 where  Bn_2.mn = A.rnn);
не так ли?

Иначе неприятно удивитесь корректности полученных результатов...
Возможно, что я слабо знаю язык sql, но, первоначально мне показалось, что предложение where в данном запросе на обновление - лишнее. Эксперименты в оракловом sqlplus показывают
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> select * from t1;

       RNN NAME
---------- ----------------------------------------
          1 
          2 
          3 
          5 

SQL> select * from t2;

       RNN NAME
---------- ----------------------------------------
          1  A
          2  B
          4  D
          3  E

SQL> update t1 set name = (select name from t2 where rnn = t1.rnn);

 4  rows updated.

SQL> commit;

Commit complete.

SQL> select * from t1;

       RNN NAME
---------- ----------------------------------------
          1  A
          2  B
          3  E
          5 
АнатоЛой, поясните, пожалуйста, - зачем нужна проверка, представленная Вами в where для данного запроса?
вы попробуйте с другим примером
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select * from t1;

       RNN NAME
---------- ----------------------------------------
          1  A
          2  A
          3  A
          5  A
...
Рейтинг: 0 / 0
Можно ли оптимизировать вставку данных
    #35412383
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erkesh
АнатоЛой, поясните, пожалуйста, - зачем нужна проверка, представленная Вами в where для данного запроса?
Если вкратце - вот к чему вас подталкиваем:
если для конкретной записи в A нет соответствующей в B1 - то A.name будет обNULLен...
А в вашем случае, когда вы делаете update таблицы A последовательно из нескольких B1-Bn, то именно последний update и затрёт в NULL все те A.name, для которых не нашлось записей Bn.rnn = A.Rnn.... Если поступить ещё жестче и допустить что в Bn нет вообще ни одной записи, то после
Код: plaintext
update A set name = (select name from Bn where rnn = A.rnn)
все A.name станут NULL
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать вставку данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]