Я работаю над скриптом, чтобы заполнить очень простую таблицу измерений даты, чья зернистость снижается до минутного уровня. Эта таблица должна в конечном счете содержать smalldatetime
, представляющий каждую минуту от 1/1/2000
до 12/31/2015 23:59
.SQL Server: заполнить (минута) таблицу размеров даты
Вот определение таблицы:
CREATE TABLE [dbo].[REF_MinuteDimension] (
[TimeStamp] SMALLDATETIME NOT NULL,
CONSTRAINT [PK_REF_MinuteDimension] PRIMARY KEY CLUSTERED ([TimeStamp] ASC) WITH (FILLFACTOR = 100)
);
Вот последняя версия сценария:
DECLARE @CurrentTimeStamp AS SMALLDATETIME;
SELECT TOP(1) @CurrentTimeStamp = MAX([TimeStamp]) FROM [dbo].[REF_MinuteDimension];
IF @CurrentTimeStamp IS NOT NULL
SET @CurrentTimeStamp = DATEADD(MINUTE, 1, @CurrentTimeStamp);
ELSE
SET @CurrentTimeStamp = '1/1/2000 00:00';
ALTER TABLE [dbo].[REF_MinuteDimension] DROP CONSTRAINT [PK_REF_MinuteDimension];
WHILE @CurrentTimeStamp < '12/31/2050 23:59'
BEGIN
;WITH DateIndex ([TimeStamp]) AS
(
SELECT @CurrentTimeStamp
UNION ALL
SELECT DATEADD(MINUTE, 1, [TimeStamp]) FROM DateIndex di WHERE di.[TimeStamp] < dbo.fGetYearEnd(@CurrentTimeStamp)
)
INSERT INTO [dbo].[REF_MinuteDimension] ([TimeStamp])
SELECT di.[TimeStamp] FROM DateIndex di
OPTION (MAXRECURSION 0);
SET @CurrentTimeStamp = DATEADD(YEAR, 1, dbo.fGetYearBegin(@CurrentTimeStamp))
END
ALTER TABLE [dbo].[REF_MinuteDimension] ADD CONSTRAINT [PK_REF_MinuteDimension] PRIMARY KEY CLUSTERED ([TimeStamp] ASC) WITH (FILLFACTOR = 100);
Пару вещей отметить:
- I 'добавлена логика, чтобы отбросить и впоследствии повторно добавить ограничение первичного ключа в таблице, надеясь повысить производительность.
- Я добавил логику, чтобы объединить
INSERTS
в годовые партии, чтобы минимизировать влияние на журнал транзакций. На боковой ноте мы используем модель восстановленияSIMPLE
.
Производительность так себе и занимает около 15-20 минут. Любые подсказки/предложения о том, как этот сценарий может быть «настроен» или улучшен?
Кроме того, для полноты здесь fGetYearBegin
и fGetYearEnd
: Дата
CREATE FUNCTION dbo.fGetYearBegin
(
@dtConvertDate datetime
)
RETURNS smalldatetime
AS
BEGIN
RETURN DATEADD(YEAR, DATEDIFF(YEAR, 0, @dtConvertDate), 0)
END
CREATE FUNCTION dbo.fGetYearEnd
(
@dtConvertDate datetime
)
RETURNS smalldatetime
AS
BEGIN
RETURN DATEADD(MINUTE, -1, DATEADD(YEAR, 1, dbo.fGetYearBegin(@dtConvertDate)))
END
расщепляется и время в отдельных измерениях. Также не используйте тип данных timestamp для дат. –
Почему скорость имеет значение? Вам нужно делать это не один раз? –
@DanBracuk, этот скрипт будет запускаться только один раз нашим установочным пакетом для клиентов. Хотя это одноразовое соглашение, мне бы не хотелось, чтобы они подождали несколько минут, пока эта таблица построена. –