Проблема
У меня есть список ключей и другой список дат для каждого из этих ключей.В основном это Multimap из ключей к датам (на Java, Multimap<Key, Date>
).Я использую эти Ключи и Даты для запроса таблицы следующим образом:
select * from Table where key = :key and date = :date
Это ужасно, так как генерируется Σ(|Date(Key)|)
запросов.Чтобы улучшить это, я могу взглянуть на запросы к периодам в форме:
select * from Table where key in (:keys) and date >= :startDate and date <= :endDate
Так как требуется только один запрос, но все еще существует проблема производительности в том, что эти даты могут отличаться на очень большие периоды (года).В качестве примера возьмем базовый случай, когда есть два ключа, первый из которых имеет назначенную дату «2010-01-01», а второй - «2012-01-01».В этом случае этот запрос будет возвращать все значения за этот период, хотя мне нужны только две записи.
Подход к решению
В идеале я хотел бы создать оптимальное количество запросовгде оптимальной является функция от количества запросов и количества возвращаемых данных.Я хотел бы как можно меньше запросов, но таким образом, чтобы они возвращали наименьшее количество ненужных данных.Другими словами, простая фитнес-функция может быть w|Queries| x |Data|
, где w
- некоторый вес.
Учитывая это, предыдущий пример приведет к двум запросам, тогда как, если бы даты были близки друг к другу, это было бы толькоодин запрос.
Опции
Это похоже на проблему кластеризации, но я не очень разбираюсь в кластеризации, и поэтому я не совсем уверен, с чего начать.Я предполагаю, что мне, вероятно, придется разбить мультикарту на отдельных лиц в форме (Key, Date)
, и оттуда искать алгоритм, который идентифицирует количество самих кластеров.
Существует ли какой-либо алгоритм или подход кластеризации, которыйхорошо подходит для моей проблемы, или, возможно, есть решение, отличное от кластеризации?