powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Удаление данных в одном столбце
23 сообщений из 23, страница 1 из 1
Удаление данных в одном столбце
    #36084569
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

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 удалены. Может есть какие-то хитрые приемы для таких случаев?
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36084862
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnaGL,

по A_FIELD есть индекс?
кол-во записей с 0 по отношению к общему кол-ву какое?

покажите
Код: plaintext
exec sp_help ATable
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36084931
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085000
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnaGL,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @i int
select @i =  1 
while(@i >  0 )
begin
  update top  1000  Atable set A_STRING="" where A_FIELD= 0  and A_STRING != ""
  select @i = @@rowcount
end
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085022
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnaGL,
Да, еще один момент.
Если на базе в которой выполняется данная операция не стоит опция 'trunc log on chkpt' (обрезание логов транзакции по checkpoint), то есть логи копятся, то нужно в цикле после update делать dump transaction.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085048
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLMantis
Код: plaintext
1.
top

Один из моих 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
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085127
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
declare MyCur cursor for select  AKey from Atable where A_FIELD= 0 
go

declare @AKey numeric( 10 )
declare @i int
select @i =  0 
open MyCur
fetch MyCur into @AKey
begin tran
while (@@sqlstatus= 0 )
begin
  if (@i >=  1000 )
  begin
    select @i =  0 
    commit tran
  end
  update Atable set A_STRING="" where AKey=@AKey
  fetch MyCur into @AKey
end
commit tran
close MyCur
deallocate cursor MyCur
go
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085236
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLMantis пишет:
> Автор: "SQLMantis"
> Ex_Soft,
> Ммм, у меня 12.5.4
> Ну тогда курсором, примерно так

Да просто можно

set rowcount 1000
update Atable set A_STRING="" where ..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36085560
blzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
афаик это место не высвободит,
надо будет делать reorg, а это в свою очередь места еще потребует.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36086776
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blzzафаик это место не высвободит,
надо будет делать reorg, а это в свою очередь места еще потребует.

А при чем тут освобождение места?
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36086919
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLMantis,

данная опция установлена.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36086940
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное, ребята, за варианты. Начала пробовать.
Удаляла раньше тоже кусками (по 1мнл. :) видимо, надо почаще :) )
Понравился вариант с top и вариант c rowcount.

СПАСИБО!!!
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36087395
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да...... Все бы ничего... работает....
Но с той скоростью, с какой выполняется удаление 1000, удаление 150 млн. может занять... э.....полтора года! :)
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36087781
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnaGLДа...... Все бы ничего... работает....
Но с той скоростью, с какой выполняется удаление 1000, удаление 150 млн. может занять... э.....полтора года! :)

ну кто-то же должен расплачиваться за чьи-то ошибки...
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36088161
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad пишет:

> ну кто-то же должен расплачиваться за чьи-то ошибки...

Какие ошибки ? На VLDB -- это обычное дело, ничего страшного нет.
Главное -- чтобы процессы поддержки базы шли незаметно для остальных
пользователей. Тогда их можно запускать на постоянной основе,
чтобы всегда работали. И всё.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36091227
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad,

да уж, действительно,...
но горько от всего этого )
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36099246
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
SQLMantis пишет:
> Автор: "SQLMantis"
> Ex_Soft,
> Ммм, у меня 12.5.4
> Ну тогда курсором, примерно так

Да просто можно

set rowcount 1000
update Atable set A_STRING="" where ..


А разве делать всякий раз большое количество запросов (в условиях статистики никак не связанной с реальными данными) быстрее чем просто пройтись по курсору?
По моему опыту, курсор в таких задачах на порядок быстрее.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36099382
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36099465
SQLMantis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Так быстрее, проверено.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36099755
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLMantis wrote:

> Хм. Все это конечно верно, но какое отношение имеет к конкретному курсору?

А какое отношение имеет конкретный курсор к обсуждаемой теме ?

> В случае с rowcount или top мы вынуждены всякий раз учитывать в запросе,
> кроме прямого условия A_FIELD=0, уже измененные строки с помощью
> A_STRING != "".

Вовсе не обязательно, если UPDATE-ом условие также устанавливается в обратное.

> Я же в курсор достаю PK (надеюсь :) ) и делаю update с учетом его и только.

Это не сильно помогат.

> Что позволяет мне сделать один раз выборку только по A_FIELD=0. После
> чего пройтись по PK. Так быстрее, проверено.

Да не факт. Ты просто смотрел свой конкретный случай.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36099967
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак что курсор будет быстрее, только если условие
в WHERE работает без индекса.


Это ключевой момент, но и он однозначно не говорит о возможных скоростях. Все зависит от селективности, но в поставленной задаче прозвучало: объем таблицы 150млн, условие по полю битового типа, селективность не указана. Значит, можно предположить по теории вероятности, что 50% записей имеет в A_FIELD=0, другая половина =1. Индексы хвататься не будут, значит перебор таблицы. В таком случае, один курсор будет однозначно быстрее, чем Х операций, включающих точно такой же перебор.
Так что нужно смотреть на план апдейта, если он качественно не использует индекс, то значит нужно делать через один курсор.
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36100147
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer пишет:
> прозвучало: объем таблицы 150млн, условие по полю битового типа,
> селективность не указана. Значит, можно предположить по теории
> вероятности, что 50% записей имеет в A_FIELD=0, другая половина =1.
> Индексы хвататься не будут, значит перебор таблицы. В таком случае, один
> курсор будет однозначно быстрее, чем Х операций, включающих точно такой
> же перебор.

Да, согласен.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Удаление данных в одном столбце
    #36105165
AnnaGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Удаляю я в итоге через процедуру с курсором. время обработки сократилось до 64 дней! cool!
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Удаление данных в одном столбце
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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