1

標準EAVスキーマ:エンティティID用に1列、属性ID用に1列、値ID用に1列。

履歴EAVスキーマ:時間/日付範囲の列を追加します

実行時に、特定の行が除外されます。属性ごとに、エンティティごとに0、1、または多数の行が返される場合があります。残りの各属性の最新の値のみが必要です。

現在のソリューションでは、SQL ServerのRank()関数を使用して各行にランクを付け、where句に「andrank=1」を付けています。

ただし、パフォーマンスは十分ではありません。分析中に、ランクの割り当ては非常に高速であることがわかりましたが、ランクに対してwhere句を実行するには、データの2回目のスキャンが必要であり、データセット全体がRAMに保持されます。

残りの属性行をランク付けし、最新のものだけを返す最も速い方法は何ですか?

4

2 に答える 2

1

gbn の回答でおそらく十分だと思いますが、OVER 句を使用して ID/属性ごとに最大日付を確立し、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 に答える