powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Index VS Constraint+Implicit Index
14 сообщений из 14, страница 1 из 1
Index VS Constraint+Implicit Index
    #38945470
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа!
Поясните, какие плюсы и минусы использования констрэйнтов с порождением неявных индексов и просто индексов вместо констрэйнтов (типа первичного ключа, алтернативного ключа, внешнего ключа).
И ещё. При использовании констрэйнтов упорно валятся нотисы о создании неявных индексов.
Как можно понизить статус этих сообщений с нотисов до дебага? В доке об этом упоминается, но без примеров. Не смог разобраться...
Хееелп!
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945499
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShiraГоспода!
Поясните, какие плюсы и минусы использования констрэйнтов с порождением неявных индексов и просто индексов вместо констрэйнтов (типа первичного ключа, алтернативного ключа, внешнего ключа).
И ещё. При использовании констрэйнтов упорно валятся нотисы о создании неявных индексов.
Как можно понизить статус этих сообщений с нотисов до дебага? В доке об этом упоминается, но без примеров. Не смог разобраться...
Хееелп!

1)плюсы понятны - структура базы становится более понятной а не кашей непонятно зачем созданных индексов

2)"Как можно понизить статус этих сообщений с нотисов до дебага" - никак да и не надо. Если чем то они мешают вам - понизьте уровень client_min_messages до warning.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945508
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShiraПоясните, какие плюсы и минусы использования констрэйнтов с порождением неявных индексов и просто индексов вместо констрэйнтов (типа первичного ключа, алтернативного ключа, внешнего ключа).


Физически и логически никаких ровным счётом. Что уникальный индекс, что первичный ключ -- поведение будет одинаково.
Но тем не менее нужно где только можно использовать констрейнты, когда нужно обеспечить ключ или уникальность полей.
Есть маленькая разница в констрейнте и индексе. Индексы созаются исключительно для оптимизации выборок и сортировок/группировок. Констрейнты -- для обеспечения целостности данных.
Видя вашу правильно сделанную схему таблицы, другой программист легче поймёт, где у вас PK или альтернативные ключи, а где у вас индексы, и ему будет удобнее.

Представь себе табилицу без PK и UN, но со, скажем, 10 индексами, три из которых уникальны -- вполне реальный вариант в жизни.
Как работать с этой таблицей ? Где у неё PK, а где просто индексы ? И, допустим, надо оптимизировать таблицу, убирать ненужные индексы. Подразумеваемый PK таблицы при редких изменениях будет вполне вероятно достаточно редко использоваться, но тем не менее, его удалять нельзя, просто потому что это -- PK.

Так что рекомендация такая:
Первичный ключ таблицы должен быть создан как primary key constraint (напомню, что каждая таблицы должна иметь PK).

Альтернативные ключи таблицы должны быть созданы как unique constraints. Они как правило имеют своё значение в предметной области приложения. Например, ИНН человека должен быть создан как unique constraint.

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

Индексы, создаваемые для ускорения, могут оказаться уникальными случайно, по построению. Например, если в индекс уже входят все поля из уникального констрейнта или PK. Либо в приложении по построению теоретически не может быть неуникальных значений, но
жёсткой гарантии нет. В таких случаях индекс следует создавать именно как индекс, а не как unique constraint, по той же причине.

ShiraИ ещё. При использовании констрэйнтов упорно валятся нотисы о создании неявных индексов.
Как можно понизить статус этих сообщений с нотисов до дебага? В доке об этом упоминается, но без примеров. Не смог разобраться...


Да плюнь просто на них... Ну или там grep|sed|awk.
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945537
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

в хотелках всё хорошо
но есть хотелки другого плана: -- "REINDEX CONCURRENTLY" ещё не освоен писателями пж , а пользователи--буратинки всё за мерде бьются.


т.ч. вопрос скорее к максиму -- он же делает реиндексы в своём комперссоре. наверное -- и индексы pk и именованных констрейнтов. вопрос --как это проворачивать с минимальными локами ?

т.е. вот есть пк, и он даже, как пк, используется приложением (например лондайстом или иным читателем системников) -- и не хотелось бы его, читателя, обламывать , но и хочется к примеру его подменить быстро -- вновь созданным, компактным.
(т.е. в системных, по мере возможности, индекс помеченный как пк должен быть "всегда" (когда их читают другие), а лок должен быть как можно дешевле)
что делать ?
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945601
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqMasterZiv,

в хотелках всё хорошо
но есть хотелки другого плана: -- "REINDEX CONCURRENTLY" ещё не освоен писателями пж , а пользователи--буратинки всё за мерде бьются.


т.ч. вопрос скорее к максиму -- он же делает реиндексы в своём комперссоре. наверное -- и индексы pk и именованных констрейнтов. вопрос --как это проворачивать с минимальными локами ?

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

Никакой особо секретной магии нет.
Производится операция вида
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE INDEX CONCURRENTLY ...
BEGIN; 
    SET LOCAL statement_timeout TO something;
    ALTER TABLE sometable DROP CONSTRAINT somename;
    ALTER TABLE sometable ADD CONSTRAINT ... USING INDEX ...;
END;



Сама по себе подмена если нет мешающих транзакций фактически мнгновенная.
Далее если обломились по timeout - повторить. Если обломились N раз - ну значит не получилось на этот раз.
Т.е. некий компромисс так чтобы и локов поменьше/покороче сделать (и не уронить проект в процессе) и с максимальными шансами перестроить индекс.
Если приложение написано так что постоянно висит много открытых длинных транзакций с участием sometable - индекс перестроить не получится.

