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

Откуда: Москва
Сообщений: 4804
Есть такая задача, записи содержат ужатую информацию за период, где эта информация повторялась.

CREATE TABLE #T(
pk_date INT NOT NULL, 
A INT NOT NULL, 
B INT NOT NULL, 
C NVARCHAR(1000), 
Sequence TINYINT NOT NULL DEFAULT 1)

INSERT INTO #T VALUES 
(20110101, 1, 1, REPLICATE('A', 1000), 3), 
(20110105, 1, 4, REPLICATE('B', 1000), 10), 
(20110114, 1, 14, REPLICATE('C', 1000), 31 - 14)


Поле pk_date начальная дата, A ключ сущности (индентифицирует последовательную серию записей). B поле, которое должно увеличиваться на 1 с каждым днём, C некие данные, которые со временем могут измениться, и тогда появляется новая запись, Sequence сколько дней поле C не менялось. Sequence не выходит за пределы месяца. То есть на 1 число следующего месяца обязательно должно быть новая запись. Sequence <= 30

Задача: развернуть сжатую последовательность в полную. Есть Sequence = 1, оставить как есть, если Sequence > 1, то продублировать запись Sequence раз, при этом инкрементально увеличивая pk_date и B. Пример того, что надо получить:

Полный скрипт
+
CREATE TABLE #T(
pk_date INT NOT NULL,
A INT NOT NULL,
B INT NOT NULL,
C NVARCHAR(1000),
Sequence TINYINT NOT NULL DEFAULT 1)
GO

INSERT INTO #T VALUES (20110101, 1, 1, REPLICATE('A', 1000), 3), (20110105, 1, 4, REPLICATE('B', 1000), 10), (20110114, 1, 14, REPLICATE('C', 1000), 31 - 14)
INSERT INTO #T VALUES (20110103, 2, 3, REPLICATE('D', 1000), 5), (20110106, 2, 8, REPLICATE('E', 1000), 10), (20110117, 2, 17, REPLICATE('F', 1000), 31 - 17)
INSERT INTO #T VALUES (20110101, 3, 5, REPLICATE('G', 1000), 5), (20110106, 3, 6, REPLICATE('A', 1000), 12), (20110115, 3, 15, REPLICATE('B', 1000), 31 - 15)

INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 50, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 100, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 200, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 500, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 1000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 2000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 50000, B, C, Sequence FROM #T
GO
SELECT pk_date = pk_date + NN.N, A, B = B + NN.N, C
INTO #T1
FROM #T F
CROSS APPLY
(
--SELECT TOP 1 N FROM Dictionary.N32
--ORDER BY N
--SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
--ORDER BY N
--SELECT N FROM Dictionary.N32
--WHERE N <= F.Sequence

SELECT 0 N
UNION ALL SELECT 01 WHERE 01 <= F.Sequence
UNION ALL SELECT 02 WHERE 02 <= F.Sequence
UNION ALL SELECT 03 WHERE 03 <= F.Sequence
UNION ALL SELECT 04 WHERE 04 <= F.Sequence
UNION ALL SELECT 05 WHERE 05 <= F.Sequence
UNION ALL SELECT 06 WHERE 06 <= F.Sequence
UNION ALL SELECT 07 WHERE 07 <= F.Sequence
UNION ALL SELECT 08 WHERE 08 <= F.Sequence
UNION ALL SELECT 09 WHERE 09 <= F.Sequence
UNION ALL SELECT 10 WHERE 10 <= F.Sequence
UNION ALL SELECT 11 WHERE 11 <= F.Sequence
UNION ALL SELECT 12 WHERE 12 <= F.Sequence
UNION ALL SELECT 13 WHERE 13 <= F.Sequence
UNION ALL SELECT 14 WHERE 14 <= F.Sequence
UNION ALL SELECT 15 WHERE 15 <= F.Sequence
UNION ALL SELECT 16 WHERE 16 <= F.Sequence
UNION ALL SELECT 17 WHERE 17 <= F.Sequence
UNION ALL SELECT 18 WHERE 18 <= F.Sequence
UNION ALL SELECT 19 WHERE 19 <= F.Sequence
UNION ALL SELECT 20 WHERE 20 <= F.Sequence
UNION ALL SELECT 21 WHERE 21 <= F.Sequence
UNION ALL SELECT 22 WHERE 22 <= F.Sequence
UNION ALL SELECT 23 WHERE 23 <= F.Sequence
UNION ALL SELECT 24 WHERE 24 <= F.Sequence
UNION ALL SELECT 25 WHERE 25 <= F.Sequence
UNION ALL SELECT 26 WHERE 26 <= F.Sequence
UNION ALL SELECT 27 WHERE 27 <= F.Sequence
UNION ALL SELECT 28 WHERE 28 <= F.Sequence
UNION ALL SELECT 29 WHERE 29 <= F.Sequence
UNION ALL SELECT 30 WHERE 30 <= F.Sequence
UNION ALL SELECT 31 WHERE 31 <= F.Sequence
) NN
ORDER BY A, pk_date
GO
DROP TABLE #T
DROP TABLE #T1


