Parametrização forçada

É possível substituir o comportamento padrão da parametrização simples do SQL Server especificando que todas as instruções SELECT, INSERT, UPDATE e DELETE em um banco de dados tenham parâmetros e sejam sujeitas a determinadas limitações. A parametrização forçada é habilitada definindo a opção PARAMETERIZATION como FORCED na instrução ALTER DATABASE. A parametrização forçada pode melhorar o desempenho de alguns bancos de dados reduzindo a freqüência de compilações e recompilações de consulta. Os bancos de dados que podem se beneficiar da parametrização forçada geralmente são aqueles em que há suporte a grandes volumes de consultas simultâneas de origens tais como aplicativos de ponto-de-venda.

Quando a opção PARAMETERIZATION é definida como FORCED, qualquer valor literal exibido em uma instrução SELECT, INSERT, UPDATE ou DELETE, enviado de qualquer forma, é convertido em um parâmetro durante a compilação de consulta. As exceções são literais exibidos nas seguintes construções de consulta:

  • Instruções INSERT...EXECUTE.

  • Instruções nos corpos de procedimentos armazenados, gatilhos ou funções definidas pelo usuário. O SQL Server já reutiliza os planos de consulta para essas rotinas.

  • Instruções preparadas que já foram parametrizadas no aplicativo cliente.

  • Instruções que contêm chamadas do método XQuery, onde o método é exibido em um contexto em que seus argumentos normalmente seriam parametrizados, como uma cláusula WHERE. Se o método for exibido em um contexto em que seus argumentos não serão parametrizados, o restante da instrução será parametrizado.

  • Instruções em um cursor Transact-SQL. (São parametrizadas instruções SELECT em cursores de API.)

  • Construções da consulta preterida.

  • Qualquer instrução executada no contexto de ANSI_PADDING ou ANSI_NULLS definida como OFF.

  • Instruções que contêm mais de 2.097 literais elegíveis para parametrização.

  • Instruções que fazem referência a variáveis, como WHERE T.col2 >= @bb.

  • Instruções que contêm a dica de consulta RECOMPILE.

  • Instruções que contêm uma cláusula COMPUTE.

  • Instruções que contêm uma cláusula WHERE CURRENT OF.

Além disso, as cláusulas de consulta a seguir não são parametrizadas. Observe que nesses casos, somente as cláusulas não são parametrizadas. Outras cláusulas dentro da mesma consulta podem ser elegíveis para parametrização forçada.

  • O <select_list> de qualquer instrução SELECT. Isso inclui listas SELECT de subconsultas e listas SELECT em instruções INSERT.

  • Instruções SELECT de subconsulta exibidas em uma instrução IF.

  • As cláusulas TOP, TABLESAMPLE, HAVING, GROUP BY, ORDER BY, OUTPUT...INTO ou FOR XML de uma consulta.

  • Argumentos, diretos ou como subexpressões, para operadores OPENROWSET, OPENQUERY, OPENDATASOURCE, OPENXML ou qualquer FULLTEXT.

  • Os argumentos pattern e escape_character de uma cláusula LIKE.

  • O argumento style de uma cláusula CONVERT.

  • Constantes de número inteiro em uma cláusula IDENTITY.

  • Constantes especificadas usando a sintaxe da extensão ODBC.

  • Expressões de constantes desdobráveis que são argumentos dos operadores +, -, *, / e %. Ao considerar a elegibilidade da parametrização forçada, o SQL Server considera que uma expressão é de constante dobrável quando qualquer uma das seguintes condições é verdadeira:

    • Nenhuma coluna, variável ou subconsulta é exibida na expressão.

    • A expressão contém uma cláusula CASE.

    Para obter mais informações sobre expressões de constantes desdobráveis, consulte Solucionando problemas de baixo de desempenho de consulta: dobra constante e avaliação de expressão durante estimativa de cardinalidade.

  • Argumentos para cláusulas de dica de consulta. Incluem o argumento number_of_rows da dica de consulta FAST, o argumento number_of_processors da dica de consulta MAXDOP e o argumento number da dica de consulta MAXRECURSION.

A parametrização ocorre no nível das instruções Transact-SQL individuais. Em outras palavras, são parametrizadas instruções individuais em lote. Após a compilação, uma consulta com parâmetros é executada no contexto do lote em que foi enviado originalmente. Se um plano de execução de uma consulta for armazenado em cache, você poderá determinar se a consulta foi parametrizada referenciando a coluna sql da exibição de gerenciamento dinâmico sys.syscacheobjects. Se uma consulta for parametrizada, os nomes e tipos de dados de parâmetros serão exibidos antes do texto do lote enviado nessa coluna, como (@1 tinyint). Para obter informações sobre cache de plano de consulta, consulte Reutilização e armazenamento em cache do plano de execução.

ObservaçãoObservação

