powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение Индексов
15 сообщений из 15, страница 1 из 1
Отключение Индексов
    #35140018
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несоклько раз слышал понятие
"отключение индексов и тригеров в таблице"
Вопрос: как?
На форуме поиском не нашел, в документации пока тоже. PostgreSQL 8.2.
Как временно отключить индексы в таблице (чтобы забить в нее кучу данных через INSERT), а потом вернуть их на место, кроме как удалить их и потом создать заново?
...
Рейтинг: 0 / 0
Отключение Индексов
    #35140127
Nick Gazaloff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалить и создать заново.
...
Рейтинг: 0 / 0
Отключение Индексов
    #35140638
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще такая фишка есть в некоторых СУБД. Индексы и констрейнты в них можно отключать и включать. Потом они конечно должны быть перестроены если данные в индексированных полях менялись (перестроение делается автоматически на уровне движка базы).
Почему бы и в PostgreSQL такую штуку не сделать?
...
Рейтинг: 0 / 0
Отключение Индексов
    #35140707
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronВообще такая фишка есть в некоторых СУБД. Индексы и констрейнты в них можно отключать и включать. Потом они конечно должны быть перестроены если данные в индексированных полях менялись (перестроение делается автоматически на уровне движка базы).
Почему бы и в PostgreSQL такую штуку не сделать?

Так сделайте :) вышлите патч команде пг, если это будет востребовано, то думаю его включать в основную ветку.
...
Рейтинг: 0 / 0
Отключение Индексов
    #35141228
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати каким образом принимается решение о добавлении той или иной возможности в PostgreSQL ?
...
Рейтинг: 0 / 0
Отключение Индексов
    #35141312
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки придется просто удалять? Жаль, хотелось отключать автоматически перед заливкой данных в таблицу (более 1000 таблиц), придется писать умный код, который определяет все параметры индексов, удаляет их и потом восстанавливает.
...
Рейтинг: 0 / 0
Отключение Индексов
    #35143135
StanSG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZashibisТаки придется просто удалять? Жаль, хотелось отключать автоматически перед заливкой данных в таблицу (более 1000 таблиц), придется писать умный код, который определяет все параметры индексов, удаляет их и потом восстанавливает.
Типа так (Pg8.3)
Код: plaintext
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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
create or replace function drop_constraints(_table text) returns text[] language plpgsql as $BODY$
declare
  _rec record;
  _ddl text[];
begin
  for _rec in (
    select con.conname as name,
      'ALTER TABLE ' || _table || ' ADD CONSTRAINT ' || con.conname || ' '
      || pg_get_constraintdef(con.oid) as ddl
    from pg_constraint con
    where con.conrelid=_table::regclass
  ) loop
    _ddl := _ddl || _rec.ddl;
    raise info 'DROP CONSTRAINT %', _rec.name;
    execute('ALTER TABLE ' || _table || ' DROP CONSTRAINT ' || _rec.name);
  end loop;
  return _ddl;
end;
$BODY$;

create or replace function drop_indices(_table text) returns text[] language plpgsql as $BODY$
declare
  _rec record;
  _ddl text[];
begin
  for _rec in (
    select c.relname as name, pg_get_indexdef(i.indexrelid) as ddl
    from pg_index i
      join pg_class c on c.oid=i.indexrelid
    where i.indrelid=_table::regclass
      --excluding pk and unique constraints
      and not exists(select * from pg_depend where objid=i.indexrelid and deptype='i')
  ) loop
    _ddl := _ddl || _rec.ddl;
    raise info 'DROP INDEX %', _rec.name;
    execute('DROP INDEX ' || _rec.name);
  end loop;
  return _ddl;
end;
$BODY$;

create or replace function execute_ddl(_ddl text[]) returns void language plpgsql as $BODY$
declare
  _i int;
begin
  for _i in  1 ..array_upper(_ddl, 1 ) loop
    raise info '%', _ddl[_i];
    execute _ddl[_i];
  end loop;
  return;
end;
$BODY$;

----------------------------------------пример
drop table if exists mytable;
create table mytable (a int primary key, b text unique, c text);
create index mytable_c on mytable(c text_pattern_ops) where c like '8%';

create or replace function update_mytable1() returns void language plpgsql as $BODY$
begin
  insert into mytable select i, i::text, i::text from generate_series( 1 , 1000000 ) as s(i);
end;
$BODY$;

create or replace function update_mytable2() returns void language plpgsql as $BODY$
declare
  _ddl text[];
begin
  _ddl := drop_constraints('mytable') || drop_indices('mytable');
  perform update_mytable1();
  perform execute_ddl(_ddl);
end;
$BODY$;

select update_mytable1(); --1m22s
truncate table mytable;
vacuum full mytable;
select update_mytable2(); --0m36s
\d mytable
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Отключение Индексов
    #39891609
Monocle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отключение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = false
  where indexrelid = 'index_name'::regclass;



Включение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = true 
  where indexrelid = 'index_name'::regclass;
...
Рейтинг: 0 / 0
Отключение Индексов
    #39891686
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monocle
Отключение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = false
  where indexrelid = 'index_name'::regclass;



Включение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = true 
  where indexrelid = 'index_name'::regclass;



всегда было интересно услышать мнение разработчиков или приближенных к ним, - насколько данный метод безопасен.
Руки иногда чешутся в продакшн такое сделать. Но осторожность всегда берёт верх
...
Рейтинг: 0 / 0
Отключение Индексов
    #39891751
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gav21
Monocle
Отключение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = false
  where indexrelid = 'index_name'::regclass;



Включение индекса:
Код: sql
1.
2.
3.
 update pg_index 
    set indisvalid = true 
  where indexrelid = 'index_name'::regclass;



всегда было интересно услышать мнение разработчиков или приближенных к ним, - насколько данный метод безопасен.
Руки иногда чешутся в продакшн такое сделать. Но осторожность всегда берёт верх


Могу ошибаться, но вроде когда индекс инвалидный, он перестает обновляться.

И после временного отключения требуется обязательная перестройка индекса.
...
Рейтинг: 0 / 0
Отключение Индексов
    #39891915
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий Слон

Могу ошибаться, но вроде когда индекс инвалидный, он перестает обновляться.

И после временного отключения требуется обязательная перестройка индекса.


Он перестает ИСПОЛЬЗОВАТЬСЯ для запросов но не обновляться.
Так что выигрыша при insert от этого не получится а вот протестировать нужен ли индекс для чего то вообще и не ломается ли чего от его отсутствия - можно.
...
Рейтинг: 0 / 0
Отключение Индексов
    #39891995
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А когда индекс начинает перестраиваться\обновляться, после завершения транзакции (commit) или уже во время вставки?
...
Рейтинг: 0 / 0
Отключение Индексов
    #39892008
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya
А когда индекс начинает перестраиваться\обновляться, после завершения транзакции (commit) или уже во время вставки?


Во время вставки-обновления сразу.
...
Рейтинг: 0 / 0
Отключение Индексов
    #39892023
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синий Слон
Могу ошибаться, но вроде когда индекс инвалидный, он перестает обновляться.

Это смотря какой именно из флагов сбрасывать, их несколько немного различающихся. indisvalid требует чтобы писатели индекс уже обновляли, но запросы не могли использовать для чтения.

gav21
всегда было интересно услышать мнение разработчиков или приближенных к ним, - насколько данный метод безопасен.

Любые прямые изменения системного каталога - только на свой риск, это не поддерживаемая операция и любые последующие фейерверки не являются багом и исправлению не подлежат. Уже поэтому не безопасен, только потому что это прямая модификация системного каталога.
Хотел сослаться на письмо Тома, но не смог его найти.

Проверять надо здесь:
https://github.com/postgres/postgres/blob/REL_12_STABLE/src/backend/commands/indexcmds.c#L1362
Всё ли из того что делает create index concurrently начиная с фазы 3 (или даже с конца фазы два, найдите вызов index_set_state_flags с INDEX_CREATE_SET_READY) будет актуально для ручных манипуляций. Совсем криминала вроде как нет, если индекс был valid - значит validate_index полезного ничего найти не должен. Cache invalidation на индекс при update pg_index уйти должен, а вот инвалидации на табличку - нет, так что комментарий актуальным будет "existing sessions might fail to use the new index"
...
Рейтинг: 0 / 0
Отключение Индексов
    #39892227
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Melkij#22021245]
Синий Слон

Проверять надо здесь:
https://github.com/postgres/postgres/blob/REL_12_STABLE/src/backend/commands/indexcmds.c#L1362
Всё ли из того что делает create index concurrently начиная с фазы 3 (или даже с конца фазы два, найдите вызов index_set_state_flags с INDEX_CREATE_SET_READY) будет актуально для ручных манипуляций. Совсем криминала вроде как нет, если индекс был valid - значит validate_index полезного ничего найти не должен. Cache invalidation на индекс при update pg_index уйти должен, а вот инвалидации на табличку - нет, так что комментарий актуальным будет "existing sessions might fail to use the new index"


Спасибо за разъяснение. Подожду когда появится alter index ix_name set disable из коробки :D
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение Индексов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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