Parametrization Forced


Galera, bom dia! Hoje nós iremos falar de um recurso bem interessante que surgiu no SQL 2005, o Parametrization Forced.


 Um dos beneficios de utilizar uma stored procedure para executar uma instrução no sql é que uma vez compilada e executada pela primeira vez, o plano de execução é armazenado no cache pelo SQL SERVER. Logo, da próxima vez que a mesma procedure executar (assumindo que ela possui os mesmos parâmetros), o SQL não tem que recompilar a mesma novamente, ele ira reutilizar o plano de execução armazenado em cache anteriormente. Esta reutilização do plano de execução pode reduzir a solicitação de recursos da parte do SQL Server e proporcionar um ganho na performance.

Porém como todos nós sabemos, nem todas aplicações baseadas em SQL SERVER utilizam as procedures para se comunicarem com o mesmo. Muitas vezes instruções SQL são mandadas da aplicação para o SQL de forma estática ou dinâmica. Por default o SQL tem a habilidade de fazer algo chamado de SIMPLE PARAMETERIZATION.

      A SIMPLE PARAMETERIZATION nada mais é do que o SQL analisar uma instrução estática ou dinâmica enviada da aplicação a ele e tentar localizar valores que podem ser tratados como parâmetros, isto ira parametrizar  a instrução SQL, o que permitira que seu plano de execução seja reutilizado futuramente assim como as procedures.

Vamos exemplificar, suponhamos que o SQL receba a seguinte query de SELECT:



SELECT NAME, ZIP FROM TESTE WHERE ZIP = ‘65742’



Quando o SQL olha para este simples SELECT, ele é capaz de reconhecer o ‘65742’ como um parâmetro, e provavelmente outra query similar ira ser executada posteriormente, porem com um valor diferente no parâmetro. Por conta disso, quando o SQL esta query ele ira parametrizar a mesma e armazenar seu plano de execução em cachê para que uma query similar futura o utilize.

Por exemplo, as queries a seguir irão reutilizar o mesmo plano de execução da primeira, salvando os recursos e aumentando a performance.



SELECT NAME, ZIP FROM TESTE WHERE ZIP = ‘10005’



SELECT NAME, ZIP FROM TESTE WHERE ZIP = ‘99686’



Apesar de tudo, por default, apenas as queries relativamente simples são parametrizadas, ou seja, se sua aplicação utiliza queries mais complexas daí surge a necessidade de talvez habilitar a nova opção disponível no SQL 2005, chamada de FORCED PARAMETERIZATION. Quando esta opção é ativada, ela diz ao SQL para forçar a parametrização de todas instruções de SELECT, INSERT, UPDATE E DELETE enviadas a ele. Ainda assim algumas queries ficam de fora, mais são poucas as exceções.

Com a FORCED PARAMETERIZATION ativa, o SQL ira executar poucas compilações pois agora ele esta apto a reutilizar mais planos de execução do que antes, reduzindo a utilização dos recursos e aumentando a performance.

Contudo, algumas considerações importantes devem ser feitas.

- O SQL ira ter um trabalho a mais para as novas parametrizações.

- Algumas queries com parâmetros que sofrem muitas mudanças podem acabar utilizando planos impróprios, reduzindo a performance.

 - Devido as constantes em uma query que são alteradas para parâmetros, nem sempre o query optimizer pode optar pelo melhor plano, reduzindo a performance.

- O query optimizer pode não escolher o plano ideal para queries em tabelas particionadas ou views.

- O query optimizer pode não surtir efeito em views indexadas ou em colunas computadas com indices.

A Microsoft recomenda que a force parameterization é melhor utilizada em situações limitadas, como em aplicações com grandes volumes de queries concorrentes que utilizam instruções estáticas ou dinâmicas, sem muitas chamadas via procedures. Caso sua aplicação não se encaixe nestes quesitos a force parameterization provavelmente ira piorar a performance do seu ambiente ao invés de melhorar.

A Forced Parameterization é ligada e desligada a nível de banco de dados, ou seja, ou esta ativa ou não. Contudo, se você quiser, você pode utilizar o SQL 2005 PLAN GUIDES para ligar a force parameterization em um grupo de queries (assumindo que este esteja fora da base de dados) ou dizer ao SQL para não usar o force parameterization em certas queries (assumindo que este esta ativo na base de dados). Porem fazendo o proposto acima, você aumentara a carga de trabalho no SQL.



Para ativar a force parameterization use o seguinte comando (exemplo):



ALTER DATABASE DB_NETREPORT SET PARAMETERIZATION FORCED





Para desativar:



ALTER DATABASE DB_NETREPORT SET PARAMETERIZATION SIMPLE



Para verificar se a force parameterization esta ativa ou não faça o SELECT abaixo:



SELECT NAME, IS_PARAMETERIZATION_FORCED FROM SYS.DATABASES



Analise com muito cuidado seu ambiente pois a force parameterization pode melhorar o ambiente como pode também piorar o mesmo do ponto de vista da performance. 

Espero que tenham gostado do post e até a próxima!


Nenhum comentário:

Postar um comentário