И да просто unique index подменяется без локов через create index CONCURRENTLY / drop index CONCURRENTLY, так что да местами если таблица пухнет и ее хронически приходится сжимать и при этом на ней постоянно долгие транзакции висят я заменяю на ней pk/uniq constraint на соответсвующие просто индексы. Но я знаю что я делаю, зачем и почему и использую эту возможность весьма локально.

PS: в разработке версия которая по отдельному ключу будет решать эту проблему как сделано в pg_reorg (автоматически отстреливая все мешающие транзакции), но пока это не готово.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945667
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

спасибо
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945836
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, спасибо за развернутый ответ на первый вопрос!
Хочу по нему резюмировать - единственный плюс констрэйнтов - лаконичность, и, как следствие, лучшая читаемость схемы. По производительности ни каких плюсов-минусов ни у констрэйнтов, ни у индексов нет.
Так?

Что до второго вопроса...
Хрен плюнешь. :((
Я создаю некий аналог ER-Winа или скорее PowerDesignerа, но для расширенной ER-нотации.
То есть вместо просто "сущностей" я ввожу гораздо более тонкую градацию - статические справочники, объекты учёта, события, периоды и т.д. Да ещё и с типизацией по иерархичности, историчности, способов фискаления и т.д. Соответственно и связи обладают целым набором нетрадиционных (для ER-нотации) свойств. Пока что я не могу программно запретить или откорректировать все возникающие при проектировании противоречия. И выкатываю нотисы на предмет этих противоречий.
Мне важно, чтоб МОИ нотисы не затерялись в мутном потоке системных нотисов о всяких имплицитных действиях сервера.
К сожалению ни Вы, ни коллега Maxim Boguk не дали пример использования тех средств понижения уровня системных нотисов, о которых упомянули.
А Maxim Boguk кроме того предложил не понизить уровень до дебага, а повысить до варнинга.
Но главное - не привёл пример КАК.
Я, к сожалению, novice to Постгре и администрении СУБД вообще, хотя в проектировании схем БД съел целую стаю собак :)), и многие вещи, которые более опытным коллегам вполне очевидны, мне невдомёк.
Пожалуйста, снизойдите и поясните на пальцах (на примере).
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945935
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
Код: sql
1.
SET LOCAL statement_timeout TO something;



там еще бывает вакуум в параллели. чтобы его "килять" и не висеть на нем
deadlock_timeout
http://www.postgresql.org/docs/9.4/static/runtime-config-locks.html

можно
Код: sql
1.
set local deadlock_timeout = 10


так как обычно он выставлен в секунды
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38945944
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivShiraПоясните, какие плюсы и минусы использования констрэйнтов с порождением неявных индексов и просто индексов вместо констрэйнтов (типа первичного ключа, алтернативного ключа, внешнего ключа).


Физически и логически никаких ровным счётом. Что уникальный индекс, что первичный ключ -- поведение будет одинаково.

В уник индексе null бывает. Опять же функциональные PK не бывают, а индекса - да.
Еще есть проверка записей по FK в связанной таблице, с индексами - изврат получится в реализации.
Опять же пардон индексы разные бывают - и gist - и gin и битмап.
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38946037
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shira,

А взять и почитать доку/google по слову client_min_messages совсем не судьба?
Ок сделаю за вас.
Два варианта:
1)после коннекта к базе сделать
Код: plsql
1.
set client_min_messages to warning;


или
2)прописать в конфиге базы client_min_messages=warning


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38946149
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А взять и почитать доку/google по слову client_min_messages совсем не судьба?

Я же с самого начала написал, что прочитал, но не понял.

>Два варианта:
>1)после коннекта к базе сделать
>set client_min_messages to warning;
>или
>2)прописать в конфиге базы client_min_messages=warning

Я так понял, что оба варианта подавят выдачу ВСЕХ нотисов - и системных, и моих.

Уточню свой вопрос:
Как подавить выдачу системных нотисов о создании сиквенсов (по serial-полям) и неявных индексов по первичным ключам?
Это необходимо для того, чтоб аналитик не высматривал содержательные нотисы в огромном потоке этих.
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38946156
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shira,

Ответ - никак от слова совсем кроме пересборки своей версии PostgreSQL из исходников.
Из этого можно сделать вывод что у вас подход не верный.

1)используйте warning вместо Notice
или
2)фильтруйте системные Notice на клиенте


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38946518
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShiraMasterZiv, спасибо за развернутый ответ на первый вопрос!
Хочу по нему резюмировать - единственный плюс констрэйнтов - лаконичность, и, как следствие, лучшая читаемость схемы. По производительности ни каких плюсов-минусов ни у констрэйнтов, ни у индексов нет.
Так?



да.
Исключая check constraint, конечено.
...
Рейтинг: 0 / 0
Index VS Constraint+Implicit Index
    #38946636
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivShiraMasterZiv, спасибо за развернутый ответ на первый вопрос!
Хочу по нему резюмировать - единственный плюс констрэйнтов - лаконичность, и, как следствие, лучшая читаемость схемы. По производительности ни каких плюсов-минусов ни у констрэйнтов, ни у индексов нет.
Так?

да.
Исключая check constraint, конечено.
Я бы еще добавил — “пока”. Т.к. в работе находятся патчи по отсечению соединяемых таблиц которые не влияют на результат выборки, и по улучшению оценки кол-ва записей для связанных таблиц. Оба основываются на внешних ключах.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Index VS Constraint+Implicit Index
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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