У меня большие проблемы с оптимизацией SQL-запроса, который требует возрастов для запуска набора данных с ~ 300 000 строк.
Я выполняю запрос к таблице stat_records
с десятичной дробьюvalue
и столбец datetime recorded_at
.
Я хочу узнать значения MAX и MIN в любом из следующих периодов: все время, в прошлом году, последние 6 месяцев, последние 3 месяца, последний месяц, последние 2 недели.
Я делаю это прямо сейчас, выполняя следующий SQL-запрос отдельно для каждого указанного выше интервала:
SELECT MIN("stat_records"."value")
FROM "stat_records"
INNER JOIN "stats" ON "stats"."id" = "stat_records"."stat_id"
WHERE "stat_records"."object_id" = $1
AND "stats"."identifier" = $2
AND ("stat_records"."recorded_at" BETWEEN $3 AND $4)
[["object_id", 1],
["identifier", "usd"],
["recorded_at", "2018-10-15 20:10:58.418512"],
["recorded_at", "2018-12-15 20:11:59.351437"]]
Определение таблицы:
create_table "stat_records", force: :cascade do |t|
t.datetime "recorded_at"
t.decimal "value"
t.bigint "coin_id"
t.bigint "object_id"
t.index ["object_id"], name: "index_stat_records_on_object_id"
t.index ["recorded_at", "object_id", "stat_id"], name: "for_upsert", unique: true
t.index ["recorded_at", "stat_id"], name: "index_stat_records_on_recorded_at_and_stat_id", unique: true
t.index ["recorded_at"], name: "index_stat_records_on_recorded_at"
t.index ["stat_id"], name: "index_stat_records_on_stat_id"
t.index ["value"], name: "index_stat_records_on_value"
end
Этот подход,однако, требуется навсегда, чтобы завершить.У меня есть индексы для таблицы stat_records
в столбцах value
и recorded_at
.
Чего мне здесь не хватает - что мне следует сделать, чтобы оптимизировать это?
Возможно, есть некоторыелучше подходить так, чтобы я мог выполнить 1 запрос и позволить postgres выполнить оптимизацию для меня.