Пост-ГРЭС и индексы на внешних ключах и первичных ключах

Посмотрите, как Django-CMS делает это, они переопределяют поле db_table в моделях, унаследованных от CMSPlugin. Основы (которые я также использую для своих собственных вещей) сводятся к следующему:

class SuperFooMetaClass(ModelBase):
    def __new__(cls, name, bases, attrs):
        new_class = super(SuperFooMetaClass, cls).__new__(cls, name, bases, attrs)
        new_class._meta.verbose_name = "...."   # perhaps only if not customized
        return new_class


class SuperFoo(models.Model):
    __metaclass__ = SuperFooMetaClass

    ....

Вы можете добавить некоторые проверки, например, обновлять только для подклассов (не прямого типа) или обновлять только в том случае, если значение не настроено.

308
задан lospejos 6 August 2019 в 02:01
поделиться

4 ответа

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

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

В документации по уникальным индексам говорится:

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

и документация по ограничениям говорит: указанный столбец потребует сканирования справочной таблицы для строк, соответствующих старому значению, часто бывает полезно проиндексировать ссылающиеся столбцы. Потому что это не всегда нужно, и есть много вариантов индексации, объявление внешнего ключа ограничение не создает автоматически индекс для ссылки столбцы.

Следовательно, вы должны сами создавать индексы для внешних ключей, если хотите.

Обратите внимание, что если вы используете первичные внешние ключи, такие как 2 FK в качестве PK в таблице M-to-N, у вас будет индекс на ПК, и, вероятно, вам не нужно будет создавать какие-либо дополнительные индексы.

Хотя обычно рекомендуется создать индекс (или включая) ваши столбцы внешнего ключа на стороне ссылки, это не обязательный. Каждый добавляемый вами индекс немного замедляет операции DML, поэтому вы платите за производительность при каждом INSERT , UPDATE или DELETE . Если индекс используется редко, возможно, его не стоит иметь.

366
ответ дан 23 November 2019 в 01:17
поделиться

Если вы хотите перечислить индексы всех таблиц в вашей схеме (ах) из вашей программы вся информация находится под рукой в ​​каталоге:

select
     n.nspname  as "Schema"
    ,t.relname  as "Table"
    ,c.relname  as "Index"
from
          pg_catalog.pg_class c
     join pg_catalog.pg_namespace n on n.oid        = c.relnamespace
     join pg_catalog.pg_index i     on i.indexrelid = c.oid
     join pg_catalog.pg_class t     on i.indrelid   = t.oid
where
        c.relkind = 'i'
    and n.nspname not in ('pg_catalog', 'pg_toast')
    and pg_catalog.pg_table_is_visible(c.oid)
order by
     n.nspname
    ,t.relname
    ,c.relname

Если вы хотите вникнуть дальше (например, столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname] полезно для выяснения того, как запрашивать каталог.

вся информация находится под рукой в ​​каталоге:

select
     n.nspname  as "Schema"
    ,t.relname  as "Table"
    ,c.relname  as "Index"
from
          pg_catalog.pg_class c
     join pg_catalog.pg_namespace n on n.oid        = c.relnamespace
     join pg_catalog.pg_index i     on i.indexrelid = c.oid
     join pg_catalog.pg_class t     on i.indrelid   = t.oid
where
        c.relkind = 'i'
    and n.nspname not in ('pg_catalog', 'pg_toast')
    and pg_catalog.pg_table_is_visible(c.oid)
order by
     n.nspname
    ,t.relname
    ,c.relname

Если вы хотите вникнуть дальше (например, в столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname] полезно для выяснения того, как запрашивать каталог.

вся информация находится под рукой в ​​каталоге:

select
     n.nspname  as "Schema"
    ,t.relname  as "Table"
    ,c.relname  as "Index"
from
          pg_catalog.pg_class c
     join pg_catalog.pg_namespace n on n.oid        = c.relnamespace
     join pg_catalog.pg_index i     on i.indexrelid = c.oid
     join pg_catalog.pg_class t     on i.indrelid   = t.oid
where
        c.relkind = 'i'
    and n.nspname not in ('pg_catalog', 'pg_toast')
    and pg_catalog.pg_table_is_visible(c.oid)
order by
     n.nspname
    ,t.relname
    ,c.relname

Если вы хотите вникнуть дальше (например, в столбцы и порядок), вам нужно посмотреть pg_catalog.pg_index. Использование psql -E [dbname] полезно для выяснения того, как запрашивать каталог.

32
ответ дан 23 November 2019 в 01:17
поделиться

Да - для первичных ключей, нет - для внешних ключей (подробнее в docs ).

\d <table_name>

в «psql» показывает описание таблицы, включая все ее индексы.

20
ответ дан 23 November 2019 в 01:17
поделиться

Для ПЕРВИЧНОГО КЛЮЧА будет создан индекс со следующим сообщением:

NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "index" for table "table" 

Для ИНОСТРАННОГО КЛЮЧА ограничение не будет создается, если нет индекса в таблице referenc ed .

Индекс в таблице referenc ing не требуется (хотя и желателен) и поэтому не будет создаваться неявно.

7
ответ дан 23 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: