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 usuário UserSQLMag
... resultado da execução da stored-procedure pela usuária Maria:
exec stp_teste
--------------------------------------------------------------------------------------------------------------------------------------------
Procedure stp_teste criada pelo usuário DBO
Pode-se concluir que ao acionar uma stored-procedure sem qualificar seu owner, os seguintes eventos acontecerão nessa ordem:
- 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.
- 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.
- 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!