Оптимизация набора данных с помощью составного первичного ключа, включающего поле состояния - PullRequest
0 голосов
/ 26 июня 2019

Возможно, я слишком много думаю, но я думаю о возможностях оптимизации большого набора данных.У меня есть схема таблицы, содержимое которой в основном захватывается с помощью своего первичного ключа и поля состояния.Можно ли провести какую-либо оптимизацию, если я каким-то образом включу поле состояния в составной первичный ключ для ускорения поиска?Так, например, моя схема таблицы может выглядеть примерно так:

CREATE TABLE object_t (
    object_id SERIAL PRIMARY KEY NOT NULL,
    status VARCHAR CHECK (status ~ '(Astatus|Bstatus|Cstatus|Dstatus)'),
    contents TEXT
);

Мои запросы почти всегда будут выглядеть примерно так:

SELECT * FROM object_t WHERE search condition AND status = ...

Есть ли здесь преимущество для больших наборов данных для настройки схемы наhave:

PRIMARY KEY (object_id, status)

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

FOREIGN KEY (object_id, status) REFERENCES object_t (object_id, status)

Есть ли здесь какая-то оптимизация, или она просто работает с object_id и фильтром состояния настолько хорошо, насколько это возможно?

1 Ответ

1 голос
/ 26 июня 2019

Индекс, который вы предлагаете, с большой вероятностью не поможет.

Преимущество предоставляется только в том случае, если в запросе есть условие, подобное этому:

WHERE object_id = ? AND status = ?

Если только status находится в состоянии WHERE, индекс вообще нельзя использовать.

Название status говорит о том, что существует не так много разных значений. Это означает, что такое условие часто не очень избирательно, что говорит против его индексации.

Если вы всегда запрашиваете определенный status, частичный индекс может быть полезен.

Но лучшее, что вы можете сделать, это поэкспериментировать.

...