Os nomes de parâmetro são arbitrários. Os usuários ou os aplicativos não devem confiar em uma ordem de nomenclatura específica. Além disso, os seguintes itens podem ser alterados entre as versões do SQL Server e as atualizações do service pack: nomes de parâmetro, opção de literais com parâmetros e espaçamento no texto com parâmetros.

Tipos de dados de parâmetros

Quando o SQL Server parametriza literais, os parâmetros são convertidos nos seguintes tipos de dados:

  • literais inteiros cujo tamanho pode ser ajustado no tipo de dados int com parâmetros em int. Literais inteiros grandes que fazem parte de predicados que envolvem qualquer operador de comparação (incluindo <, <=, =, !=, >, >=, , !<, !>, <>, ALL, ANY, SOME, BETWEEN e IN) são parametrizados em numeric(38,0). Literais grandes que não fazem parte de predicados que envolvem operadores de comparação parametrizados em numeric, cuja precisão é grande o suficiente para oferecer suporte ao seu tamanho e cuja escala é 0.

  • Literais numéricos de ponto fixo que não fazem parte de predicados que envolvem operadores de comparação parametrizados em numeric, cuja precisão é 38 e cuja escala é grande o suficiente para oferecer suporte ao seu tamanho. Literais numéricos de ponto fixo que não fazem parte de predicados que envolvem operadores de comparação parametrizados em numeric, cuja precisão e escala são grandes o suficiente para oferecer suporte ao seu tamanho.

  • Literais numéricos de ponto de flutuação parametrizados em float(53).

  • Literais de cadeia de caracteres não-Unicode parametrizados em varchar(8000), caso o literal caiba em 8.000 caracteres, e em varchar(max), se ele for maior que 8.000 caracteres.

  • Literais de cadeia de caracteres Unicode parametrizados em nvarchar(4000), caso o literal caiba em 4.000 caracteres, e em nvarchar(max), se ele for maior que 4.000 caracteres.

  • Literais binários parametrizados em varbinary(8000), caso o literal caiba em 8.000 bytes. Se ele for maior que 8.000 bytes, será convertido em varbinary(max).

  • Literais de tipo money parametrizados em money.

Diretrizes para uso da parametrização forçada

Considere as seguintes diretrizes ao definir a opção PARAMETERIZATION como FORCED:

  • A parametrização forçada altera as constantes literais em uma consulta para parâmetros ao compilar uma consulta. Portanto, o otimizador de consulta poderia escolher planos com qualidade inferior para consultas. Em particular, é menos provável que o otimizador de consulta efetue uma correspondência entre uma consulta uma exibição indexada ou um índice em uma coluna computada. Além disso, ele pode escolher planos com qualidade inferior para consultas inseridas em tabelas particionadas e exibições particionadas distribuídas. A parametrização forçada não deve ser usada em ambientes que dependem excessivamente de exibições indexadas e índices em colunas computadas. Via de regra, a opção PARAMETERIZATION FORCED só deve ser usada por administradores de banco de dados experientes depois de determinarem que isso não afeta o desempenho de forma negativa.

  • As consultas distribuídas que referenciam mais de um banco de dados são elegíveis para parametrização forçada, contanto que a opção PARAMETERIZATION seja definida como FORCED no banco de dados cujo contexto está sendo executado pela consulta.

  • A definição da opção PARAMETERIZATION como FORCED libera todos os planos de consulta do cache de plano de um banco de dados, menos os que estão sendo compilados, recompilados ou em execução. Os planos de consultas que estiverem sendo compilados ou em execução durante a mudança de configuração serão parametrizados da próxima vez que a consulta for executada.

  • A definição da opção PARAMETERIZATION é uma operação online que não exige nenhum bloqueio exclusivo no nível de banco de dados.

  • A parametrização forçada é desabilitada (definida como SIMPLE) quando a compatibilidade de um banco de dados SQL Server é definida como 80, ou um banco de dados em uma instância anterior for anexado a uma instância do SQL Server 2005 ou posterior.

  • A configuração atual da opção PARAMETERIZATION é preservada ao anexar novamente ou restaurar um banco de dados.

É possível substituir o comportamento da parametrização forçada especificando a tentativa da parametrização simples em uma única consulta, e em quaisquer outras que sejam sintaticamente equivalentes, mas diferem apenas nos valores de parâmetro. Reciprocamente, pode-se especificar a tentativa da parametrização forçada em apenas um conjunto de consultas sintaticamente equivalentes, mesmo se a parametrização forçada estiver desabilitada no banco de dados. Os guias de plano são usados para essa finalidade. Para obter mais informações, consulte Especificando comportamento de parametrização de consulta usando guias de plano.

ObservaçãoObservação

Quando a opção PARAMETERIZATION é definida como FORCED, o relatório de mensagens de erro pode ser diferente daquele da parametrização simples: podem ser informadas várias mensagens de erro em casos em que poucas mensagens seriam informadas na parametrização simples, e o número de linhas nas quais ocorrem erros pode ser informado incorretamente.

Consulte também

Referência

Conceitos