Такая вот предыстория:
Делая перевод одной БД с Oracle на PostgreSQL(опыта работы с которой совершенно не было), столкнулся с необъяснимой на тот момент для меня ситуацией.
Простая выборка данных из таблицы с 11млн. строк (select ... from ... where ...) занимала около 3-4 сек. в отличие от долей секунд в Oracle. Перелопатив инфу по настройке производительности уже было плюнул на PostgreSQL, но решил проверить свою догадку. В Oracle внешний ключ работал как индекс, в PostgreSQL наряду с Foreign Key построил индекс по этому же полю. И о чудо! Индекс сработал!
Просьба профи PostgreSQL прокомментировать мои догадки соответственно профессионально, т.к. разрешение подобных историй имхо способствует продвижению их любимого продукта.
А зачем строить
А зачем строить догадки?
Первым делом смотрите план запроса, тогда и станет понятно какие индексы используются.
сделал это первым делом
Не стал расписывать все подробности своей истории, но в том-то и была для меня загадка, почему не используется "индекс". Отключал даже полное сканирование в конфиге - не используется и всё тут.
Повторюсь, в Oracle внешний ключ также является индексом.
На мой взгляд этот момент должен быть обозначен, поэтому и создал сей пост. Дабы наступившие на те же "грабли" не осерчали на ни в чем не повинную в данной ситуации наиболее продвинутую открытую СУБД в мире.
Тут особо профи
Тут особо профи не надо быть - вы уже и сами все сказали.
Внешний ключ - это ограничение (CONSTRAINT), а индекс - сам по себе. Индекс должна иметь внешняя таблица.
согласен
Согласен, что ограничение целостности и индекс - разные вещи.
Правда синтаксис CONSTRAINT ... PRIMARY KEY (...) и CONSTRAINT ... FOREIGN KEY (...) ... - уж очень похож.
Тем не менее PRIMARY KEY - индекс, а FOREIGN KEY - нет. Или я и здесь чего-то пропустил?
На самом деле пишу это не оправдания ради, а информации для.
А развернутый ответ профи, думаю, был бы здесь очень даже уместен (хотя, Вы правы, суть и так ясна).
Просто поймите:
Просто поймите: PostgreSQL - это ДРУГАЯ СУБД. Это не Oracle и в ней не должно быть всё как в Oracle. Насколько я помню, стандарт SQL не требует, чтобы внешний ключ был индексом. Соответственно, если это так, то и такое поведение Oracle - это скорее фантазии разработчиков, которым совсем не обязательно должны следовать другие.
я разве против
Я ведь нигде и не утверждал, что в PostgreSQL должно быть как в Oracle.
Так что, состава для дискуссии я в этом плане не вижу.
Касаемо внешнего ключа - то, что он не является индексом, можно скорее отнести к плюсам, т.к. избыточность индексов ни к чему хорошему не приводит.
Просто эти различия надо знать. Я не знал - отсюда и проблемы.
Надеюсь, что сей пост поможет кому-то и не позволит несправедливо разочароваться в заслуживающей уважения СУБД.