powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Пакетное удаление записей в БД
10 сообщений из 10, страница 1 из 1
Пакетное удаление записей в БД
    #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
Пакетное удаление записей в БД
    #38203523
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
truncate



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

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

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

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

а разве индекс на первичный ключ не создается автоматом?да, на первичный создается. но на внешний - нет.
...
Рейтинг: 0 / 0
Пакетное удаление записей в БД
    #38204110
Гость_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какие FK проверяются при удалении из tree? По моему никаких. Разве должно оно тормозить при таком порядке удаления?
...
Рейтинг: 0 / 0
Пакетное удаление записей в БД
    #38204152
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость_0А какие FK проверяются при удалении из tree? По моему никаких.верно. на таблицу tree не ссылаются другие. но индексы нужны для ускорения удаления из emp и contacts.
...
Рейтинг: 0 / 0
Пакетное удаление записей в БД
    #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
Пакетное удаление записей в БД
    #38204449
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat, аа, точно, данные же всё равно там, версионность. Спасибо :)
...
Рейтинг: 0 / 0
Пакетное удаление записей в БД
    #38205111
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

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


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