Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Помогите, пожалуйста, найти решение Имеются: - таблица 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) что есть очень неоптимально (таблички большие). Можно ли это сделать как-то по-другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 13:00 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
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) что есть очень неоптимально (таблички большие). Можно ли это сделать как-то по-другому? У вас противоречие - топик называется "Можно ли оптимизировать вставку данных", а в тексте написано "Необходимо обновить поле". Для каждого случая м.б. свои подходы. А что такое "очень неоптимально" ? сколько времени выполняется один запрос ? Сколько времени вам бы хотелось ? Что такое "таблички большие" в вашем понимании ? Надеюсь, что нужные индексы у вас построены ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 14:27 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
vasilisУ вас противоречие - топик называется "Можно ли оптимизировать вставку данных", а в тексте написано "Необходимо обновить поле". Обновить. Так, как в тексте. vasilisсколько времени выполняется один запрос ? Сколько времени вам бы хотелось ? Что такое "таблички большие" в вашем понимании ? Надеюсь, что нужные индексы у вас построены ? Размер основной таблицы (таблицы A) - в первом случае - 173 000 строк, во втором случае - 1 200 000 строк. Размеры связываемых таблиц (таблиц B) - в среднем - по 200 000 строк (таких таблиц 14). Запросы запустил на две основные таблицы параллельно вчера. До сегодняшнего дня закончилось только одно обновление (из 14 таблиц). Хотелось бы, чтобы все закончилось до понедельника (за 2-3 суток). Построены индексы по полям rnn таблиц B. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 14:37 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Поле rnn в таблице B1 может быть равно полю rnn в таблице Bn? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 14:56 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
IkirПоле rnn в таблице B1 может быть равно полю rnn в таблице Bn? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 14:58 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Можно соптимизировать количество операций UPDATE через TEMP TABLE WITH NO LOG. Хотя 2-3 суток на таких обьёмах - это что-то в "консерватории" не так. На каком аппарате работает INFORMIX? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 15:27 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
IkirХотя 2-3 суток на таких обьёмах - это что-то в "консерватории" не так. На каком аппарате работает INFORMIX? HP-UX B.11.11 U 9000/800 1 процессор, 2 Гб ОЗУ. Чанки на сырых устройствах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 15:50 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
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; --- Правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 15:53 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
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. Иначе неприятно удивитесь корректности полученных результатов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 16:42 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Сорри, из-за того что топикстартер не пользовался кнопкой SRC - в моём посте Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 16:44 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Я бы начал не с этого, а сформировал бы в 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 16:51 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
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 предложенный АнатоЛой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2008, 18:50 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
АнатоЛой Для начала опеределитесь - мне кажется даже в начальном вашем варианте вы забыли добавить условие WHERE в UPDATE, и на самом деле хотели сделать что-то типа: Код: plaintext 1. 2. 3. 4. Иначе неприятно удивитесь корректности полученных результатов... Возможно, что я слабо знаю язык 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2008, 12:48 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Erkesh АнатоЛой Для начала опеределитесь - мне кажется даже в начальном вашем варианте вы забыли добавить условие WHERE в UPDATE, и на самом деле хотели сделать что-то типа: Код: plaintext 1. 2. 3. 4. Иначе неприятно удивитесь корректности полученных результатов... Возможно, что я слабо знаю язык 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. вы попробуйте с другим примером Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2008, 16:13 |
|
||
|
Можно ли оптимизировать вставку данных
|
|||
|---|---|---|---|
|
#18+
Erkesh АнатоЛой, поясните, пожалуйста, - зачем нужна проверка, представленная Вами в where для данного запроса? Если вкратце - вот к чему вас подталкиваем: если для конкретной записи в A нет соответствующей в B1 - то A.name будет обNULLен... А в вашем случае, когда вы делаете update таблицы A последовательно из нескольких B1-Bn, то именно последний update и затрёт в NULL все те A.name, для которых не нашлось записей Bn.rnn = A.Rnn.... Если поступить ещё жестче и допустить что в Bn нет вообще ни одной записи, то после Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2008, 18:25 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=35399305&tid=1608062]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
116ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 290ms |
| total: | 489ms |

| 0 / 0 |
