Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Есть запрос
CREATE TABLE #oper 
(
operation int UNIQUE,
date_begin smalldatetime,
date_end smalldatetime
)

INSERT INTO #oper VALUES (2, '20120505', NULL)
INSERT INTO #oper VALUES (4, '20120805', '20120902')
INSERT INTO #oper VALUES (14, '20120705', '20121005')

-- этот селект ниже нужно оптимизировать.
SELECT o.*, d1.dDate
FROM #oper o
 CROSS APPLY  dbo.dba_getdate(date_begin, ISNULL(date_end, GETDATE()) d1  


В таблице #oper 7тыс. записей., их нужно размножить (каждый день в интервале дат, у операции)

Вспомогательные функции
ALTER FUNCTION [dbo].[dba_getintrange] ( @StartNum int, @EndNum int)
RETURNS TABLE
AS
	RETURN 
		WITH NumberRange AS (
			SELECT 1 AS Num
			UNION ALL
			SELECT
			  nr.Num * 2 + t.RecType  
			FROM NumberRange nr
			CROSS JOIN (
				SELECT 0 AS RecType
				UNION ALL 
				SELECT 1
			) t
			WHERE nr.Num * 2 + t.RecType <= @EndNum - @StartNum + 1
		)
		SELECT @StartNum + Num  - 1 AS Num
		FROM NumberRange;

ALTER FUNCTION [dbo].[dba_getdate] ( @StartDate datetime, @EndDate datetime )
RETURNS TABLE
AS
	RETURN
		SELECT DATEADD(DAY, gsr.Num - 1, @StartDate) AS [dDate]
		FROM dbo.dba_getintrange(1, DATEDIFF(DAY, @StartDate, @EndDate)) gsr


Сейчас время выполения 2 мин. Помогите сделать быстрее.
(доступна только рабочая база, таблица master не доступна)
15 окт 12, 13:21    [13319571]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Заведите в своей базе таблицу с числами и не мучайтесь.
15 окт 12, 13:23    [13319600]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
qwerty112
Guest
trew,

так, сделайте себе в БД постоянную таблицу с числами (а лучше - с датами - Календарь)

я и сам не "фанат" таблиц НЕ в схеме, а "для удобства",
но раз такая задача есть, - зачем "мучится" с этой функцией ? пусть будет постаянная таб., с быстродействием наверняка поможет ...
15 окт 12, 13:27    [13319629]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select t1.*, dateadd( d, number, date_begin ) dDate
  from #oper t1
    inner join master..spt_values t2
      on t2.number between 0 and datediff( d, date_begin, date_end )
  where t2.type = 'P'
  order by operation, number
15 окт 12, 13:28    [13319640]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
qwerty112
Guest
Knyazev Alexey
    inner join master..spt_values t2

trew
(доступна только рабочая база, таблица master не доступна)
15 окт 12, 13:31    [13319670]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
qwerty112
Knyazev Alexey
    inner join master..spt_values t2

trew
(доступна только рабочая база, таблица master не доступна)


select t1.*, dateadd( d, number, date_begin ) dDate
  from #oper t1
    inner join ( select row_number() over ( order by getdate()) number from sys.objects a cross join sys.objects b ) t2
      on t2.number between 0 and datediff( d, date_begin, isnull(date_end, getdate() ) )
  order by operation, number
15 окт 12, 13:34    [13319707]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Knyazev Alexey,

Этот запрос выполняется более 3 минут.
select row_number() over ( order by getdate()) number 
                from sys.objects a 
                cross join sys.objects b 
15 окт 12, 14:32    [13320322]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
tetxx
Member

Откуда:
Сообщений: 297
Если предметная область позволяет, можно сделать максимальный размер 365 дней.

Тогда:
select t1.*, dateadd( d, number, date_begin ) dDate
  from #oper t1
    inner join ( select top 365 row_number() over ( order by (select 1)) number from sys.objects a cross join sys.objects b ) t2
      on t2.number between 0 and datediff( d, date_begin, isnull(date_end, getdate() ) )
  order by operation, number
15 окт 12, 14:47    [13320468]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
tetxx
Member

Откуда:
Сообщений: 297
Если предметная область позволяет, можно сделать максимальный размер интервала 365 дней.
15 окт 12, 14:48    [13320478]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Если предметная область позволяет, можно сделать максимальный размер 365 дней.
И забыть про высокосный год ? :)
15 окт 12, 14:54    [13320541]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
tetxx
Member

Откуда:
Сообщений: 297
Ни в коем случае! =)
366
15 окт 12, 14:55    [13320560]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос, ms sql 2005 (размножить даты)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Knyazev Alexey,

select t1.*, dateadd( d, number, date_begin )-1 dDate
  from #oper t1
    inner join ( select top 1500 row_number() over ( order by getdate()) number from sys.objects a ) t2
      on t2.number between 0 and datediff( d, date_begin, isnull(date_end, getdate() ) )


Работает 10 секунд, то что нужно!
15 окт 12, 15:23    [13320880]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить