Inserindo registros usando INSERT/SELECT

Recentemente precisei realizar testes de desempenho de disco, simulando diversas operações como SELECT e INSERT, porém para tal eu necessitava de tabela(s) com registros para os testes, e um problema que encontrei foi: como inserir os registros ?

Inicialmente a primeira opção que me veio á cabeça foi usar um loop WHILE, inserindo 100 mil registros, mas isso não seria um teste realístico, se considerarmos que esse tipo de recurso realiza a operação linha a linha, e o SQL Server foi desenvolvido usando o conceito de conjuntos matemáticos, então tive que descartar o loop. Mas veio a pergunta: e se eu usar uma tabela como base, gerando registros usando o While, e realizar os testes de inserts em uma segunda tabela, usando um INSERT…SELECT tendo a primeira tabela como fonte ?

Vamos aos testes:

Usarei o banco de dados AdventureWorks2012


--Criando as tabelas dbo.TabelaBase e dbo.Tabela1

CREATE TABLE Dbo.TabelaBase (
Col1 int,
Col2 varchar(5)
)
GO

CREATE TABLE Dbo.Tabela1 (
Col1 int,
Col2 varchar(5)
)
GO
-- Insere 100.000 linhas na tabela dbo.Tabelabase, que será usada como base

DECLARE @inst int = 1
WHILE @inst <= 100000
BEGIN
 INSERT INTO Dbo.TabelaBase VALUES (@inst, 'abcde')
 SET @inst = @inst + 1
END
-- Consultando a tabela dbo.TabelaBase, para identificar se os registros foram inseridos

SELECT Col1, Col2 FROM dbo.TabelaBase

Select_tabelabase

-- Primeiro executo os comandos abaixo para "limpar" a memória

CHECKPOINT
DBCC DROPCLEANBUFFERS

-- Inserindo registros na tabela dbo.Tabela1, usando a tabela dbo.TabelaBase como origem dos dados


INSERT INTO dbo.Tabela1 (Col1, Col2)
SELECT Col1, Col2 FROM dbo.TabelaBase

-- Consultando a tabela dbo.Tabela1, para identificar se os registros foram inseridos

SELECT Col1, Col2 FROM dbo.Tabela1

Select_tabela1

Para medir o desempenho das operações nas 2 tabelas, usei o software SQLQueryStress, e na imagem abaixo podemos ver a diferença de desempenho usando o WHILE e o INSERT…SELECT (Observe o campo Elapsed Time, gritante, concorda ?)

SQLStress_While

SQLStress_INSERT

Abraços e até a próxima !

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s