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 ... 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!
|
|
|||||||||||||
Todos
os direitos reservados: DevMedia Group |