IBM DB2
C:\>db2 create table public.tab1 (id int not null, col1 int not null)
C:\>db2 create unique index tab1_ix on public.tab1 (id) include (col1)
C:\>db2 alter table public.tab1 add primary key (id)
SQL0598W Existing index "IN1139.TAB1_IX" is used as the index for the primary
key or a unique key. SQLSTATE=01550
É apenas uma informação que o índice existente foi usado.
POSTGRESQL
db=# create table public.tab1 (id int not null, col1 int not null);
db=# create unique index tab1_ix on public.tab1 (id) include (col1);
db=# alter table public.tab1 add primary key (id);
db=# \d public.tab1;
Table "public.tab1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
col1 | integer | | not null |
Indexes:
"tab1_pkey" PRIMARY KEY, btree (id)
"tab1_ix" UNIQUE, btree (id) INCLUDE (col1)
PostgreSQL criou índice adicional para chave primária.
Por que isso é importante? a) Em muitos casos explicados, vi que se a chave primária for criada, o banco de dados usa o índice de chave primária para consultas. Mas se eu descartar a chave primária, o índice exclusivo e as consultas serão executadas muito mais rapidamente (por causa do Index Only Scan). b) Espaço adicional em disco é usado para índice de chave primária adicional. c) Cada atualização/inserção/exclusão e dois índices devem ser atualizados em vez de um.
Questões:
- Existe uma maneira de forçar o banco de dados PostgreSQL a usar o índice existente, quando a chave primária é adicionada à tabela com o índice exclusivo existente (como no IBM Db2)?
- Existe uma maneira de forçar o PostgreSQL a usar um índice exclusivo (e, portanto, usar o Index Only Scan) em vez do índice de chave primária (e usando apenas o Index Scan) quando as consultas são executadas?
O PostgreSQL não usa automaticamente um índice exclusivo existente para a chave primária; você tem que fazer isso sozinho:
Claro, você também não poderia criar o índice em primeiro lugar, já que uma chave primária adicionará seu próprio índice, como você pode ver.