Tabelas Temporárias

Como o próprio nome sugere, são tabelas utilizadas para armazenamento provisório de dados e veremos neste artigo sua implementação no SQL Server.

Como criar

Tabelas Temporárias são criadas no database TempDB e podem ser classificadas em Locais e Globais:

Nos dois casos, o database TempDB não deve ser referenciado como parte do nome da tabela.

Como dropar

Uma tabela temporária (Local ou Global) só existe enquanto a conexão responsável pela sua criação estiver ativa. O momento da desconexão, tabelas temporárias remanescentes serão dropadas automaticamente.

Exemplo-1:

create table #temp ( cod_cli int, nome_cli varchar(50) ) insert into #temp values (1,'Livia') select * from #temp

Exemplo 1

select ano = year(OrderDate), qtde_pedidos = count(*) into ##temp from northwind.dbo.orders group by year(OrderDate

Exemplo 2

Dicas

Muitas vezes testamos repetidas vezes um batch que cria tabelas temporárias:

Server: Msg 2714, Level 16, State 6, Line 1 There is already an object named '#temp' in the database.

Erro 1

Ou

Server: Msg 208, Level 16, State 1, Line 1 Invalid object name '#temp'.

Erro 1

... verifique se a tabela temporária existe ANTES de sua criação através da função OBJECT_ID():

if object_id('tempdb.dbo.#temp') is not null drop table #temp create table #temp ( cod_cli int, nome_cli varchar(50) )

função OBJECT_ID()

Quando utilizar tabelas temporárias em procedures, procure criar todas as tabelas temporárias num mesmo ponto. Intercalar comandos DDL (CREATE TABLE, CREATE INDEX, etc) com comandos DML (INSERT, UPDATE, SELECT, etc) é causa frequente de recompilações.

Portanto substitua:

create proc stp_recompile as --DDL create table #temp1 ( cod_cli int, nome_cli varchar(50)) --DML insert into #temp1 values (1,'cliente-1') --DDL create clustered index ix_temp on #temp1 (cod_cli) --DML select * from #temp1 RETURN

Por

create proc stp_NOT_recompile as --DDL create table #temp1 ( cod_cli int, nome_cli varchar(50)) create clustered index ix_temp on #temp1 (cod_cli) --DML insert into #temp1 values (1,'cliente-1') select * from #temp1 RETURN

Para visualizar as recompilações do batch a seguir no profiler:

exec stp_recompile go exec stp_recompile go exec stp_NOT_recompile go exec stp_NOT_recompile go
Conclusão

Tabelas temporárias ajudam muito no dia-a-dia, mas devemos ter em mente que sua utilização exige gravação em disco, e gravação em disco é sinônimo de baixa performance. Muitas vezes a utilização de tabelas temporárias pode ser substituída por joins “mais bem trabalhados”.

Bem, ficamos por aqui.

Até a próxima!

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados