Как стать автором
Обновить

Комментарии 5

Адовое заполнение таблицы в цикле. При таком способе дальше воспринимать информацию, извините, уже сложно.

По существу вопроса - обычно, если в плане уже все параллелится, то запрос потенциально нежизнеспособен - так как O(n^2) - это суть ускользающая красота. Оно нам подвластно только для очень малых n, и частично подвластно линейным увеличением обрабатывающих устройств (т.е. процессоров) в очень узком диапазоне. Чуть больше n - и все, упустили. А ведь БД - это система массового обслуживания. Ваш запрос - не президенсткий кортеж, который лочит намертво все, что ему хоть как-то мешает, и забирает себе все доступные для его проезда ресурсы. Значит, во время параллельной езды по строкам таблиц в N утюгов все остальные будут ждать.

P.S. Заполнить миллион строк можно вложенным кросс-джойном с каким-нибудь ядром (0..9) в CTE и с row_number() в качестве числогенерирующего агента, либо вообще поразрядным умножением составляющих этого кросс-джойна. Нужен пример - пришлю.

declare @test table (pk int primary key clustered, dummy1 int, dummy2 int)

insert into @test
select
	q.num + 1,
	q.num + 1,
	q.num + 1
from (
	select 
		q0.i + q1.i * 10 + q2.i * 100 + q3.i * 1000 + q4.i * 10000 + q5.i * 100000 as num
	from (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q0
	cross join (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q1
	cross join (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q2
	cross join (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q3
	cross join (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q4
	cross join (
		select 0 i union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
	) q5
) q
order by q.num


CTE (если не рекурсивный) - суть синтаксический сахар. Да, тупо писать 6 раз подряд одно и то же, но 1) CTE появился уже 17 лет как, 2) время выполнения этой лапши - от силы пара секунд, в отличие от нескольких минут для вставки "в лоб".

Адский цикл заменить адским копипастом, это конечно выход :))))

Ну так живите сегодняшним днём, а не вчерашним ;) - для этого новые фичи и выходят, чтобы ими пользоваться. И потом - никто не запрещает кросс-джойнить какие-нибудь существующие таблицы, типа sysobjects, или написать свою TVF. А вот выплевывать по строчке для системы массового обслуживания - это возить на грузовике по одному кирпичу за рейс.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации