Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Пакетное удаление записей в БД / 10 сообщений из 10, страница 1 из 1
29.03.2013, 06:13
    #38203486
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
Имеются 3 таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE emp
(
  id bigint NOT NULL,
  type bigint NOT NULL
  CONSTRAINT pk_emp PRIMARY KEY (id)
);
CREATE TABLE contacts
(
  id bigserial NOT NULL,
  first_emp_id bigint NOT NULL,
  contact_type bigint NOT NULL,
  sec_emp_id bigint NOT NULL,
  CONSTRAINT pk_contacts PRIMARY KEY (id),
  CONSTRAINT fk_contacts2first_emp FOREIGN KEY (first_emp_id)
      REFERENCES emp (id),
  CONSTRAINT fk_contacts2sec_emp FOREIGN KEY (sec_emp_id)
      REFERENCES emp (id),
  CONSTRAINT uk_contacts UNIQUE (first_emp_id, contact_type, sec_emp_id)
);
CREATE TABLE tree
(
  id bigserial NOT NULL,
  root_id bigint NOT NULL,
  emp_id bigint NOT NULL,
  contact_id bigint NOT NULL,
  CONSTRAINT pk_tree PRIMARY KEY (id),
  CONSTRAINT fk_tree2root FOREIGN KEY (root_id)
      REFERENCES emp (id),
  CONSTRAINT fk_tree2contacts FOREIGN KEY (contact_id)
      REFERENCES contacts (id),
  CONSTRAINT fk_tree2emp FOREIGN KEY (emp_id)
      REFERENCES emp (id)
);


В таблице emp ~30k записей, в contacts ~60k, tree - ~20k-30k. Не ахти какие объемы, НО если мне надо очистить таблицы, то
Код: sql
1.
2.
3.
delete from tree;
delete from contacts;
delete from emp;


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

P.S. СУБД просто поставил, не меняя никаких настроек. Подключение осуществляется пользователем, являющимся владельцем схемы, в которой находятся таблицы.
...
Рейтинг: 0 / 0
29.03.2013, 07:48
    #38203523
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
Код: plsql
1.
truncate



Осторожно!
truncate сообщает лишь о ближайших таблицах в цепочке FK, а truncate cascade выносит всё начисто.
...
Рейтинг: 0 / 0
29.03.2013, 10:48
    #38203731
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
aleksandy,

создайте индексы на внешние ключи в зависимых таблицах contacts(first_emp_id),.. и т.д.

чтобы при удалении из главной таблицы, например delete from emp, ускорить проверки в зависимой таблице, select from contacts where first_emp_id = $1
...
Рейтинг: 0 / 0
29.03.2013, 12:03
    #38203902
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
LeXa NalBat,

а разве индекс на первичный ключ не создается автоматом?
...
Рейтинг: 0 / 0
29.03.2013, 12:07
    #38203919
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
aleksandyLeXa NalBat,

а разве индекс на первичный ключ не создается автоматом?да, на первичный создается. но на внешний - нет.
...
Рейтинг: 0 / 0
29.03.2013, 13:34
    #38204110
Гость_0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
А какие FK проверяются при удалении из tree? По моему никаких. Разве должно оно тормозить при таком порядке удаления?
...
Рейтинг: 0 / 0
29.03.2013, 13:45
    #38204152
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
Гость_0А какие FK проверяются при удалении из tree? По моему никаких.верно. на таблицу tree не ссылаются другие. но индексы нужны для ускорения удаления из emp и contacts.
...
Рейтинг: 0 / 0
29.03.2013, 14:16
    #38204249
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
Гость_0Разве должно оно тормозить при таком порядке удаления?да
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
rollback;

begin;

CREATE TABLE emp
(
  id bigint NOT NULL,
  type bigint NOT NULL,
  CONSTRAINT pk_emp PRIMARY KEY (id)
);

CREATE TABLE contacts
(
  id bigserial NOT NULL,
  first_emp_id bigint NOT NULL,
  contact_type bigint NOT NULL,
  sec_emp_id bigint NOT NULL,
  CONSTRAINT pk_contacts PRIMARY KEY (id),
  CONSTRAINT fk_contacts2first_emp FOREIGN KEY (first_emp_id)
      REFERENCES emp (id),
  CONSTRAINT fk_contacts2sec_emp FOREIGN KEY (sec_emp_id)
      REFERENCES emp (id),
  CONSTRAINT uk_contacts UNIQUE (first_emp_id, contact_type, sec_emp_id)
);
-- create index contacts_first_emp_id on contacts(first_emp_id);
-- create index contacts_sec_emp_id on contacts(sec_emp_id);

CREATE TABLE tree
(
  id bigserial NOT NULL,
  root_id bigint NOT NULL,
  emp_id bigint NOT NULL,
  contact_id bigint NOT NULL,
  CONSTRAINT pk_tree PRIMARY KEY (id),
  CONSTRAINT fk_tree2root FOREIGN KEY (root_id)
      REFERENCES emp (id),
  CONSTRAINT fk_tree2contacts FOREIGN KEY (contact_id)
      REFERENCES contacts (id),
  CONSTRAINT fk_tree2emp FOREIGN KEY (emp_id)
      REFERENCES emp (id)
);
-- create index tree_root_id on tree(root_id);
-- create index tree_contact_id on tree(contact_id);
-- create index tree_emp_id on tree(emp_id);

insert into emp select gs, gs/1000 from generate_series(1,10000) as gs(gs);
insert into contacts (first_emp_id, contact_type, sec_emp_id) select id, type, id from emp;
insert into tree (root_id, emp_id, contact_id) select first_emp_id, sec_emp_id, id from contacts;

delete from tree;
delete from contacts;
delete from emp;

ROLLBACK
Time: 11,937 ms
BEGIN
Time: 0,300 ms
CREATE TABLE
Time: 5,633 ms
CREATE TABLE
Time: 13,021 ms
CREATE TABLE
Time: 12,677 ms
INSERT 0 10000
Time: 49,189 ms
INSERT 0 10000
Time: 563,216 ms
INSERT 0 10000
Time: 766,535 ms
DELETE 10000
Time: 8,382 ms
DELETE 10000
Time: 3702,609 ms
DELETE 10000
Time: 11533,378 ms

ROLLBACK
Time: 11,572 ms
BEGIN
Time: 0,324 ms
CREATE TABLE
Time: 6,916 ms
CREATE TABLE
Time: 21,798 ms
CREATE INDEX
Time: 10,868 ms
CREATE INDEX
Time: 6,346 ms
CREATE TABLE
Time: 12,698 ms
CREATE INDEX
Time: 3,471 ms
CREATE INDEX
Time: 4,121 ms
CREATE INDEX
Time: 4,237 ms
INSERT 0 10000
Time: 48,167 ms
INSERT 0 10000
Time: 617,167 ms
INSERT 0 10000
Time: 1018,074 ms
DELETE 10000
Time: 32,012 ms
DELETE 10000
Time: 389,450 ms
DELETE 10000
Time: 1469,689 ms
...
Рейтинг: 0 / 0
29.03.2013, 15:37
    #38204449
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
LeXa NalBat, аа, точно, данные же всё равно там, версионность. Спасибо :)
...
Рейтинг: 0 / 0
29.03.2013, 22:38
    #38205111
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пакетное удаление записей в БД
LeXa NalBat,

спасибо большое, помогло.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Пакетное удаление записей в БД / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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