Форум: "Базы";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Внизувеличение скорости удаления данных Найти похожие ветки
← →
alsov © (2006-12-19 09:58) [0]Приветствую, Мастера
Помогите пожалуйста увеличить скорость уделения данных из таблиц.
Есть примерно такие 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).
Возможно ли как-либо ускорить этот процесс? Индексы например поотключать или еще чего.
← →
Ega23 © (2006-12-19 10:00) [1]Я бы попробовал наложить на свяску директиву On Delete Cascade
Ну и индексы поотключать - тоже можно попробовать.
← →
alsov © (2006-12-19 10:09) [2]
> Я бы попробовал наложить на свяску директиву On Delete Cascade
А это как? Вы имеете в виду в констрейне?
← →
Кщд © (2006-12-19 10:12) [3]при таких %%-ом содержании удаляемых и нечастой необходимости операции
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
← →
Кщд © (2006-12-19 10:15) [4]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
← →
Desdechado © (2006-12-19 10:46) [5]Если такое часто приходится делать, то имеет смысл секционировать таблицу PARTITION BY RANGE( start_date ).
Секции удаляются быстрее в разы.
← →
alsov © (2006-12-19 11:20) [6]
> Если такое часто приходится делать, то имеет смысл секционировать
> таблицу 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
Попробую
← →
alsov © (2006-12-19 12:30) [7]сделал так
есть возможность сделать флаг пометки на удаление и удалять по нему
в результате получилось
DELETE
FROM m_user_value
WHERE flag="1";
DELETE
FROM m_user
WHERE flag="1";
← →
alsov © (2006-12-19 12:32) [8]всем спасибо
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.105 c