1

标准 EAV 模式:一列用于实体 ID,一列用于属性 ID,一列用于值 ID。

历史 EAV 架构:为时间/日期范围添加额外的列

在运行时,某些行将被排除。每个实体、每个属性可能返回 0、1 或许多行。我们只希望保留每个属性的最新值。

我们当前的解决方案是使用 SQL Server Rank() 函数为每一行标记一个排名,然后在 where 子句中我们有“and rank = 1”。

但是,性能并不令人满意。在分析过程中,我们发现分配排名非常快,但是针对排名执行 where 子句需要对数据进行第二次扫描,并将整个数据集保存在 RAM 中。

对剩余属性行进行排名并仅返回最新的最快方法是什么?

4

2 回答 2

1

虽然我认为 gbn 的答案可能就足够了,但我想知道是否使用 OVER 子句来为每个 id/attribute 建立一个 MAX 日期,以减少 WHERE 子句中的 SELECT 不会比 RANK 快?没有时间测试性能,但这里是查询:

select * 
from (
  select *, max(dt) over (partition by eID, aID) maxdt 
    from table
) t
where t.dt = t.maxdt and ...

祝你好运!

于 2009-05-20T04:33:03.370 回答
1

一般的想法是首先提取最新的 + 键,然后再加入以获取不属于聚合的值。它是 EAV 的事实并不重要。

SELECT
    *
FROM
    table t
    JOIN
    (SELECT MAX(dt) AS mdt, eID, aID FROM table GROUP BY eID, aID) mt
                     ON t.eID = mt.eID AND t.aID = mt.aID AND t.dt = mt.mdt
WHERE
    ...
于 2009-04-09T18:28:49.163 回答