Как настроить производительность временной таблицы SQL Server - PullRequest
2 голосов
/ 19 января 2012

На данный момент времени актив имеет эффективную цену. Некоторые активы имеют новую цену один раз в неделю, некоторые раз в день. Самая последняя цена - это «эффективная цена».

Временная таблица, в которой хранятся описанные отношения, выглядит следующим образом:

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 требует пересчета эффективной цены. Я считаю, что не могу создать индексированное представление, потому что соответствующие индексные функции не разрешены в индексированном представлении.

Как настроить таблицу для быстрого получения эффективной цены (самой последней цены)?

1 Ответ

2 голосов
/ 19 января 2012

В основном вы можете использовать два разных подхода:

  • Измените схему таблицы так, чтобы она включала интервал.В этом случае вам нужно сохранить дату начала и окончания, чтобы определить действующий период .При этом вам просто нужно использовать простой МЕЖДУ, чтобы получить желаемую цену.Вы также можете добавить некластеризованный индекс на начальную и конечную даты и 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)
...