从历史EAV数据库查询的最快方法是什么

时间:2009-04-09 18:07:39

标签: sql-server performance entity-attribute-value rank

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

历史EAV架构:为时间/日期范围添加其他列

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

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

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

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

2 个答案:

答案 0 :(得分: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
    ...

答案 1 :(得分:1)

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

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