Home - www.devmedia.com.br


Porque qualificar o owner na chamada de stored-procedures

Ao referenciar uma stored-procedure no SQL Server 2000, NÃO estamos acostumados a especificar o owner do objeto como parte do comando. Optamos por utilizar ...

exec stp_teste

... no lugar de

exec dbo.stp_teste

A procedure stp_teste poderia conviver pacificamente com uma procedure de mesmo nome, criada no mesmo database por outro usuário. Isso não é uma prática comum, mas pode acontecer. Como fazer então para executar uma procedure de mesmo nome, criada por usuários diferentes ?

... para executar a procedure stp_teste cujo owner é dbo :

exec dbo.stp_teste

... para executar a procedure stp_teste criada pelo usuário usersqlmag :

exec usersqlmag.stp_teste

Pois bem, vimos que o owner  é parte integrante do nome da procedure e é fundamental para que o SQL Server 2000 consiga identificar corretamente o objeto. Agora o que aconteceria se NÃO especificássemos  o owner da sp no momento da chamada? Vamos a um exemplo prático: no script a seguir serão criadas duas procedures: a primeira com owner dbo e a segunda com usersqlmag:

create procedure usersqlmag.stp_teste
as print 'Procedure stp_teste criada pelo usuario UserSQLMag'
go
create procedure dbo.stp_teste
as print 'Procedure stp_teste criada pelo usuario DBO'
go


Vejamos o que acontece quando usuários diferentes executam a mesma sp sem qualificar o owner:

... resultado da execução da stored-procedure por UseSQLMag

exec stp_teste

--------------------------------------------------------------------------------------------------------------------------------------------

Procedure stp_teste criada pelo usuario UserSQLMag

... resultado da execução da stored-procedure pela usuária Maria:

exec stp_teste

--------------------------------------------------------------------------------------------------------------------------------------------

Procedure stp_teste criada pelo usuario DBO

Pode-se concluir que ao acionar uma stored-procedure sem qualificar seu owner,  os seguintes eventos acontecerão nessa ordem:

1.      O SQL Server 2000 irá procurar por um objeto cujo owner seja o mesmo daquele que está em vigor na sessão. Se a busca for bem sucedida, a stored-procedure desse owner em particular será executada.

2.      Se não encontrar o objeto para o usuário que está em vigor na sessão, o SQL Server 2000 irá procurar por um owner padrão (=DBO). Se a busca for  bem sucedida, a stored-procedure cujo owner é DBO será executada

3.      Se não encontrar o objeto para o owner ativo na sessão nem para o usuário DBO será emitida uma mensagem de erro.

Agora vamos entender porque qualificar o owner no momento da chamada da sp é um ajuste fino de tuning: ao acionar uma sp, o plano de execução gerado na compilação da procedure será carregado em memória. Novas execuções aproveitam-se desse plano, otimizando performance. Quando um plano é localizado em memória, o evento SP:CacheHit pode ser identificado no Profiler. Da mesma maneira quando um plano não for encontrado, o evento SP:CacheMiss será sinalizado. No exemplo a seguir, o usuário usersqlmag irá executar a procedure stp_teste2, criada pelo usuário sa. Como o usuário sa possui auto-mapeamento para dbo (isso acontece para todos os usuários membros do server role SysAdmin ou do database role db_Owner), o nome qualificado da sp será dbo.stp_teste2. Vamos supor também que a procedure stp_teste2 foi executada inúmeras vezes no último segundo, portanto seu plano estará residente em memória.

 O que podemos observar:

·        Na primeira execução – exec stp_teste2 – são necessárias duas tentativas (1) e (2) para localizar o plano em memória. A primeira tentativa falha porque a procedure usersqlmag.stp_teste2 não existe ;

·        Na segunda execução – exec dbo.stp_teste2 – o plano de execução foi localizado na primeira tentativa (3)

O que podemos concluir ?

Em sistemas de produção, submetidos a execução de centenas de stored-procedures em poucos segundos, a localização imediata do plano de execução em memória é um aspecto de tuning que pode fazer a diferença. Portanto, sempre que executar uma stored-procedure NÃO SE ESQUEÇA DE QUALIFICAR O OWNER !

Nota Importante

Procure padronizar o nome de criação e chamadas para stored-procedures. Uma sp criada como dbo.stp_Teste e chamada como dbo.STP_TESTE irá causar um SP:CacheMiss. Os nomes de sp´s armazenadas na Procedure Cache são case-sensitive e independem do collation e/ou sort order adotado para o database

Por hoje é só.

Um forte abraço a todos!


 

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