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:

  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.

Execução

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!

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.