【发布时间】:2012-02-27 19:45:32
【问题描述】:
问题
我有一个键列表和每个键的另一个日期列表。基本上是日期键的多重映射(在 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) 形式的个体,然后从那里寻找一种算法来识别集群本身的数量。
是否有任何聚类算法或方法非常适合我的问题,或者是否有除聚类之外的解决方案?
【问题讨论】:
标签: sql algorithm date cluster-analysis date-range