Обсуждение: Does PostgreSQL ever create indexes on its own?

Поиск
Список
Период
Сортировка

Does PostgreSQL ever create indexes on its own?

От
"Doiron, Daniel"
Дата:
I’m troubleshooting a schema and found this:

Indexes:
    "pk_patient_diagnoses" PRIMARY KEY, btree (id)
    "index_4341548" UNIQUE, btree (id)
    "idx_patient_diagnoses_deleted" btree (deleted)
    "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
    "idx_patient_diagnoses_icd10" btree (icd10)
    "idx_patient_diagnoses_icd9" btree (diagnosis_code)
    "idx_patient_diagnoses_is_unknown" btree (is_unknown)
    "idx_patient_diagnoses_modified" btree (modified)
    "idx_patient_diagnoses_patient_id" btree (patient_id)
    "idx_patient_diagnoses_uuid" btree (uuid)
    "index_325532921" btree (modified)
    "index_4345603" btree (deleted)
    "index_4349516" btree (diagnosis_type_id)
    "index_4353417" btree (icd10)
    "index_4384754" btree (diagnosis_code)
    "index_4418849" btree (is_unknown)
    "index_4424101" btree (patient_id)
    "index_4428458" btree (uuid)

My questions is whether these “index_*” indexes could have been created by postgresql or whether I have an errant developer using some kinda third-party tool?

Re: Does PostgreSQL ever create indexes on its own?

От
Guillaume Lelarge
Дата:
2015-11-12 23:21 GMT+01:00 Doiron, Daniel <DoironD@advisory.com>:
I’m troubleshooting a schema and found this:

Indexes:
    "pk_patient_diagnoses" PRIMARY KEY, btree (id)
    "index_4341548" UNIQUE, btree (id)
    "idx_patient_diagnoses_deleted" btree (deleted)
    "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
    "idx_patient_diagnoses_icd10" btree (icd10)
    "idx_patient_diagnoses_icd9" btree (diagnosis_code)
    "idx_patient_diagnoses_is_unknown" btree (is_unknown)
    "idx_patient_diagnoses_modified" btree (modified)
    "idx_patient_diagnoses_patient_id" btree (patient_id)
    "idx_patient_diagnoses_uuid" btree (uuid)
    "index_325532921" btree (modified)
    "index_4345603" btree (deleted)
    "index_4349516" btree (diagnosis_type_id)
    "index_4353417" btree (icd10)
    "index_4384754" btree (diagnosis_code)
    "index_4418849" btree (is_unknown)
    "index_4424101" btree (patient_id)
    "index_4428458" btree (uuid)

My questions is whether these “index_*” indexes could have been created by postgresql or whether I have an errant developer using some kinda third-party tool?

PostgreSQL doesn't create indexes on its own, except for primary keys, unique constraints, and exclusion constraints.

So, that must be something (or someone) else.

Re: Does PostgreSQL ever create indexes on its own?

От
"Joshua D. Drake"
Дата:
On 11/12/2015 02:21 PM, Doiron, Daniel wrote:
> I’m troubleshooting a schema and found this:
>
> Indexes:
>      "pk_patient_diagnoses" PRIMARY KEY, btree (id)
>      "index_4341548" UNIQUE, btree (id)
>      "idx_patient_diagnoses_deleted" btree (deleted)
>      "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
>      "idx_patient_diagnoses_icd10" btree (icd10)
>      "idx_patient_diagnoses_icd9" btree (diagnosis_code)
>      "idx_patient_diagnoses_is_unknown" btree (is_unknown)
>      "idx_patient_diagnoses_modified" btree (modified)
>      "idx_patient_diagnoses_patient_id" btree (patient_id)
>      "idx_patient_diagnoses_uuid" btree (uuid)
>      "index_325532921" btree (modified)
>      "index_4345603" btree (deleted)
>      "index_4349516" btree (diagnosis_type_id)
>      "index_4353417" btree (icd10)
>      "index_4384754" btree (diagnosis_code)
>      "index_4418849" btree (is_unknown)
>      "index_4424101" btree (patient_id)
>      "index_4428458" btree (uuid)
>
> My questions is whether these “index_*” indexes could have been created
> by postgresql or whether I have an errant developer using some kinda
> third-party tool?

