2017-01-01 3 views
2

фона:Postgres: Преимущества сочетающих колонн

У меня есть три колонки со следующими размерами в байтах (в общей сложности 8): 4 (INT), 2 (малый Int), 2 (малый INT).

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

  1. Диапазон поиска на основе первой 4-байтовой колонны. Этот первый столбец будет монотонно увеличиваться (отметка времени).
  2. Ключевое слово, где указаны все три этих значения.

Вопрос: Есть ли какая-либо польза в Postgres для объединения этих трех столбцов в один 8-байтовый bigint и решение вопроса о разделении в прикладном уровне?

Я прошу взглянуть на запрос БД и эффективность хранения.

+0

Для случая №2 вы заметите увеличение производительности при чтении, однако запись займет немного больше времени, поскольку для обновления требуется 3 столбца вместо одного. Сам индекс - это просто хэшсет, который займет примерно в 3 раза больше существующего индекса для 1 колонки. Многоколоночные индексы не увеличивают производительность при поиске по одному столбцу. Вам понадобится один индекс столбца для # 1 и многоколоночный индекс для # 2. Имейте в виду, чем больше индексов у вас есть, тем медленнее будут записи. –

+0

@KraangPrime: индексы с несколькими столбцами могут полностью ускорить работу с одним столбцом, особенно если они работают с первым столбцом. Но даже с конечными столбцами в определенных ситуациях –

+0

@a_horse_with_no_name - Извините, я должен уточнить. Это не влияет, если это не первичный индекс. Если вы индексируете (A, B, C) и запрашиваете только один из (B) или (C), то индекс не используется вообще для поиска. Для поиска использования индекса все компоненты или, по крайней мере, первичная часть должны использоваться для любого воздействия. См. [Это объяснение] (http://stackoverflow.com/a/2349824/3504007) –

ответ

1

Я подозреваю, что разумные выгоды от объединения будут крошечными и будут компенсированы ограничениями на это. Да, вы можете комбинировать, но вы не можете проводить проверки ссылочной целостности по подчастим поля. То есть tuple A может относиться к кортежу B, но A и B должны быть подмножествами всех полей таблицы. Это является основой требования атомарности 1NF.

Теперь вы можете запросить внутри поля, используя функции для извлечения необходимой информации, и вы можете даже индексировать вывод этих функций, если знаете, что делаете. Но это тогда использует больше места, чем вы могли бы в противном случае, и вы по-прежнему теряете возможности обеспечения ссылочной целостности.

В целом, пространство является проблемой, но не на этом уровне оптимизации. Если у вас нет чрезвычайно специализированных потребностей, объединение значений создает больше проблем, чем решает.

Смежные вопросы