
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
10.07.2009, 15:18
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
Здравствуйте! Sybase12.5 Задача: Таблица содержит порядка 150 млн. записей. Основной объем данных хранится в столбце типа varchar(255) и строка реально занимает около 200-255 симвлов, а теперь его необходимо очистить, но не все строки, а по условию, которое в столбце типа bit этой же таблицы. Примерно вот так: над таблицей ATable(AKey indentity, aSome1,aSome2,aSomeN, A_STRING varchar(255), A_FIELD bit) выполнить update ATable set A_STRING="" where A_FIELD=0 Проблема: Запрос настолько громадный, что вызывает переполнение журнала транзакций,а расширять журнал некуда, и неуверена, что это поможет. Пробовала разбить по ключу по 1млн, выполняется днями..... на таблице висит много индексов, но индексы со столбцом A_STRING удалены. Может есть какие-то хитрые приемы для таких случаев? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 17:36
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
AnnaGL, по A_FIELD есть индекс? кол-во записей с 0 по отношению к общему кол-ву какое? покажите Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 18:11
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
AnnaGL пишет: > Таблица содержит порядка 150 млн. записей. Основной объем данных > хранится в столбце типа varchar(255) и строка реально занимает около > 200-255 симвлов, а теперь его необходимо очистить, но не все строки, а > по условию, которое в столбце типа bit этой же таблицы. При таких объёмах уже главное -- не скорость, а чтобы ненароком не переполнить журнал транзакций. Поэтому по кускам напр. по 1000 записей в транзакции. > Примерно вот так: > над таблицей ATable(AKey indentity, aSome1,aSome2,aSomeN, A_STRING > varchar(255), A_FIELD bit) > выполнить update ATable set A_STRING="" where A_FIELD=0 Лучше update ATable set A_STRING=null where A_FIELD=0 > Запрос настолько громадный, что вызывает переполнение журнала > транзакций,а расширять журнал некуда, Говорю же , кусками.... Либо просто ставишь rowcount 1000, либо отбираешь ключи нужных записей заранее в промежут. табличку, пачками по 1000-10000, и уже из них -- update/ > и неуверена, что это поможет. Пробовала разбить по ключу по 1млн, > выполняется днями..... на таблице висит много индексов, но индексы со > столбцом A_STRING удалены. Может есть какие-то хитрые приемы для таких > случаев? Кроме всего, что перечислил, нет. А, не, есть, можно ещё сделать select ... c учётом этого критерия формирования поля A_STRING, сделать по нему VIEW, view сделать BCP OUT, потом таблицу TRUNCATE, и потом уже BCP IN обратно. Но это тоже не быстро при таких объёмах, и , что плохо, off-line: БД будет всё это время простаивать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 19:03
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
AnnaGL, Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 19:16
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
AnnaGL, Да, еще один момент. Если на базе в которой выполняется данная операция не стоит опция 'trunc log on chkpt' (обрезание логов транзакции по checkpoint), то есть логи копятся, то нужно в цикле после update делать dump transaction. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 19:34
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
SQLMantis Код: plaintext 1. Один из моих select @@version Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003 top - нипанимат... _________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 20:36
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
Ex_Soft, Ммм, у меня 12.5.4 Ну тогда курсором, примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.07.2009, 22:48
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
SQLMantis пишет: > Автор: "SQLMantis" > Ex_Soft, > Ммм, у меня 12.5.4 > Ну тогда курсором, примерно так Да просто можно set rowcount 1000 update Atable set A_STRING="" where .. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.07.2009, 18:48
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
афаик это место не высвободит, надо будет делать reorg, а это в свою очередь места еще потребует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.07.2009, 13:32
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
blzzафаик это место не высвободит, надо будет делать reorg, а это в свою очередь места еще потребует. А при чем тут освобождение места? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.07.2009, 14:22
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
SQLMantis, данная опция установлена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.07.2009, 14:29
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
Спасибо огромное, ребята, за варианты. Начала пробовать. Удаляла раньше тоже кусками (по 1мнл. :) видимо, надо почаще :) ) Понравился вариант с top и вариант c rowcount. СПАСИБО!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.07.2009, 17:07
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
Да...... Все бы ничего... работает.... Но с той скоростью, с какой выполняется удаление 1000, удаление 150 млн. может занять... э.....полтора года! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.07.2009, 22:09
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
AnnaGLДа...... Все бы ничего... работает.... Но с той скоростью, с какой выполняется удаление 1000, удаление 150 млн. может занять... э.....полтора года! :) ну кто-то же должен расплачиваться за чьи-то ошибки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.07.2009, 09:31
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
komrad пишет: > ну кто-то же должен расплачиваться за чьи-то ошибки... Какие ошибки ? На VLDB -- это обычное дело, ничего страшного нет. Главное -- чтобы процессы поддержки базы шли незаметно для остальных пользователей. Тогда их можно запускать на постоянной основе, чтобы всегда работали. И всё. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.07.2009, 14:17
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
komrad, да уж, действительно,... но горько от всего этого ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.07.2009, 17:50
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
MasterZiv SQLMantis пишет: > Автор: "SQLMantis" > Ex_Soft, > Ммм, у меня 12.5.4 > Ну тогда курсором, примерно так Да просто можно set rowcount 1000 update Atable set A_STRING="" where .. А разве делать всякий раз большое количество запросов (в условиях статистики никак не связанной с реальными данными) быстрее чем просто пройтись по курсору? По моему опыту, курсор в таких задачах на порядок быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.07.2009, 19:00
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
SQLMantis пишет: > А разве делать всякий раз большое количество запросов (в условиях > статистики никак не связанной с реальными данными) быстрее чем просто > пройтись по курсору? > По моему опыту, курсор в таких задачах на порядок быстрее. Курсоры или не курсоры ? Задача любого UPDATE-а делится на 2 основные части: найти подлежащие изменению строки таблицы собственно произвести изменения (запись в таблицу, запись в лог и т.п.) Во второй части что с курсором, что без курсора -- разницы не будет. В первой части может быть разница, если курсор открывается один раз для всех нужных записей, а UPDATE делается в цикле с выставленным rowcount. Но если условие WHERE в UPDATE или курсоре отрабатывает по индексу, то хоть O(log N), хоть O(k*log N) -- не большая разница, если k много меньше N (к - количество порций изменения таблицы, N - количество строк в таблице). Так что курсор будет быстрее, только если условие в WHERE работает без индекса. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.07.2009, 19:59
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
MasterZiv SQLMantis пишет: > А разве делать всякий раз большое количество запросов (в условиях > статистики никак не связанной с реальными данными) быстрее чем просто > пройтись по курсору? > По моему опыту, курсор в таких задачах на порядок быстрее. Курсоры или не курсоры ? Задача любого UPDATE-а делится на 2 основные части: найти подлежащие изменению строки таблицы собственно произвести изменения (запись в таблицу, запись в лог и т.п.) Во второй части что с курсором, что без курсора -- разницы не будет. В первой части может быть разница, если курсор открывается один раз для всех нужных записей, а UPDATE делается в цикле с выставленным rowcount. Но если условие WHERE в UPDATE или курсоре отрабатывает по индексу, то хоть O(log N), хоть O(k*log N) -- не большая разница, если k много меньше N (к - количество порций изменения таблицы, N - количество строк в таблице). Так что курсор будет быстрее, только если условие в WHERE работает без индекса. Хм. Все это конечно верно, но какое отношение имеет к конкретному курсору? В случае с rowcount или top мы вынуждены всякий раз учитывать в запросе, кроме прямого условия A_FIELD=0, уже измененные строки с помощью A_STRING != "". Я же в курсор достаю PK (надеюсь :) ) и делаю update с учетом его и только. Что позволяет мне сделать один раз выборку только по A_FIELD=0. После чего пройтись по PK. Так быстрее, проверено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2009, 02:05
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
SQLMantis wrote: > Хм. Все это конечно верно, но какое отношение имеет к конкретному курсору? А какое отношение имеет конкретный курсор к обсуждаемой теме ? > В случае с rowcount или top мы вынуждены всякий раз учитывать в запросе, > кроме прямого условия A_FIELD=0, уже измененные строки с помощью > A_STRING != "". Вовсе не обязательно, если UPDATE-ом условие также устанавливается в обратное. > Я же в курсор достаю PK (надеюсь :) ) и делаю update с учетом его и только. Это не сильно помогат. > Что позволяет мне сделать один раз выборку только по A_FIELD=0. После > чего пройтись по PK. Так быстрее, проверено. Да не факт. Ты просто смотрел свой конкретный случай. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2009, 09:44
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
MasterZivТак что курсор будет быстрее, только если условие в WHERE работает без индекса. Это ключевой момент, но и он однозначно не говорит о возможных скоростях. Все зависит от селективности, но в поставленной задаче прозвучало: объем таблицы 150млн, условие по полю битового типа, селективность не указана. Значит, можно предположить по теории вероятности, что 50% записей имеет в A_FIELD=0, другая половина =1. Индексы хвататься не будут, значит перебор таблицы. В таком случае, один курсор будет однозначно быстрее, чем Х операций, включающих точно такой же перебор. Так что нужно смотреть на план апдейта, если он качественно не использует индекс, то значит нужно делать через один курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2009, 10:52
|
|||
|---|---|---|---|
Удаление данных в одном столбце |
|||
|
#18+
iLLer пишет: > прозвучало: объем таблицы 150млн, условие по полю битового типа, > селективность не указана. Значит, можно предположить по теории > вероятности, что 50% записей имеет в A_FIELD=0, другая половина =1. > Индексы хвататься не будут, значит перебор таблицы. В таком случае, один > курсор будет однозначно быстрее, чем Х операций, включающих точно такой > же перебор. Да, согласен. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&mobile=1&tid=2010968]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 392ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...