问题
我有一个密钥列表和每个密钥的另一个日期列表。基本上是日期键的多重映射(在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
是一定的权重。
鉴于此,前面的示例将导致两个查询,而如果日期靠近在一起,则它只是一个查询。
选项
这似乎是一个聚类问题,但我对聚类知之甚少,因此我不确定从哪里开始。我想我可能不得不将Multimap分解为(Key, Date)
形式的个体,并从那里寻找一种识别簇本身数量的算法。
是否存在任何非常适合我的问题的聚类算法或方法,或者是否可能存在除群集之外的解决方案?
答案 0 :(得分:0)
尝试使用IN
:
select * from Table where key = :key and date IN (date1, date2, date3, etc.)
有了它,您可以一次选择所需的日期。