Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

увеличение скорости удаления данных


alsov ©   (2006-12-19 09:58:00) 

Приветствую, Мастера

Помогите пожалуйста увеличить скорость уделения данных из таблиц.

Есть примерно такие 2 таблицы


CREATE TABLE m_user (
 user_id NUMBER(10) NOT NULL PRIMARY KEY,
 start_date DATE NULL,
 finish_date DATE NULL
)
/

CREATE TABLE m_user_value (
 user_id NUMBER(10) NOT NULL,
 param_id NUMBER(10) NOT NULL,
 param_value number NOT NULL
)
/

ALTER TABLE m_user_value
 ADD CONSTRAINT pk_m_user_value PRIMARY KEY (
   param_id,
   user_id
 )
/  

ALTER TABLE m_user_value
 ADD CONSTRAINT FK_m_user_value_m_user FOREIGN KEY (user_id)
 REFERENCES m_user (user_id)
/


В таблице m_user около 2 миллионов записей, в m_user_value около 4-х.

Нужно удалить из них данные, при которых удалиться около половины записей m_user и соответственно их значений из m_user_value.

Делаю так

DELETE
 FROM m_user_value
WHERE user_id IN (SELECT user_id FROM m_user WHERE start_date > To_Date('01012001', 'ddmmyyyy'));

DELETE
 FROM m_user
WHERE start_date > To_Date('01012001', 'ddmmyyyy');


При этом запросы выполняются около 4-х часов (пень4 2,4 + гектар оперативы ора10g).

Возможно ли как-либо ускорить этот процесс? Индексы например поотключать или еще чего.


alsov   (2006-12-19 12:32:00) [1]

всем спасибо


alsov   (2006-12-19 12:30:00) [2]

сделал так
есть возможность сделать флаг пометки на удаление и удалять по нему
в результате получилось

DELETE
FROM m_user_value
WHERE flag='1';

DELETE
FROM m_user
WHERE flag='1';


alsov   (2006-12-19 11:20:00) [3]


> Если такое часто приходится делать, то имеет смысл секционировать
> таблицу PARTITION BY RANGE( start_date ).


Делается не часто.


> create table tmp as select * from  m_user where...;truncate
> table m_user;insert into m_user (select * from tmp);drop
> table tmp;скорректировать с учетом constraint m_user_value


Попробую


Desdechado   (2006-12-19 10:46:00) [4]

Если такое часто приходится делать, то имеет смысл секционировать таблицу PARTITION BY RANGE( start_date ).
Секции удаляются быстрее в разы.


Кщд   (2006-12-19 10:15:00) [5]

alsov ©   (19.12.06 10:09) [2]

нечто типа:
alter table m_user_value
 add constraint FK_m_user_value_m_user foreign key (user_id)
 references m_user(user_id) on delete cascade


Кщд   (2006-12-19 10:12:00) [6]

при таких %%-ом содержании удаляемых и нечастой необходимости операции
create table tmp as select * from  m_user where...;
truncate table m_user;
insert into m_user (select * from tmp);
drop table tmp;

скорректировать с учетом constraint m_user_value


alsov   (2006-12-19 10:09:00) [7]


> Я бы попробовал наложить на свяску директиву On Delete Cascade

А это как? Вы имеете в виду в констрейне?


Ega23   (2006-12-19 10:00:00) [8]

Я бы попробовал наложить на свяску директиву On Delete Cascade
Ну и индексы поотключать - тоже можно попробовать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо