Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение Индексов / 15 сообщений из 15, страница 1 из 1
18.02.2008, 18:51
    #35140018
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Несоклько раз слышал понятие
"отключение индексов и тригеров в таблице"
Вопрос: как?
На форуме поиском не нашел, в документации пока тоже. PostgreSQL 8.2.
Как временно отключить индексы в таблице (чтобы забить в нее кучу данных через INSERT), а потом вернуть их на место, кроме как удалить их и потом создать заново?
...
Рейтинг: 0 / 0
18.02.2008, 19:56
    #35140127
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Удалить и создать заново.
...
Рейтинг: 0 / 0
19.02.2008, 09:41
    #35140638
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Вообще такая фишка есть в некоторых СУБД. Индексы и констрейнты в них можно отключать и включать. Потом они конечно должны быть перестроены если данные в индексированных полях менялись (перестроение делается автоматически на уровне движка базы).
Почему бы и в PostgreSQL такую штуку не сделать?
...
Рейтинг: 0 / 0
19.02.2008, 10:11
    #35140707
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
AndronВообще такая фишка есть в некоторых СУБД. Индексы и констрейнты в них можно отключать и включать. Потом они конечно должны быть перестроены если данные в индексированных полях менялись (перестроение делается автоматически на уровне движка базы).
Почему бы и в PostgreSQL такую штуку не сделать?

Так сделайте :) вышлите патч команде пг, если это будет востребовано, то думаю его включать в основную ветку.
...
Рейтинг: 0 / 0
19.02.2008, 12:42
    #35141228
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Кстати каким образом принимается решение о добавлении той или иной возможности в PostgreSQL ?
...
Рейтинг: 0 / 0
19.02.2008, 13:10
    #35141312
Zashibis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Таки придется просто удалять? Жаль, хотелось отключать автоматически перед заливкой данных в таблицу (более 1000 таблиц), придется писать умный код, который определяет все параметры индексов, удаляет их и потом восстанавливает.
...
Рейтинг: 0 / 0
20.02.2008, 08:53
    #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
Период между сообщениями больше года.
20.11.2019, 13:07
    #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
20.11.2019, 14:32
    #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
20.11.2019, 15:23
    #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
20.11.2019, 18:02
    #39891915
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение Индексов
Синий Слон

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

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


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


Во время вставки-обновления сразу.
...
Рейтинг: 0 / 0
20.11.2019, 19:47
    #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
21.11.2019, 10:50
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение Индексов / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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