PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres и индекси на външни ключове и първични ключове

PostgreSQL автоматично създава индекси за първични ключове и уникални ограничения, но не и за референтната страна на връзките с външни ключове.

Когато Pg създаде имплицитен индекс, той ще издаде NOTICE -ниво съобщение, което можете да видите в psql и/или системните регистрационни файлове, за да можете да видите кога се случва. Автоматично създадените индекси се виждат в \d изход и за таблица.

Документацията за уникалните индекси казва:

PostgreSQL автоматично създава индекс за всяко уникално ограничение и ограничение за първичен ключ, за да наложи уникалността. По този начин не е необходимо да създавате изрично индекс за колони с първичен ключ.

и документацията за ограниченията казва:

Тъй като ИЗТРИВАНЕ на ред от реферираната таблица или АКТУАЛИЗИРАНЕ на препращаща колона ще изисква сканиране на референтната таблица за редове, съответстващи на старата стойност, често е добра идея да индексирате колоните за препращане. Тъй като това не винаги е необходимо и има много възможности за избор как да се индексира, декларацията на ограничение за външен ключ не създава автоматично индекс в колоните за препращане.

Следователно трябва сами да създавате индекси на външни ключове, ако ги искате.

Имайте предвид, че ако използвате първични чужди ключове, като 2 FK като PK в M-to-N таблица, ще имате индекс на PK и вероятно няма да е необходимо да създавате допълнителни индекси.

Въпреки че обикновено е добра идея да създадете индекс върху (или включително) вашите колони с външни ключове от страна на препращане, това не е задължително. Всеки индекс, който добавяте, забавя леко DML операциите, така че плащате разходи за производителност при всяко INSERT , UPDATE или DELETE . Ако индексът се използва рядко, може да не си струва да имате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да избегнем повтарящи се тригерни повиквания в PostgreSQL 9.2.1

  2. Възможно ли е да се предоставят параметри за името на таблица или колона в Prepared Statements или QueryRunner.update()?

  3. Създаването на тригер за вмъкване на дъщерна таблица връща объркваща грешка

  4. Postgres 9.1 срещу Mysql 5.6 InnoDB?

  5. Как да наблюдавате PostgreSQL, работещ вътре в Docker контейнер:Част втора