Tabelas Temporárias

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

Veja neste artigo 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


18-08pic01.JPG
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!

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?