Home - www.devmedia.com.br


Tabelas Temporárias

por Paulo Ribeiro

Tabelas Temporárias, como o próprio nome sugere, são tabelas utilizadas para armazenamento provisório de dados.

Como criar

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

·         Tabelas Temporárias Locais são criadas com o prefixo "#" e possuem visibilidade restrita para a conexão responsável por sua criação; outras conexões não "enxergam" a tabela.
·         Tabelas Temporárias Globais são criadas com o prefixo "##" e são visíveis por todas as conexões

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.

Exemplos de utilização

Exemplo-1:

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


Exemplo-2:

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


Dicas

·         Muitas vezes testamos repetidas vezes um batch que cria tabelas temporárias. Para evitar erros do tipo...

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


ou

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


... 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)
)


·         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” ou, como veremos em nosso próximo encontro, por armazenamento temporário em variáveis tipo table.

Bem, ficamos por aqui.

Até a próxima!

 

 

Paulo Ribeiro (psribeiro@hotmail.com) é Microsoft MCDBA e membro da equipe editorial da SQL Magazine. Atua como DBA sênior em SQL Server na Livraria e Papelaria Saraiva S/A.

  Monitorando deadlocks com Trace Flags    
  Monitorando deadlocks com o Profiler    
  Variáveis tipo TABLE    
  Tabelas Temporárias    
  Subqueries Parte II: Queries correlatas    
  Subqueries – Parte I    
  Gerenciando Bloqueios–Parte II    
  Gerenciando Bloqueios–Parte I    
  Porque qualificar o owner na chamada de stored-procedures    
  Explorando os Tipos de Join – Parte II    
  Explorando os Tipos de Join – Parte I    
  Versões existentes do SQL Server 2000    
  Tuning - Plano de Execução no SQL Server - Parte 4    
  Tuning - Plano de Execução no SQL Server - Parte 3    
  Tuning - Plano de Execução no SQL Server - Parte 2    
  Tuning - Plano de Execução no SQL Server - Parte 1    
  Tuning - Estatísticas de I/O    
  Desfragmentando Índices no SQL Server    
  Procedures Não Documentadas
no SQL Server 2000 Parte 2
   
  Procedures Não Documentadas
no SQL Server 2000.
   
  SQL Server 2005 - YUKON    
  SQL Server 2000: o Contra-Ataque.    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group
SQL Magazine - 2004