15
Схема данных
Типы данных
выбор подходящих типов
составные типы (массивы, JSON) вместо отдельных таблиц
Ограничения целостности
помимо обеспечения целостности данных, могут учитываться
планировщиком для устранения ненужных соединений, улучшения
оценок селективности и других оптимизаций
первичный ключ и уникальность — уникальный индекс
внешний ключ
отсутствие неопределенных значений
проверка CHECK (constraint_exclusion)
Важен правильный выбор типов данных из всего многообразия,
предлагаемого PostgreSQL. Например, представление интервалов дат
не двумя отдельными столбцами, а с помощью диапазонных типов
(daterange, tstzrange) позволяет использовать индексы GiST и SP-GiST
для таких операций, как пересечение интервалов.
В ряде случаев эффект дает использование составных типов (таких как
массивы или JSON) вместо классического подхода с созданием
отдельной таблицы. Это позволяет сэкономить на соединении и не
требует хранения большого количества служебной информации
в заголовках версий строк. Но такое решение следует принимать
с большой осторожностью, поскольку оно имеет свои минусы.
Ограничения целостности важны сами по себе, но в некоторых
случаях планировщик может учитывать их и для оптимизации.
- Ограничения первичного ключа и уникальности сопровождаются
построением уникальных индексов и гарантируют, что все значения
столбцов ключа различны (точная статистика). Такие гарантии
позволяют и более эффективно выполнять соединения.
- Наличие внешнего ключа и ограничений NOT NULL дает гарантии,
которые позволяют в ряде случаев устранять лишние внутренние
соединения (что особенно важно при использовании представлений),
а также улучшает оценку селективности в случае, если соединение
происходит по нескольким столбцам.
- Ограничение CHECK с использованием параметра constraint_exclusion
позволяет не сканировать таблицы (или секции), если в них
гарантированно нет требуемых данных.