Автор: Alexey Knyazev
Теперь мы можем ускорять выполнение SELECT INTO благодаря распараллеливанию.
Демонстрация:
SQL Server 2012
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) Dec 28 2012 20:23:12 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
SQL Server 2014 CTP1
Microsoft SQL Server 2014 (CTP1) - 11.0.9120.5 (X64) Jun 10 2013 20:09:10 Copyright (c) Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
На обоих версиях создадим таблицу dbo.test_table и наполним тестовыми данными (65536 записей)
set nocount on; go if object_id( N'dbo.test_table', N'U' ) is not null drop table dbo.test_table; go create table dbo.test_table ( id int primary key , dt datetime default getdate() , uniqid uniqueidentifier default newid() , val nvarchar(1024) default replicate( 'A', 1024 ) ); go with cte1 as ( select t1.* from ( values(1),(1) ) t1(i) ) , cte2 as ( select t2.* from cte1 t1 cross join cte1 t2 ) , cte3 as ( select t3.* from cte2 t2 cross join cte2 t3 ) , cte4 as ( select t4.* from cte3 t3 cross join cte3 t4 ) , cte5 as ( select t5.* from cte4 t4 cross join cte4 t5 ) insert into dbo.test_table ( id ) select row_number() over ( order by (select null) ) as id from cte5; go
После этого мы «перекинем» все эти данные во временную таблицу с помощью инструкции SELECT…INTO
set statistics time on; set statistics io on; go checkpoint; dbcc dropcleanbuffers; go select * into #t from dbo.test_table; go
И сравним планы выполнения:
SQL Server 2012
SQL Server 2014