This is definitely a third party tool. The only time an index will be
implicitly created is:

1. You set a column as the PRIMARY KEY
2. You set a column UNIQUE

Lastly, postgresql would never use such a ridiculous naming scheme.

JD



--
Command Prompt, Inc. - http://www.commandprompt.com/  503-667-4564
PostgreSQL Centered full stack support, consulting and development.
New rule for social situations: "If you think to yourself not even
JD would say this..." Stop and shut your mouth. It's going to be bad.


Re: Does PostgreSQL ever create indexes on its own?

От
Thomas Kellerer
Дата:
Doiron, Daniel schrieb am 12.11.2015 um 23:21:
> I’m troubleshooting a schema and found this:
>
> Indexes:
>      "pk_patient_diagnoses" PRIMARY KEY, btree (id)
>      "index_4341548" UNIQUE, btree (id)
>      "idx_patient_diagnoses_deleted" btree (deleted)
>      "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
>      "idx_patient_diagnoses_icd10" btree (icd10)
>      "idx_patient_diagnoses_icd9" btree (diagnosis_code)
>      "idx_patient_diagnoses_is_unknown" btree (is_unknown)
>      "idx_patient_diagnoses_modified" btree (modified)
>      "idx_patient_diagnoses_patient_id" btree (patient_id)
>      "idx_patient_diagnoses_uuid" btree (uuid)
>      "index_325532921" btree (modified)
>      "index_4345603" btree (deleted)
>      "index_4349516" btree (diagnosis_type_id)
>      "index_4353417" btree (icd10)
>      "index_4384754" btree (diagnosis_code)
>      "index_4418849" btree (is_unknown)
>      "index_4424101" btree (patient_id)
>      "index_4428458" btree (uuid)
>
> My questions is whether these “index_*” indexes could have been created by postgresql or whether I have an errant
developerusing some kinda third-party tool? 

The only index that Postgres "automatically" creates is the unique index supporting a primary key or a unique
constraint.

But apart from that, Postgres never creates indexes on its own.

So from the list above, only pk_patient_diagnose has (most probably) been created automatically. Everything else was
createdmanually. 



Re: Does PostgreSQL ever create indexes on its own?

От
Alvaro Herrera
Дата:
Thomas Kellerer wrote:
> Doiron, Daniel schrieb am 12.11.2015 um 23:21:
> >I’m troubleshooting a schema and found this:
> >
> >Indexes:
> >     "pk_patient_diagnoses" PRIMARY KEY, btree (id)

> The only index that Postgres "automatically" creates is the unique index supporting a primary key or a unique
constraint.
>
> But apart from that, Postgres never creates indexes on its own.
>
> So from the list above, only pk_patient_diagnose has (most probably) been created automatically. Everything else was
createdmanually. 

As I recall, the naming convention is to append "_pkey", not to prepend
"pk_", so not even that one.  (Of course, you can tell it what name to
use when creating the constraint, which is what was done here.)

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Re: Does PostgreSQL ever create indexes on its own?

От
Tom Lane
Дата:
Thomas Kellerer <spam_eater@gmx.net> writes:
> Doiron, Daniel schrieb am 12.11.2015 um 23:21:
>> I�m troubleshooting a schema and found this:
>>
>> Indexes:
>> "pk_patient_diagnoses" PRIMARY KEY, btree (id)
>> "index_4341548" UNIQUE, btree (id)
>> "idx_patient_diagnoses_deleted" btree (deleted)
>> "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
>> "idx_patient_diagnoses_icd10" btree (icd10)
>> "idx_patient_diagnoses_icd9" btree (diagnosis_code)
>> "idx_patient_diagnoses_is_unknown" btree (is_unknown)
>> "idx_patient_diagnoses_modified" btree (modified)
>> "idx_patient_diagnoses_patient_id" btree (patient_id)
>> "idx_patient_diagnoses_uuid" btree (uuid)
>> "index_325532921" btree (modified)
>> "index_4345603" btree (deleted)
>> "index_4349516" btree (diagnosis_type_id)
>> "index_4353417" btree (icd10)
>> "index_4384754" btree (diagnosis_code)
>> "index_4418849" btree (is_unknown)
>> "index_4424101" btree (patient_id)
>> "index_4428458" btree (uuid)