Вопрос, есть идеи как сделать оптимальней, чем я написал? (блок CROSS APPLY) SQL 2014

Закомментированы менее оптимальные решение, где Dictionary.N32 InMemory таблица на 32 числа 0-31
26 мар 15, 16:22    [17436020]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
a_voronin,

Небольшая ошибочка в CROSS APPLY блоке -- изменил
+

CREATE TABLE #T(
pk_date INT NOT NULL,
A INT NOT NULL,
B INT NOT NULL,
C NVARCHAR(1000),
Sequence TINYINT NOT NULL DEFAULT 1)
GO

INSERT INTO #T VALUES (20110101, 1, 1, REPLICATE('A', 1000), 3), (20110105, 1, 4, REPLICATE('B', 1000), 10), (20110114, 1, 14, REPLICATE('C', 1000), 31 - 14)
INSERT INTO #T VALUES (20110103, 2, 3, REPLICATE('D', 1000), 5), (20110106, 2, 8, REPLICATE('E', 1000), 10), (20110117, 2, 17, REPLICATE('F', 1000), 31 - 17)
INSERT INTO #T VALUES (20110101, 3, 5, REPLICATE('G', 1000), 5), (20110106, 3, 6, REPLICATE('A', 1000), 12), (20110115, 3, 15, REPLICATE('B', 1000), 31 - 15)

INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 50, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 100, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 200, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 500, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 1000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 2000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date + 100, A + 50000, B, C, Sequence FROM #T
GO
SELECT Sum(Sequence) FROM #T
GO

SELECT pk_date = pk_date + NN.N, A, B = B + NN.N, C
INTO #T1
FROM #T F
CROSS APPLY
(
--SELECT TOP 1 N FROM Dictionary.N32
--ORDER BY N
--SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
--ORDER BY N
--SELECT N FROM Dictionary.N32
--WHERE N <= F.Sequence

SELECT 0 N
UNION ALL SELECT 01 WHERE 01 < F.Sequence
UNION ALL SELECT 02 WHERE 02 < F.Sequence
UNION ALL SELECT 03 WHERE 03 < F.Sequence
UNION ALL SELECT 04 WHERE 04 < F.Sequence
UNION ALL SELECT 05 WHERE 05 < F.Sequence
UNION ALL SELECT 06 WHERE 06 < F.Sequence
UNION ALL SELECT 07 WHERE 07 < F.Sequence
UNION ALL SELECT 08 WHERE 08 < F.Sequence
UNION ALL SELECT 09 WHERE 09 < F.Sequence
UNION ALL SELECT 10 WHERE 10 < F.Sequence
UNION ALL SELECT 11 WHERE 11 < F.Sequence
UNION ALL SELECT 12 WHERE 12 < F.Sequence
UNION ALL SELECT 13 WHERE 13 < F.Sequence
UNION ALL SELECT 14 WHERE 14 < F.Sequence
UNION ALL SELECT 15 WHERE 15 < F.Sequence
UNION ALL SELECT 16 WHERE 16 < F.Sequence
UNION ALL SELECT 17 WHERE 17 < F.Sequence
UNION ALL SELECT 18 WHERE 18 < F.Sequence
UNION ALL SELECT 19 WHERE 19 < F.Sequence
UNION ALL SELECT 20 WHERE 20 < F.Sequence
UNION ALL SELECT 21 WHERE 21 < F.Sequence
UNION ALL SELECT 22 WHERE 22 < F.Sequence
UNION ALL SELECT 23 WHERE 23 < F.Sequence
UNION ALL SELECT 24 WHERE 24 < F.Sequence
UNION ALL SELECT 25 WHERE 25 < F.Sequence
UNION ALL SELECT 26 WHERE 26 < F.Sequence
UNION ALL SELECT 27 WHERE 27 < F.Sequence
UNION ALL SELECT 28 WHERE 28 < F.Sequence
UNION ALL SELECT 29 WHERE 29 < F.Sequence
UNION ALL SELECT 30 WHERE 30 < F.Sequence
) NN
ORDER BY A, pk_date
GO
DROP TABLE #T
DROP TABLE #T1
26 мар 15, 16:36    [17436092]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
Добрый Э - Эх
Guest
a_voronin,

SQL2005: популярные задачи форума и CTE. Задача №1. Генерирование последовательности чисел, дат и т.п.
26 мар 15, 18:07    [17436707]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
a_voronin,

Так не катит?

select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join nums n
	on n.num < t.Sequence
order by A, pk_date

Если конечно предварительно создадим таблицу которую постоянно не будем создавать - пусть хранит себе на здоровье последовательность...
create table nums (num int primary key)
insert nums values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

insert nums
select n1.num+n2.num*10
from nums n1, nums n2
where n1.num+n2.num*10 >= 10
26 мар 15, 18:37    [17436881]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Добрый Э - Эх
a_voronin,

SQL2005: популярные задачи форума и CTE. Задача №1. Генерирование последовательности чисел, дат и т.п.


Только задача не сгенерить, а оптимально использовать в запросе
26 мар 15, 18:58    [17436983]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
zasandator
a_voronin,

Так не катит?

select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join nums n
	on n.num < t.Sequence
order by A, pk_date

Если конечно предварительно создадим таблицу которую постоянно не будем создавать - пусть хранит себе на здоровье последовательность...
create table nums (num int primary key)
insert nums values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

insert nums
select n1.num+n2.num*10
from nums n1, nums n2
where n1.num+n2.num*10 >= 10


Я проверял этот вариант, только в таких вариациях,

CROSS APPLY 
(
	SELECT N FROM Dictionary.N32
	WHERE N <= F.Sequence
) NN


CROSS APPLY 
(
	SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
	ORDER BY N
) NN

уступает предложенному где-то в 2 раза по времени исполнения.
26 мар 15, 19:02    [17436996]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
a_voronin,

Ну... в опщем поезврощалсо... да доступ к таблице дольше чем к константе... но не в 2 раза а процентов на 30...

такой скрипт
+
set statistics time on
go
print '------------ 1'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join nums n
	on n.num < t.Sequence
order by A, pk_date
go

print '------------ 2'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join
( values
	(01),(03),(04),(05),(06),(07),(08),(09),(10),
	(11),(13),(14),(15),(16),(17),(18),(19),(20),
	(21),(23),(24),(25),(26),(27),(28),(29),(30)
) n (num)
	on n.num < t.Sequence
order by A, pk_date
go

print '------------ 3'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t cross apply
( values
	(01),(03),(04),(05),(06),(07),(08),(09),(10),
	(11),(13),(14),(15),(16),(17),(18),(19),(20),
	(21),(23),(24),(25),(26),(27),(28),(29),(30)
) n (num)
where n.num < t.Sequence
order by A, pk_date
go


print '------------ 4'
if object_id('tempdb..#t1') is not null drop table #t1
SELECT pk_date = pk_date + NN.N, A, B = B + NN.N, C 
INTO #T1
FROM #T F
CROSS APPLY 
(
--SELECT TOP 1 N FROM Dictionary.N32
--ORDER BY N
--SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
--ORDER BY N
--SELECT N FROM Dictionary.N32
--WHERE N <= F.Sequence

SELECT 0 N
UNION ALL SELECT 01 WHERE 01 < F.Sequence
UNION ALL SELECT 02 WHERE 02 < F.Sequence
UNION ALL SELECT 03 WHERE 03 < F.Sequence
UNION ALL SELECT 04 WHERE 04 < F.Sequence
UNION ALL SELECT 05 WHERE 05 < F.Sequence
UNION ALL SELECT 06 WHERE 06 < F.Sequence
UNION ALL SELECT 07 WHERE 07 < F.Sequence
UNION ALL SELECT 08 WHERE 08 < F.Sequence
UNION ALL SELECT 09 WHERE 09 < F.Sequence
UNION ALL SELECT 10 WHERE 10 < F.Sequence
UNION ALL SELECT 11 WHERE 11 < F.Sequence
UNION ALL SELECT 12 WHERE 12 < F.Sequence
UNION ALL SELECT 13 WHERE 13 < F.Sequence
UNION ALL SELECT 14 WHERE 14 < F.Sequence
UNION ALL SELECT 15 WHERE 15 < F.Sequence
UNION ALL SELECT 16 WHERE 16 < F.Sequence
UNION ALL SELECT 17 WHERE 17 < F.Sequence
UNION ALL SELECT 18 WHERE 18 < F.Sequence
UNION ALL SELECT 19 WHERE 19 < F.Sequence
UNION ALL SELECT 20 WHERE 20 < F.Sequence
UNION ALL SELECT 21 WHERE 21 < F.Sequence
UNION ALL SELECT 22 WHERE 22 < F.Sequence
UNION ALL SELECT 23 WHERE 23 < F.Sequence
UNION ALL SELECT 24 WHERE 24 < F.Sequence
UNION ALL SELECT 25 WHERE 25 < F.Sequence
UNION ALL SELECT 26 WHERE 26 < F.Sequence
UNION ALL SELECT 27 WHERE 27 < F.Sequence
UNION ALL SELECT 28 WHERE 28 < F.Sequence
UNION ALL SELECT 29 WHERE 29 < F.Sequence
UNION ALL SELECT 30 WHERE 30 < F.Sequence
) NN
ORDER BY A, pk_date
print '------------ finish'


дал такие результаты
+
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 1

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 5117 мс, затраченное время = 6301 мс.

(строк обработано: 753664)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 2 мс.
------------ 2

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 3026 мс, затраченное время = 3810 мс.

(строк обработано: 581632)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 2 мс, истекшее время = 2 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 3104 мс, затраченное время = 3948 мс.

(строк обработано: 581632)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 4

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 3074 мс, затраченное время = 4633 мс.

(строк обработано: 753664)
------------ finish

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Фсе таке джоен побыстрее чучудь чем кросапли.
Ну и... выдача констант через валуес... походу меньше юнион алл которые тоже потребляют ресурс. Хотя... по мне все это почти одно и тоже, принципиально различий нет.
27 мар 15, 22:06    [17442936]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
zasandator,

Только чего-то кол-во строк в трассировке разное.

(строк обработано: 753664)

(строк обработано: 581632)

(строк обработано: 581632)

(строк обработано: 753664)

И можете привести полный скрипт с нужными объектами, а этот сам по себе не исполняется?
27 мар 15, 22:17    [17442962]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
Сори соврал. В запросе пропустил 2,12,22.

+
set statistics time on
go
print '------------ 1'
if object_id('tempdb..#t1') is not null drop table #t1
SELECT pk_date = pk_date + NN.N, A, B = B + NN.N, C 
INTO #T1
FROM #T F
CROSS APPLY 
(
--SELECT TOP 1 N FROM Dictionary.N32
--ORDER BY N
--SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
--ORDER BY N
--SELECT N FROM Dictionary.N32
--WHERE N <= F.Sequence

SELECT 0 N
UNION ALL SELECT 01 WHERE 01 < F.Sequence
UNION ALL SELECT 02 WHERE 02 < F.Sequence
UNION ALL SELECT 03 WHERE 03 < F.Sequence
UNION ALL SELECT 04 WHERE 04 < F.Sequence
UNION ALL SELECT 05 WHERE 05 < F.Sequence
UNION ALL SELECT 06 WHERE 06 < F.Sequence
UNION ALL SELECT 07 WHERE 07 < F.Sequence
UNION ALL SELECT 08 WHERE 08 < F.Sequence
UNION ALL SELECT 09 WHERE 09 < F.Sequence
UNION ALL SELECT 10 WHERE 10 < F.Sequence
UNION ALL SELECT 11 WHERE 11 < F.Sequence
UNION ALL SELECT 12 WHERE 12 < F.Sequence
UNION ALL SELECT 13 WHERE 13 < F.Sequence
UNION ALL SELECT 14 WHERE 14 < F.Sequence
UNION ALL SELECT 15 WHERE 15 < F.Sequence
UNION ALL SELECT 16 WHERE 16 < F.Sequence
UNION ALL SELECT 17 WHERE 17 < F.Sequence
UNION ALL SELECT 18 WHERE 18 < F.Sequence
UNION ALL SELECT 19 WHERE 19 < F.Sequence
UNION ALL SELECT 20 WHERE 20 < F.Sequence
UNION ALL SELECT 21 WHERE 21 < F.Sequence
UNION ALL SELECT 22 WHERE 22 < F.Sequence
UNION ALL SELECT 23 WHERE 23 < F.Sequence
UNION ALL SELECT 24 WHERE 24 < F.Sequence
UNION ALL SELECT 25 WHERE 25 < F.Sequence
UNION ALL SELECT 26 WHERE 26 < F.Sequence
UNION ALL SELECT 27 WHERE 27 < F.Sequence
UNION ALL SELECT 28 WHERE 28 < F.Sequence
UNION ALL SELECT 29 WHERE 29 < F.Sequence
UNION ALL SELECT 30 WHERE 30 < F.Sequence
) NN
ORDER BY A, pk_date
go

print '------------ 3'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join nums n
	on n.num < t.Sequence
order by A, pk_date
go

print '------------ 3'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join
( values
	(00),(01),(02),(03),(04),(05),(06),(07),(08),(19),
	(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
	(20),(21),(12),(23),(24),(25),(26),(27),(28),(29)
) n (num)
	on n.num < t.Sequence
order by A, pk_date
go

print '------------ 4'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t cross apply
( values
	(00),(01),(02),(03),(04),(05),(06),(07),(08),(19),
	(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
	(20),(21),(12),(23),(24),(25),(26),(27),(28),(29)
) n (num)
where n.num < t.Sequence
order by A, pk_date
go

print '------------ finish'

Результат...
+
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 1

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(строк обработано: 753664)

(строк обработано: 1)

Время работы SQL Server:
Время ЦП = 3260 мс, затраченное время = 4352 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(строк обработано: 753664)

(строк обработано: 1)

Время работы SQL Server:
Время ЦП = 5632 мс, затраченное время = 6714 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(строк обработано: 729088)

(строк обработано: 1)

Время работы SQL Server:
Время ЦП = 3713 мс, затраченное время = 4704 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 4

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(строк обработано: 729088)

(строк обработано: 1)

Время работы SQL Server:
Время ЦП = 3759 мс, затраченное время = 4737 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ finish

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Вообще если смотреть план... то по плану вроде values делают... не принципиально апли или жоин - план одинаковый...
хотя по статистикс тайм... твой предложенный запрос вроде быстрее. Но! при нескольких выполнениях результаты разные у меня выходят то один быстрее то другой по времени - полагаю эти копейки зависят от текущих процессов моей домашней винды.

Хотя... знаешь... увеличил в несколько раз количество строк в таблице #T результаты другие...
+
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 1

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 32 мс, истекшее время = 40 мс.

Время работы SQL Server:
Время ЦП = 23462 мс, затраченное время = 65260 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 1 мс.

Время работы SQL Server:
Время ЦП = 35568 мс, затраченное время = 47430 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 2 мс.

Время работы SQL Server:
Время ЦП = 24493 мс, затраченное время = 36676 мс.

(строк обработано: 5832704)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 4

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 2 мс.

Время работы SQL Server:
Время ЦП = 23462 мс, затраченное время = 35581 мс.

(строк обработано: 5832704)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ finish

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
27 мар 15, 22:30    [17443017]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
Пля опять ошибся вместо 09, 19 оставил ))))). Поменяй пока сам ))). Ща тесты отработают выдам результат сюда
27 мар 15, 22:37    [17443031]     Ответить | Цитировать Сообщить модератору
 Re: И снова по последовательность цифр  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
zasandator,

Одинаково по времени... по плану разное... наконец то с 5го раза последовательность до 30 написал правильно ))))

результат
+
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 1

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 31 мс, истекшее время = 40 мс.

Время работы SQL Server:
Время ЦП = 24773 мс, затраченное время = 37180 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 1 мс.

Время работы SQL Server:
Время ЦП = 34585 мс, затраченное время = 45785 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 3

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 2 мс.

Время работы SQL Server:
Время ЦП = 24492 мс, затраченное время = 37110 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ 4

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 2 мс, истекшее время = 2 мс.

Время работы SQL Server:
Время ЦП = 24710 мс, затраченное время = 36242 мс.

(строк обработано: 6029312)
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
------------ finish

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

скрипт полный
+
-- это по сути твой скрипт плюс табличка с числами, которая уже и не нужна но для теста пусть будет.
if object_id('nums','U') is null
	create table nums (num int primary key)
if not exists (select * from nums)
begin
	insert nums values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

	insert nums
	select n1.num+n2.num*10
	from nums n1, nums n2
	where n1.num+n2.num*10 >= 10
end

if object_id('tempdb..#T') is not null drop table #T

CREATE TABLE #T(
pk_date INT NOT NULL, 
A INT NOT NULL, 
B INT NOT NULL, 
C NVARCHAR(1000), 
Sequence TINYINT NOT NULL DEFAULT 1)
GO

INSERT INTO #T VALUES (20110101, 1, 1, REPLICATE('A', 1000), 3), (20110105, 1, 4, REPLICATE('B', 1000), 10), (20110114, 1, 14, REPLICATE('C', 1000), 31 - 14)
INSERT INTO #T VALUES (20110103, 2, 3, REPLICATE('D', 1000), 5), (20110106, 2, 8, REPLICATE('E', 1000), 10), (20110117, 2, 17, REPLICATE('F', 1000), 31 - 17)
INSERT INTO #T VALUES (20110101, 3, 5, REPLICATE('G', 1000), 5), (20110106, 3, 6, REPLICATE('A', 1000), 12), (20110115, 3, 15, REPLICATE('B', 1000), 31 - 15)

INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 50, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 100, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 200, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 500, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 1000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 2000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 5000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 10000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date, A + 20000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date + 100, A + 50000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date + 200, A + 100000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date + 400, A + 200000, B, C, Sequence FROM #T
INSERT INTO #T(pk_date, A, B, C, Sequence )
SELECT pk_date + 800, A + 800000, B, C, Sequence FROM #T
GO
--SELECT Sum(Sequence) FROM #T
go

-- это тесты. можно их запускать отсюда 100500 раз смотреть время исполнения
set statistics time on
go
print '------------ 1'
if object_id('tempdb..#t1') is not null drop table #t1
SELECT pk_date = pk_date + NN.N, A, B = B + NN.N, C 
INTO #T1
FROM #T F
CROSS APPLY 
(
--SELECT TOP 1 N FROM Dictionary.N32
--ORDER BY N
--SELECT TOP (F.Sequence + 1) N FROM Dictionary.N32
--ORDER BY N
--SELECT N FROM Dictionary.N32
--WHERE N <= F.Sequence

SELECT 0 N
UNION ALL SELECT 01 WHERE 01 < F.Sequence
UNION ALL SELECT 02 WHERE 02 < F.Sequence
UNION ALL SELECT 03 WHERE 03 < F.Sequence
UNION ALL SELECT 04 WHERE 04 < F.Sequence
UNION ALL SELECT 05 WHERE 05 < F.Sequence
UNION ALL SELECT 06 WHERE 06 < F.Sequence
UNION ALL SELECT 07 WHERE 07 < F.Sequence
UNION ALL SELECT 08 WHERE 08 < F.Sequence
UNION ALL SELECT 09 WHERE 09 < F.Sequence
UNION ALL SELECT 10 WHERE 10 < F.Sequence
UNION ALL SELECT 11 WHERE 11 < F.Sequence
UNION ALL SELECT 12 WHERE 12 < F.Sequence
UNION ALL SELECT 13 WHERE 13 < F.Sequence
UNION ALL SELECT 14 WHERE 14 < F.Sequence
UNION ALL SELECT 15 WHERE 15 < F.Sequence
UNION ALL SELECT 16 WHERE 16 < F.Sequence
UNION ALL SELECT 17 WHERE 17 < F.Sequence
UNION ALL SELECT 18 WHERE 18 < F.Sequence
UNION ALL SELECT 19 WHERE 19 < F.Sequence
UNION ALL SELECT 20 WHERE 20 < F.Sequence
UNION ALL SELECT 21 WHERE 21 < F.Sequence
UNION ALL SELECT 22 WHERE 22 < F.Sequence
UNION ALL SELECT 23 WHERE 23 < F.Sequence
UNION ALL SELECT 24 WHERE 24 < F.Sequence
UNION ALL SELECT 25 WHERE 25 < F.Sequence
UNION ALL SELECT 26 WHERE 26 < F.Sequence
UNION ALL SELECT 27 WHERE 27 < F.Sequence
UNION ALL SELECT 28 WHERE 28 < F.Sequence
UNION ALL SELECT 29 WHERE 29 < F.Sequence
UNION ALL SELECT 30 WHERE 30 < F.Sequence
) NN
ORDER BY A, pk_date
option(recompile)
go

print '------------ 3'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join nums n
	on n.num < t.Sequence
order by A, pk_date
option(recompile)
go

print '------------ 3'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t join
( values
	(00),(01),(02),(03),(04),(05),(06),(07),(08),(09),
	(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
	(20),(21),(22),(23),(24),(25),(26),(27),(28),(29)
) n (num)
	on n.num < t.Sequence
order by A, pk_date
option(recompile)
go

print '------------ 4'
if object_id('tempdb..#t1') is not null drop table #t1
select
	pk_date = pk_date + n.num,
	A,
	B = B + n.num,
	C,
	t.Sequence, n.num
into #t1
from #T t cross apply
( values
	(00),(01),(02),(03),(04),(05),(06),(07),(08),(09),
	(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
	(20),(21),(22),(23),(24),(25),(26),(27),(28),(29)
) n (num)
where n.num < t.Sequence
order by A, pk_date
option(recompile)
go

print '------------ finish'
set statistics time off
27 мар 15, 22:47    [17443081]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить