Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Таблица содержит 100 млн записей.
Иерархия представлена в ней как ид, парент_ид, никаких дополнительных данных об иерархии нету.
Таблица содержит дерево с одним корнем.

Что хочу сделать: добавить поле hierarchy hierarchyid и заполнить это поле значениями.

сделал скрипт, отработал за 15 часов. Это фигня, а не скрипт .

Можно ли решить такую задачу за вменяемое время, ну 1 час, ну 2, ну пусть 3.

Вот.
12 июл 13, 13:01    [14557394]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Гость333
Member

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

Структура таблицы, индексы, количество уровней иерархии, количество "детей" у узлов дерева, сам скрипт, наконец?..
12 июл 13, 13:30    [14557669]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
sttt5
Guest
Winnipuh,

собрал машину, проехал из точки А в точку Б, за 5 часов, вопрос - быстрее можно?
12 июл 13, 13:35    [14557720]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
sttt5
Winnipuh,

собрал машину, проехал из точки А в точку Б, за 5 часов, вопрос - быстрее можно?


можно, если ехать по другой дороге, если заправить лучшим бензином, если не тормозить и т.д..
12 июл 13, 13:45    [14557804]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

Структура таблицы, индексы, количество уровней иерархии, количество "детей" у узлов дерева, сам скрипт, наконец?..



вот одна из инкарнаций:
CREATE TABLE [dbo].[nodes_ex6]
(
	[int_id] [int] NOT NULL,
	[int_parent_id] [int] NOT NULL,
	[id] [uniqueidentifier] NOT NULL,
	[parent_id] [uniqueidentifier] NOT NULL,
	[type] [int] NOT NULL,
	[hier] [hierarchyid] NULL,
	[_level]  AS ([hier].[GetLevel]())
) ON [PRIMARY]
GO

-------------------------- 100 000 000 rows

alter table nodes_ex6 add hier HierarchyId;
alter table nodes_ex6 add _level as hier.GetLevel();
 
CREATE NONCLUSTERED INDEX [IX_nodes_ex6_level_int_parent_id] ON [dbo].[nodes_ex6] 
(int_parent_id, hier) include ( int_id )
CREATE NONCLUSTERED INDEX [IX_nodes_ex6_int_id_hier] ON [dbo].[nodes_ex6] (int_id) include ( hier )
CREATE NONCLUSTERED INDEX [IX_nodes_ex6_int_id_level] ON [dbo].[nodes_ex6] (int_id, _level)

-- get roots 
UPDATE LP SET hier = P2.hier FROM nodes_ex6 LP
INNER JOIN 
(
 SELECT hierarchyid::GetRoot().ToString() + CAST(int_id   AS VARCHAR(30) ) + '/' hier, int_id
 FROM nodes_ex6
 WHERE 
 (hier IS NULL /*AND int_parent_id IS NULL*/ and type=2)
 OR
 (hier IS NULL AND int_parent_id=int_id and type=7000)
) P2 ON (LP.int_id = P2.int_id )

----------

declare @s nvarchar(100)
declare @level int
declare @rows int

select @level= max(isnull(_level,0)) from nodes_ex6 with(nolock);
set @rows = 0;
set @s = N'start: @level='+cast(@level as nvarchar(12))+N' ; '+cast(getdate() as nvarchar(100))
RAISERROR(@s,0,1) with nowait

WHILE (1=1) 
BEGIN 
	begin tran
		UPDATE LP2 SET hier = P2.hier
			FROM nodes_ex6 LP2
			INNER JOIN (
			 SELECT OP.hier.ToString() + CAST(LP.int_id AS VARCHAR(30) ) + '/'  hier, LP.int_id  
			 FROM nodes_ex6 LP
			 INNER JOIN nodes_ex6 OP 
			 ON ( LP.int_parent_id = OP.int_id	and OP._level=@level)
			) P2 ON (LP2.int_id = P2.int_id )
			set @rows = @@ROWCOUNT;

		IF ( @rows = 0 ) 
		begin
				if @@TRANCOUNT>0
					commit tran;
			BREAK; 
		end
		set @s = N'progress: @level='+cast(@level as nvarchar(12))+N' ; '+cast(getdate() as nvarchar(100))
		RAISERROR(@s,0,1)  with nowait
	commit tran;
	set @level = @level + 1;
END 


-- if @@TRANCOUNT>0 rollback tran;

set @s = N'end: '+cast(getdate() as nvarchar(100))
RAISERROR(@s,0,1)  with nowait
12 июл 13, 14:03    [14557995]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
CREATE TABLE [dbo].[nodes_ex6]
(
	[int_id] [int] NOT NULL,
	[int_parent_id] [int] NOT NULL,
	[id] [uniqueidentifier] NOT NULL,
	[parent_id] [uniqueidentifier] NOT NULL,
	[type] [int] NOT NULL,
	[hier] [hierarchyid] NULL,
	[_level]  AS ([hier].[GetLevel]())
) ON [PRIMARY]

Первичный ключ есть на этой таблице?
12 июл 13, 14:17    [14558136]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
CREATE TABLE [dbo].[nodes_ex6]
(
	[int_id] [int] NOT NULL,
	[int_parent_id] [int] NOT NULL,
	[id] [uniqueidentifier] NOT NULL,
	[parent_id] [uniqueidentifier] NOT NULL,
	[type] [int] NOT NULL,
	[hier] [hierarchyid] NULL,
	[_level]  AS ([hier].[GetLevel]())
) ON [PRIMARY]

Первичный ключ есть на этой таблице?



нету, я ее создавал из другой инсертом, там индексы те, которые в скрипте
12 июл 13, 14:48    [14558451]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
CREATE TABLE [dbo].[nodes_ex6]
(
	[int_id] [int] NOT NULL,
	[int_parent_id] [int] NOT NULL,
	[id] [uniqueidentifier] NOT NULL,
	[parent_id] [uniqueidentifier] NOT NULL,
	[type] [int] NOT NULL,
	[hier] [hierarchyid] NULL,
	[_level]  AS ([hier].[GetLevel]())
) ON [PRIMARY]

Первичный ключ есть на этой таблице?


точнее так:

его сейчас нету, но ПК может быть поле int_id или id.
12 июл 13, 15:07    [14558625]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
Гость333
пропущено...
Первичный ключ есть на этой таблице?

нету

Если добавить ПК, то из плана запроса для UPDATE уйдёт операция сортировки. Это может дать существенное ускорение.

На время работы запроса я бы создал постоянный (невычисляемый) столбец level, вместо вычисляемого "[_level] AS ([hier].[GetLevel]())". Сэкономились бы вызовы CLR-метода GetLevel.

Далее, таки остались непонятны параметры дерева (кроме общего количества узлов = 100 млн). То есть какая стратегия доступа (loop/hash) выгоднее на разных итерациях цикла.

На таблице созданы три индекса — смотрели планы запросов, все три используются для доступа к данным? Или по некоторым из них делается только операция Index Update? Если так, то лучше такие индексы создать уже после отработки скрипта.
12 июл 13, 16:08    [14559134]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
пропущено...

нету

Если добавить ПК, то из плана запроса для UPDATE уйдёт операция сортировки. Это может дать существенное ускорение.

На время работы запроса я бы создал постоянный (невычисляемый) столбец level, вместо вычисляемого "[_level] AS ([hier].[GetLevel]())". Сэкономились бы вызовы CLR-метода GetLevel.

Далее, таки остались непонятны параметры дерева (кроме общего количества узлов = 100 млн). То есть какая стратегия доступа (loop/hash) выгоднее на разных итерациях цикла.

На таблице созданы три индекса — смотрели планы запросов, все три используются для доступа к данным? Или по некоторым из них делается только операция Index Update? Если так, то лучше такие индексы создать уже после отработки скрипта.


сейчас строю ПК, с левел тоже сделаю постоянным.

Вот в плане смотрю Index Scan по индексу IX_nodes_ex6_level_int_id, я так понимаю из-за того, что много записей с одинаковым левелом..
12 июл 13, 17:21    [14559727]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Сделал ПК, сделал левел постоянным полем.

теперь на сравнении

[dbo].[nodes_ex6].[_level] as [OP].[_level]=[@level]


пишет Clustered Index Scan (100%)
12 июл 13, 18:08    [14560029]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
по параметрам дерева:

базы разные бывают, но при нормальных раскладах уровней 20-30 максимум.
В данном случае в базе, где я тестирую 21 уровень максимум.
12 июл 13, 18:10    [14560045]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гость333
Если добавить ПК, то из плана запроса для UPDATE уйдёт операция сортировки. Это может дать существенное ускорение.
Да я вообще не понимаю половину.
Нафига дёргать ID/
Нафига дёргать level.

Надо было изначально поставить Order по паренту.

Гость333
На время работы запроса я бы создал постоянный (невычисляемый) столбец level, вместо вычисляемого "[_level] AS ([hier].[GetLevel]())". Сэкономились бы вызовы CLR-метода GetLevel.
Втопку. В тоге он должен быть чисто вычисляемым (возможно persisted, индексируемый).
И не надо было Update. Надо было вставками в таблу делать. По каждому уровню.
Следить за локами - всю таблу под себя сразу брать.
Возможно уменьшить объём вставок, т.е. поделить условно. Всё равно задача одноразовая.
Можно вообще маленькую таблу сначала сварганить (# ?), а далее уже слить в одну, потоком.
Строки генерить постоянно тоже плохо, но тут надо смотреть в чём проблема.
Естественно что выборка должна быть из основной таблы по Parеnt + Order (индексно).
Проблема ещё в том чтобы не было вставки в середину. Т.е. надо запоточить вставку. Т.е. табла должна быть кластеризована тоже по parent (+ order).

Гость333
Если так, то лучше такие индексы создать уже после отработки скрипта.
Естественно.
12 июл 13, 18:12    [14560053]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Winnipuh
базы разные бывают, но при нормальных раскладах уровней 20-30 максимум.
В данном случае в базе, где я тестирую 21 уровень максимум.
А распределённость какая?
Сколько данных с уровнем до 5;10;15;20 соответсвенно.
Такое ощущение что дерево глубокое и узкое.

автор
базы разные бывают
Не разовая задача, а "решение"? Вот ёп.
12 июл 13, 18:19    [14560080]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Mnior
Winnipuh
базы разные бывают, но при нормальных раскладах уровней 20-30 максимум.
В данном случае в базе, где я тестирую 21 уровень максимум.
А распределённость какая?
Сколько данных с уровнем до 5;10;15;20 соответсвенно.
Такое ощущение что дерево глубокое и узкое.

автор
базы разные бывают
Не разовая задача, а "решение"? Вот ёп.


оно разовое, но базы могут быть разные, собственно, если сработает в данном случае, то срабоатет для всех
без проблем.
Так что можно считать одна база.

По дереву: вот по уровням, начиная с корня расклад:

--start: @level=0 ; Jul 11 2013  4:39PM
--(21 row(s) affected)

--start: @level=1 ; Jul 11 2013  4:39PM
--(13671 row(s) affected)

--start: @level=2 ; Jul 11 2013  4:39PM
--(48918 row(s) affected)

--start: @level=3 ; Jul 11 2013  4:39PM
--(69688 row(s) affected)

--start: @level=4 ; Jul 11 2013  4:40PM
--(502789 row(s) affected)

--start: @level=5 ; Jul 11 2013  4:41PM
--(2323533 row(s) affected)

--start: @level=6 ; Jul 11 2013  5:03PM
--(2074537 row(s) affected)

--start: @level=7 ; Jul 11 2013  5:21PM
--(5207111 row(s) affected)

--start: @level=8 ; Jul 11 2013  6:10PM
--(7407885 row(s) affected)

--start: @level=9 ; Jul 11 2013  7:27PM
--(15770974 row(s) affected)

--start: @level=10 ; Jul 11 2013 10:00PM
--(21205160 row(s) affected)

--start: @level=11 ; Jul 12 2013  1:26AM
--(21706632 row(s) affected)

--start: @level=12 ; Jul 12 2013  5:06AM
--(16737752 row(s) affected)

--start: @level=13 ; Jul 12 2013  7:47AM
--(7722552 row(s) affected)

--start: @level=14 ; Jul 12 2013  9:00AM
--(2530461 row(s) affected)

--start: @level=15 ; Jul 12 2013  9:27AM
--(411745 row(s) affected)

--start: @level=16 ; Jul 12 2013  9:34AM
--(107471 row(s) affected)

--start: @level=17 ; Jul 12 2013  9:35AM
--(76304 row(s) affected)

--start: @level=18 ; Jul 12 2013  9:36AM
--(73128 row(s) affected)

--start: @level=19 ; Jul 12 2013  9:37AM
--(72931 row(s) affected)

--start: @level=20 ; Jul 12 2013  9:37AM
--(72898 row(s) affected)
12 июл 13, 18:25    [14560107]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ Распределение
;WITH T AS (SELECT * FROM (VALUES
 (0,1)
,(1,21)
,(2,13671)
,(3,48918)
,(4,69688)
,(5,502789)
,(6,2323533)
,(7,2074537)
,(8,5207111)
,(9,7407885)
,(10,15770974)
,(11,21205160)
,(12,21706632)
,(13,16737752)
,(14,7722552)
,(15,2530461)
,(16,411745)
,(17,107471)
,(18,76304)
,(19,73128)
,(20,72931)
,(21,72898)
) T ([Level],[Count]))
SELECT	T.*,T.[Count] / (P.[Count] + 0.0)
FROM	T AS T LEFT JOIN T AS P ON P.[Level] = T.[Level] - 1

01NULL
12121.0000000000000
213671651.0000000000000
3489183.5782312925170
4696881.4245880861850
55027897.2148576512455
623235334.6212884530091
720745370.8928373300486
852071112.5100111494757
974078851.4226477983665
10157709742.1289442263210
11212051601.3445688262500
12217066321.0236485836466
13167377520.7710893150075
1477225520.4613852565147
1525304610.3276716038946
164117450.1627154103540
171074710.2610134913599
18763040.7099961850173
19731280.9583770182428
20729310.9973060934252
21728980.9995475175165
Мда, но гаусу. :) Смесь разных деревьев.
В целом данных на уровень не много. Данных на один парент мало.

Согласен что проблема со считыванием. Имея изначально подсчитанный level на основе парент. Можно было всё ускорить.
Но подсчёт level (и Order) заранее это уже практически высчитать дерево.

Hash кстати возможно и не поместится в оперативе (21 706 632). 21 рескан таблы тоже зашибись. Но ничего не поделаешь Ведь задача ведь получить порядок из беспорядка.
12 июл 13, 20:39    [14560475]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
2 Mnior

Мда, но гаусу. :) Смесь разных деревьев.
В целом данных на уровень не много. Данных на один парент мало.

Согласен что проблема со считыванием. Имея изначально подсчитанный level на основе парент. Можно было всё ускорить.
Но подсчёт level (и Order) заранее это уже практически высчитать дерево.

Hash кстати возможно и не поместится в оперативе (21 706 632). 21 рескан таблы тоже зашибись. Но ничего не поделаешь Ведь задача ведь получить порядок из беспорядка.



то-то и оно.... потому и обратился за помощью ;-)
12 июл 13, 21:41    [14560694]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ Вариант 1
/* -- Имеем на реальной табле
CREATE TABLE dbo.RealTable (
	 ID	Int	PRIMARY KEY
	,Parent	Int	REFERENCES dbo.RealTable (ID)
)
CREATE INDEX IX_Parent ON dbo.RealTable (Parent)

*/
CREATE TABLE #Tree (
	 ID	Int		PRIMARY KEY	-- Как у кластерного должно быть, чтобы слить через Merge
	,HID	HierarchyID	NOT NULL
)
CREATE TABLE #Ins1 (ID Int PRIMARY KEY, HID HierarchyID)
CREATE TABLE #Ins2 (ID Int PRIMARY KEY, HID HierarchyID)
DECLARE @Level Int = 1

--INSERT	#Tree	VALUES (0,HierarchyID::GetRoot())	-- В зависимости от, имеется ли голова
;WITH Tree AS (
	SELECT	ID, '/' + Convert(VarChar,Row_Number()OVER(ORDER BY ID)) + '/' AS [Path]
	FROM	dbo.RealTable
	WHERE	Parent IS NULL
)INSERT	#Tree	-- Сортировка поможет
OUTPUT	inserted.ID, inserted.HID
INTO	#Ins1
SELECT	ID, HierarchyID::Parse([Path])
FROM	Tree	T;

WHILE (@@RowCount > 0) BEGIN
	TRUNCATE TABLE #Ins2; SET @Level += 1; RAISERROR('Level %d',0,1,@Level) WITH NoWait;

	WITH Tree AS (
		SELECT	R.ID, I.HID.ToString() + Row_Number()OVER(PARTITION BY R.Parent ORDER BY R.ID) + '/' AS [Path]
		FROM	#Ins1		I INNER MERGE		-- Должно само сработать
		JOIN	dbo.RealTable	R ON R.Parent = I.ID	-- По индексу IX_Parent
	)INSERT	#Tree
	OUTPUT	inserted.ID, inserted.HID
	INTO	#Ins2	-- Лишняя сортировка :(
	SELECT	ID, HierarchyID::Parse([Path])
	FROM	Tree	T
	ORDER BY ID;	-- :(

	IF (@@RowCount > 0) BREAK;
	TRUNCATE TABLE #Ins1; SET @Level += 1; RAISERROR('Level %d',0,1,@Level) WITH NoWait;

	WITH Tree AS (
		SELECT	R.ID, I.HID.ToString() + Row_Number()OVER(PARTITION BY R.Parent ORDER BY R.ID) + '/' AS [Path]
		FROM	#Ins2		I INNER MERGE		-- Должно само сработать
		JOIN	dbo.RealTable	R ON R.Parent = I.ID	-- По индексу IX_Parent
	)INSERT	#Tree
	OUTPUT	inserted.ID, inserted.HID
	INTO	#Ins1
	SELECT	ID, HierarchyID::Parse([Path])
	FROM	Tree	T
	ORDER BY ID;	-- :(
END
TRUNCATE TABLE #Ins2;

INSERT	dbo.RealTableNew
SELECT	*	-- Перечислить
FROM	dbo.RealTable	R -- INNER MERGE
JOIN	#Tree		T ON T.ID = R.ID
Отдельные дополнительные таблы ещё экономят место.
Двойная сортировка неизбежна, зато быстрая вставка.

Через команду Merge и хранение Path в виде строки объём больше но на один вызов CLR меньше.
+ Вариант 2
/* -- Имеем на реальной табле
CREATE TABLE dbo.RealTable (
	 ID	Int	PRIMARY KEY
	,Parent	Int	REFERENCES dbo.RealTable (ID)
)
CREATE INDEX IX_Parent ON dbo.RealTable (Parent)
*/

CREATE TABLE #Tree (
	 ID	Int		PRIMARY KEY	-- Как у кластерного должно быть, чтобы слить через Merge
	,HID	HierarchyID	NOT NULL
)
CREATE TABLE #Ins1 (ID Int PRIMARY KEY, Path VarChar(4000) NOT NULL) -- 4000 это много лучше подобрать
CREATE TABLE #Ins2 (ID Int PRIMARY KEY, Path VarChar(4000) NOT NULL) -- тем более что в конце мало строк
DECLARE @Level Int = 1

--INSERT	#Tree	VALUES (0,HierarchyID::GetRoot())	-- В зависимости от, имеется ли голова
;WITH Tree (ID,[Path]) AS (
	SELECT	ID, '/' + Convert(VarChar,Row_Number()OVER(ORDER BY ID)) + '/'
	FROM	dbo.RealTable
	WHERE	Parent IS NULL
)MERGE	#Tree	T
USING	Tree	S ON 1 = 0 -- S.ID = T.ID
WHEN	NOT MATCHED	THEN
INSERT	(ID, HID)
VALUES	(ID, HierarchyID::Parse([Path]))
OUTPUT	inserted.ID,S.[Path]
INTO	#Ins1	(ID,  [Path]);

WHILE (@@RowCount > 0) BEGIN
	TRUNCATE TABLE #Ins2; SET @Level += 1; RAISERROR('Level %d',0,1,@Level) WITH NoWait;

	WITH Tree (ID,[Path]) AS (
		SELECT	R.ID, I.[Path] + Row_Number()OVER(PARTITION BY R.Parent ORDER BY R.ID) + '/'
		FROM	#Ins1		I INNER MERGE		-- Должно само сработать
		JOIN	dbo.RealTable	R ON R.Parent = I.ID	-- По индексу IX_Parent
	)MERGE	#Tree	T
	USING	Tree	S ON 1 = 0 -- S.ID = T.ID
	WHEN	NOT MATCHED	THEN
	INSERT	(ID, HID)
	VALUES	(ID, HierarchyID::Parse([Path]))
	OUTPUT	inserted.ID,S.[Path]
	INTO	#Ins1	(ID,  [Path]);

	IF (@@RowCount > 0) BREAK;
	TRUNCATE TABLE #Ins1; SET @Level += 1; RAISERROR('Level %d',0,1,@Level) WITH NoWait;

	WITH Tree (ID,[Path]) AS (
		SELECT	R.ID, I.[Path] + Row_Number()OVER(PARTITION BY R.Parent ORDER BY R.ID) + '/'
		FROM	#Ins2		I INNER MERGE		-- Должно само сработать
		JOIN	dbo.RealTable	R ON R.Parent = I.ID	-- По индексу IX_Parent
	)MERGE	#Tree	T
	USING	Tree	S ON 1 = 0 -- S.ID = T.ID
	WHEN	NOT MATCHED	THEN
	INSERT	(ID, HID)
	VALUES	(ID, HierarchyID::Parse([Path]))
	OUTPUT	inserted.ID,S.[Path]
	INTO	#Ins1	(ID,  [Path]);
END
TRUNCATE TABLE #Ins2;

INSERT	dbo.RealTableNew
SELECT	*	-- Перечислить
FROM	dbo.RealTable	R -- INNER MERGE
JOIN	#Tree		T ON T.ID = R.ID
Но на самом деле CLR не сильно дорогой.
Можно ещё сделать чтобы HierarchyID вычислялся на последнем этапе. И кстати лучше его разбить на куски.
И возможно надо разбить на куски и промежуточные этапы.
12 июл 13, 22:03    [14560770]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
хых... спасибо!

как протестирую - отпишусь
13 июл 13, 00:15    [14561237]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Tobol
Member

Откуда:
Сообщений: 1
Большое спасибо
15 июл 13, 06:42    [14564946]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Tobol и Winnipuh — один и тот же человек?
15 июл 13, 10:21    [14565581]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
bacalavr
Member

Откуда:
Сообщений: 311
Гость333,

Tobol - это спам, судя по всему
15 июл 13, 10:27    [14565645]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Tobol и Winnipuh — один и тот же человек?


нет
15 июл 13, 10:55    [14565847]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Гость333
Member

Откуда:
Сообщений: 3683
bacalavr
Гость333,

Tobol - это спам, судя по всему

А, точно, посмотрел к нему в профиль...
15 июл 13, 11:05    [14565956]     Ответить | Цитировать Сообщить модератору
 Re: HierarchyID: простая задача  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
2 Mnior:

адаптирую ваши скрипты для эксперимента.

Вопрос: что за таблица Tree?
15 июл 13, 11:26    [14566165]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить