Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Удаление данных в одном столбце / 23 сообщений из 23, страница 1 из 1
10.07.2009, 15:18
    #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
10.07.2009, 17:36
    #36084862
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление данных в одном столбце
AnnaGL,

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

покажите
Код: plaintext
exec sp_help ATable
...
Рейтинг: 0 / 0
10.07.2009, 18:11
    #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
10.07.2009, 19:03
    #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
10.07.2009, 19:16
    #36085022
SQLMantis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление данных в одном столбце
AnnaGL,
Да, еще один момент.
Если на базе в которой выполняется данная операция не стоит опция 'trunc log on chkpt' (обрезание логов транзакции по checkpoint), то есть логи копятся, то нужно в цикле после update делать dump transaction.
...
Рейтинг: 0 / 0
10.07.2009, 19:34
    #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
10.07.2009, 20:36
    #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
10.07.2009, 22:48
    #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
11.07.2009, 18:48
    #36085560
blzz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление данных в одном столбце
афаик это место не высвободит,
надо будет делать reorg, а это в свою очередь места еще потребует.
...
Рейтинг: 0 / 0
13.07.2009, 13:32
    #36086776
SQLMantis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление данных в одном столбце
blzzафаик это место не высвободит,
надо будет делать reorg, а это в свою очередь места еще потребует.

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

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

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

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

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

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

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

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

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


А разве делать всякий раз большое количество запросов (в условиях статистики никак не связанной с реальными данными) быстрее чем просто пройтись по курсору?
По моему опыту, курсор в таких задачах на порядок быстрее.
...
Рейтинг: 0 / 0
20.07.2009, 19:00
    #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
20.07.2009, 19:59
    #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
21.07.2009, 02:05
    #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
21.07.2009, 09:44
    #36099967
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление данных в одном столбце
MasterZivТак что курсор будет быстрее, только если условие
в WHERE работает без индекса.


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

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

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


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