> So from the list above, only pk_patient_diagnose has (most probably) been created automatically. Everything else was
createdmanually. 

Also, *none* of those index names match what Postgres would choose of its
own accord.  The built-in naming schemes can be exhibited thus:

regression=# create table foo (f1 int primary key, f2 int unique, f3 int);
CREATE TABLE
regression=# create index on foo(f3);
CREATE INDEX
regression=# \d foo
      Table "public.foo"
 Column |  Type   | Modifiers
--------+---------+-----------
 f1     | integer | not null
 f2     | integer |
 f3     | integer |
Indexes:
    "foo_pkey" PRIMARY KEY, btree (f1)
    "foo_f2_key" UNIQUE CONSTRAINT, btree (f2)
    "foo_f3_idx" btree (f3)

There's some additional rules for abbreviating very long derived index
names, and for dealing with index name collisions, but none of those would
have come into play here.  The index names Daniel shows must all have been
specified in DDL commands, either as the name of a constraint or as the
name of an index.

            regards, tom lane


Re: Does PostgreSQL ever create indexes on its own?

От
Albe Laurenz
Дата:
Doiron, Daniel wrote:
> I’m troubleshooting a schema and found this:
> 
> Indexes:
>     "pk_patient_diagnoses" PRIMARY KEY, btree (id)
>     "index_4341548" UNIQUE, btree (id)
>     "idx_patient_diagnoses_deleted" btree (deleted)
>     "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
>     "idx_patient_diagnoses_icd10" btree (icd10)
>     "idx_patient_diagnoses_icd9" btree (diagnosis_code)
>     "idx_patient_diagnoses_is_unknown" btree (is_unknown)
>     "idx_patient_diagnoses_modified" btree (modified)
>     "idx_patient_diagnoses_patient_id" btree (patient_id)
>     "idx_patient_diagnoses_uuid" btree (uuid)
>     "index_325532921" btree (modified)
>     "index_4345603" btree (deleted)
>     "index_4349516" btree (diagnosis_type_id)
>     "index_4353417" btree (icd10)
>     "index_4384754" btree (diagnosis_code)
>     "index_4418849" btree (is_unknown)
>     "index_4424101" btree (patient_id)
>     "index_4428458" btree (uuid)
> 
> My questions is whether these “index_*” indexes could have been created by postgresql or whether I
> have an errant developer using some kinda third-party tool?

These indexes were *not* created by PostgreSQL.
We are not Oracle.

Yours,
Laurenz Albe

Re: Does PostgreSQL ever create indexes on its own?

От
Thomas Kellerer
Дата:
Albe Laurenz schrieb am 13.11.2015 um 11:23:
>> My questions is whether these “index_*” indexes could have been created by postgresql or whether I
>> have an errant developer using some kinda third-party tool?
>
> These indexes were *not* created by PostgreSQL.
> We are not Oracle.

Well, Oracle does not create indexes on its own either - it has the same strategy as Postgres:
Indexes are only created automatically for primary keys and unique constraints.

Thomas

Re: Does PostgreSQL ever create indexes on its own?

От
Jeremy Harris
Дата:
On 13/11/15 10:49, Thomas Kellerer wrote:
>> These indexes were *not* created by PostgreSQL.
>> We are not Oracle.
>
> Well, Oracle does not create indexes on its own either - it has the same strategy as Postgres:
> Indexes are only created automatically for primary keys and unique constraints.

Given that indices are an implementation wart on the side of the
relational model, it'd be nice if RDBMS' did create them for one.
--
Cheers,
  Jeremy




