2016-01-05 7 views
1

Я работаю над скриптом, чтобы заполнить очень простую таблицу измерений даты, чья зернистость снижается до минутного уровня. Эта таблица должна в конечном счете содержать 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 
+0

расщепляется и время в отдельных измерениях. Также не используйте тип данных timestamp для дат. –

+0

Почему скорость имеет значение? Вам нужно делать это не один раз? –

+0

@DanBracuk, этот скрипт будет запускаться только один раз нашим установочным пакетом для клиентов. Хотя это одноразовое соглашение, мне бы не хотелось, чтобы они подождали несколько минут, пока эта таблица построена. –

ответ

1

Это займет 11 секунд на моем сервере ...

If  Object_ID('tempdb..#someNumbers') Is Not Null Drop Table #someNumbers; 
Create Table #someNumbers (id Int); 

Declare @minutes Int, 
     @days Int; 

Select @minutes = DateDiff(Minute,'1/1/2000 00:00','1/2/2000 00:00'), 
     @days = DateDiff(Day,'1/1/2000 00:00','1/1/2051 00:00'); 

With Base As 
(  
     Select 1 As seedID 
     Union All 
     Select 1 
),  Build As 
(
     Select seedID 
     From Base 
     Union All 
     Select b.seedID + 1 
     From Build b 
     Cross Join Base b2 
     Where b.SeedID < 14 
) 
Insert #someNumbers 
Select Row_Number() Over (Order By seedID) As id 
From Build 
Option (MaxRecursion 0); 

If  Object_ID('tempdb..#values') Is Not Null Drop Table #values; 
Create Table #values ([TimeStamp] SmallDateTime NOT NULL); 

With Dates As 
(
     Select DateAdd(Day,id-1,'1/1/2000 00:00') As [TimeStamp] 
     From #someNumbers 
     Where id <= @days 
) 
Insert #values 
Select Convert(SmallDateTime,DateAdd(Minute,id-1,[TimeStamp])) 
From Dates d 
Join #someNumbers sn 
     On sn.id <= @minutes 
Order By 1 
+0

Впечатляет! Что это такое, что дает лучшую производительность? Использование временных таблиц и статистики? –