2

特定の時点で、資産には実効価格があります。資産によっては、週に 1 回、または 1 日 1 回新しい価格になるものがあります。直近の価格が「実効価格」です。

記述された関係を格納するテンポラル テーブルは次のようになります。

CREATE TABLE dbo.AssetPrice
(
    AssetId int NOT NULL -- FK to the table dbo.Asset
    ,EffectiveDate datetime NOT NULL
    ,Price decimal NOT NULL
    CONSTRAINT PK_AssetPrice PRIMARY KEY CLUSTERED (AssetId,EffectiveDate,Price)
)

データは次のようになります。

AssetId    EffectiveDate    Price
-------    -------------    -----
      1       2012-01-11     1.21
      1       2012-01-12     1.22
      2       2012-01-11     3.55
      2       2012-01-12     3.60
      3       2012-01-04     5.15
      3       2012-01-11     5.14

の実効価格を照会するのAssetIdは簡単ですが、計算にはかなりの時間がかかります。

データを物理的に保存して、データが変更された場合にのみdbo.AssetPrice実効価格の再計算が必要になるようにするのが理想的です。関連する集計関数はインデックス付きビューでは許可されていないため、インデックス付きビューを作成できないと思います。

テーブルを調整して実効価格 (最新の価格) を非常に迅速に取得するにはどうすればよいですか?

4

1 に答える 1

2

基本的に、次の 2 つの異なるアプローチを使用できます。

  • テーブル スキーマを変更して間隔を含めます。この場合、有効期間を決定するために開始日と終了日を保存する必要があります。これで、単純な BETWEEN を使用して希望の価格を取得するだけで済みます。最適なパフォーマンスのために、開始日と終了日に非クラスター化インデックスと AssetId を追加することもできます。デフォルトでは、終了日を '9999-12-31' として追加でき、資産に新しい価格が設定されるたびに、現在の期間を終了して新しい期間を開始できます。私は(個人的に)このオプションを好みます。

  • このスキーマに固執し、EffectiveDate と AssetId に非クラスター化インデックスを作成します。次のように、有効日が目的の日付よりも前のアセットの最大日付を取得するには、サブセレクトを作成する必要があります。

.

CREATE INDEX    IX_AssetPrice_EffectiveDate
                ON AssetPrice (EffectiveDate, AssetId) INCLUDE (Price)
DECLARE @AssetId int = NULL, @EffectiveDate datetime = '2012-01-11'
SELECT  AssetPrice.AssetId, AssetPrice.Price, AssetPrice.EffectiveDate
FROM    AssetPrice
JOIN    (
            SELECT  AssetId, MAX(EffectiveDate) EffectiveDate
            FROM    AssetPrice
            WHERE   EffectiveDate <= @EffectiveDate AND
                    (AssetId = @AssetId OR @AssetId IS NULL)
            GROUP BY AssetId
        ) Effective
        ON  AssetPrice.AssetId = Effective.AssetId AND
            AssetPrice.EffectiveDate = Effective.EffectiveDate
WHERE   (AssetPrice.AssetId = @AssetId OR @AssetId IS NULL)
于 2012-01-19T01:16:44.827 に答える