Re: Does PostgreSQL ever create indexes on its own?

От
Albe Laurenz
Дата:
Jeremy Harris wrote:
> On 13/11/15 10:49, Thomas Kellerer wrote:
>>> These indexes were *not* created by PostgreSQL.
>>> We are not Oracle.
>>
>> Well, Oracle does not create indexes on its own either - it has the same strategy as Postgres:
>> Indexes are only created automatically for primary keys and unique constraints.

I know - but I couldn't help commenting on the strange names
it chooses for these, like "SYS43243247".
Sorry for being unclear.

> Given that indices are an implementation wart on the side of the
> relational model, it'd be nice if RDBMS' did create them for one.

That cannot be done without knowing what the queries are going to be.

However, I recently learned that MySQL automatically creates indexes
on columns with a foreign key, and you cannot even drop those.

Maybe that would be a good thing, guessing from the number of cases
where people suffer from the lack of such indexes, but on the other
hand it feels like too much DWIM (there are cases where you do not
need such an index).

Yours,
Laurenz Albe

Re: Does PostgreSQL ever create indexes on its own?

От
"Doiron, Daniel"
Дата:
Thanks for all your quick replies!

Turns out these are created by pg_repack and left in the database if
pg_repack encounters a fatal error.

In this case, the error was a hyphen in the database name which pg_repack
can¹t handle.





On 11/12/15, 5:38 PM, "Tom Lane" <tgl@sss.pgh.pa.us> wrote:

>Thomas Kellerer <spam_eater@gmx.net> writes:
>> Doiron, Daniel schrieb am 12.11.2015 um 23:21:
>>> I¹m troubleshooting a schema and found this:
>>>
>>> Indexes:
>>> "pk_patient_diagnoses" PRIMARY KEY, btree (id)
>>> "index_4341548" UNIQUE, btree (id)
>>> "idx_patient_diagnoses_deleted" btree (deleted)
>>> "idx_patient_diagnoses_diagnosis_type_id" btree (diagnosis_type_id)
>>> "idx_patient_diagnoses_icd10" btree (icd10)
>>> "idx_patient_diagnoses_icd9" btree (diagnosis_code)
>>> "idx_patient_diagnoses_is_unknown" btree (is_unknown)
>>> "idx_patient_diagnoses_modified" btree (modified)
>>> "idx_patient_diagnoses_patient_id" btree (patient_id)
>>> "idx_patient_diagnoses_uuid" btree (uuid)
>>> "index_325532921" btree (modified)
>>> "index_4345603" btree (deleted)
>>> "index_4349516" btree (diagnosis_type_id)
>>> "index_4353417" btree (icd10)
>>> "index_4384754" btree (diagnosis_code)
>>> "index_4418849" btree (is_unknown)
>>> "index_4424101" btree (patient_id)
>>> "index_4428458" btree (uuid)
>
>> So from the list above, only pk_patient_diagnose has (most probably)
>>been created automatically. Everything else was created manually.
>
>Also, *none* of those index names match what Postgres would choose of its
>own accord.  The built-in naming schemes can be exhibited thus:
>
>regression=# create table foo (f1 int primary key, f2 int unique, f3 int);
>CREATE TABLE
>regression=# create index on foo(f3);
>CREATE INDEX
>regression=# \d foo
>      Table "public.foo"
> Column |  Type   | Modifiers
>--------+---------+-----------
> f1     | integer | not null
> f2     | integer |
> f3     | integer |
>Indexes:
>    "foo_pkey" PRIMARY KEY, btree (f1)
>    "foo_f2_key" UNIQUE CONSTRAINT, btree (f2)
>    "foo_f3_idx" btree (f3)
>
>There's some additional rules for abbreviating very long derived index
>names, and for dealing with index name collisions, but none of those would
>have come into play here.  The index names Daniel shows must all have been
>specified in DDL commands, either as the name of a constraint or as the
>name of an index.
>
>            regards, tom lane
>
>
>--
>Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>To make changes to your subscription:
>http://www.postgresql.org/mailpref/pgsql-general