标准EAV架构:一列用于实体ID,一列用于属性ID,一列用于值ID。
历史EAV架构:为时间/日期范围添加其他列
在运行时,将排除某些行。每个实体每个属性可能返回0,1或许多行。我们只希望保留每个属性的最新值。
我们当前的解决方案是使用SQL Server Rank()函数将每一行标记为排名,然后在where子句中使用“and rank = 1”。
然而,表现并不令人满意。在分析过程中,我们发现分配排名非常快,但是对排名执行where子句需要对数据进行第二次扫描,并将整个数据集保存在RAM中。
对剩余属性行进行排名的最快方法是什么,并且只返回最新的?
答案 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 ...
祝你好运!