Я унаследовал очень большую и активную таблицу PostgreSQL со столбцом BIGINT
, содержащим скалярные измерения для сэмплов, например:
CREATE TABLE sample (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
...
);
CREATE TABLE measurement (
id SERIAL PRIMARY KEY,
sampleid INTEGER NOT NULL,
value BIGINT NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
...
FOREIGN KEY (sampleid) REFERENCES sample (id)
);
CREATE INDEX ix_measurement_created ON measurement (created);
Сначала пользователи запрашивают сэмплы, основываясь на том, что measurement.value
больше нуля итогда по дополнительным критериям.Эти запросы изначально были мучительно медленными.
Добавление CREATE INDEX ix_measurement_value ON measurement (value);
улучшило производительность почти в десять раз.
Я должен был быть доволен этим результатом, но я не могу не чувствовать, что это не самое эффективное решение.На практике фактические значения , хранящиеся в столбце, не имеют значения, так как 99% запросов:
- ... всегда сначала для области
value > 0
илиvalue <= 0
. - ... никогда ищет значения в определенных диапазонах.
- ... никогда ищет конкретные значения.
Будет ли одно из следующих действий более эффективным?
Я не уверен, как достаточно хорошо смоделировать статистику / загрузку производственной среды, чтобы самостоятельно оценить подходы (совет по этому поводу также был бы оценен!).
Редактировать: Я забыл упомянуть, что запросы генерируются / выдаются с помощью ORM, который я не могу контролировать - вышеприведенное объединение sample
/ measurement
является лишь частью очень большой и ужасной вещи.
Редактирование # 2: Это база данных PostgreSQL 9.3, которую нельзя обновить до версии 9.4 в соответствии с требованиями поставщика.
Редактирование # 3: A частичный индекс было предложено, но поскольку запросы генерируются ORM, трудно определить, какие столбцы должен содержать частичный индекс ... если кто-то не посоветует это!