Estimativa de cardinalidade (SQL Server)Cardinality Estimation (SQL Server)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

O Otimizador de Consulta do SQL ServerSQL Server é baseado em custo.The SQL ServerSQL Server Query Optimizer is a cost-based Query Optimizer. Isso significa que ele seleciona planos de consulta com o custo de processamento estimado mais baixo para ser executado.This means that it selects query plans that have the lowest estimated processing cost to execute. O Otimizador de Consulta determina o custo de execução de um plano de consulta com base em dois fatores principais:The Query Optimizer determines the cost of executing a query plan based on two main factors:

  • O número total de linhas processadas em cada nível de um plano de consulta, chamado cardinalidade do plano.The total number of rows processed at each level of a query plan, referred to as the cardinality of the plan.
  • O modelo de custo do algoritmo ditado pelos operadores usados na consulta.The cost model of the algorithm dictated by the operators used in the query.

O primeiro fator, cardinalidade, é usado como um parâmetro de entrada do segundo fator, o modelo de custo.The first factor, cardinality, is used as an input parameter of the second factor, the cost model. Portanto, a cardinalidade aprimorada gera custos melhor estimados e, consequentemente, planos de execução mais rápidos.Therefore, improved cardinality leads to better estimated costs and, in turn, faster execution plans.

A CE (estimativa de cardinalidade) em SQL ServerSQL Server é derivada principalmente de histogramas criados quando índices ou estatísticas são criados, manual ou automaticamente.Cardinality estimation (CE) in SQL ServerSQL Server is derived primarily from histograms that are created when indexes or statistics are created, either manually or automatically. Às vezes, o SQL ServerSQL Server também usa informações de restrição e novas consultas lógicas para determinar a cardinalidade.Sometimes, SQL ServerSQL Server also uses constraint information and logical rewrites of queries to determine cardinality.

Nos casos a seguir, o SQL ServerSQL Server não consegue calcular cardinalidades com precisão.In the following cases, SQL ServerSQL Server cannot accurately calculate cardinalities. Isso gera cálculos de custo inexatos que podem causar planos de consulta menos favoráveis.This causes inaccurate cost calculations that may cause suboptimal query plans. Evitando-se tais construções em consultas é possível melhorar o desempenho da consulta.Avoiding these constructs in queries may improve query performance. Às vezes, formulações de consulta alternativas ou outras medidas são possíveis e são indicadas:Sometimes, alternative query formulations or other measures are possible and these are pointed out:

  • Consultas com predicados que usam operadores de comparação entre colunas diferentes da mesma tabela.Queries with predicates that use comparison operators between different columns of the same table.
  • Consultas com predicados que usam operadores e qualquer um dos itens seguintes são true:Queries with predicates that use operators, and any one of the following are true:
    • Não há nenhuma estatística referente às colunas envolvidas em nenhum dos lados dos operadores.There are no statistics on the columns involved on either side of the operators.
    • A distribuição de valores nas estatísticas não é uniforme, mas a consulta busca um conjunto de valores altamente seletivo.The distribution of values in the statistics is not uniform, but the query seeks a highly selective value set. Essa situação pode ser especialmente verdadeira se o operador não for o operador de igualdade (=).This situation can be especially true if the operator is anything other than the equality (=) operator.
    • O predicado usa o operador de comparação diferente de (! =) ou o operador lógico NOT.The predicate uses the not equal to (!=) comparison operator or the NOT logical operator.
  • Consultas que usem qualquer uma das funções internas do SQL Server ou uma função com valor escalar, definida pelo usuário, cujo argumento não é um valor constante.Queries that use any of the SQL Server built-in functions or a scalar-valued, user-defined function whose argument is not a constant value.
  • Consultas que envolvem colunas de associação por aritmética ou operadores de concatenação de cadeias de caracteres.Queries that involve joining columns through arithmetic or string concatenation operators.
  • Consultas que comparam variáveis cujos valores não são conhecidos quando a consulta é compilada e otimizada.Queries that compare variables whose values are not known when the query is compiled and optimized.

Este artigo ilustra como você pode avaliar e escolher a melhor configuração de CE para seu sistema.This article illustrates how you can assess and choose the best CE configuration for your system. A maior parte dos sistemas se beneficia da CE mais recente, pois ela é a mais precisa.Most systems benefit from the latest CE because it is the most accurate. A CE prevê o número de linhas que sua consulta provavelmente retornará.The CE predicts how many rows your query will likely return. A previsão de cardinalidade é usada pelo Otimizador de Consulta para gerar o plano de consulta ideal.The cardinality prediction is used by the Query Optimizer to generate the optimal query plan. Com estimativas mais precisas, o Otimizador de Consulta normalmente pode fazer um trabalho melhor de produção de um plano de consulta melhor.With more accurate estimations, the Query Optimizer can usually do a better job of producing a more optimal query plan.

Provavelmente, seu sistema de aplicativos poderia ter uma consulta importante cujo plano é alterado para um plano mais lento devido à nova CE.Your application system could possibly have an important query whose plan is changed to a slower plan due to the new CE. Uma consulta desse tipo pode ser parecida com esta:Such a query might be like one of the following:

  • Uma consulta OLTP (processamento de transações online) executada com tanta frequência que várias instâncias dessa geralmente são executadas ao mesmo tempo.An OLTP (online transaction processing) query that runs so frequently that multiple instance of it often run concurrently.
  • SELECT com agregação significativa que é executado durante o horário comercial do OLTP.A SELECT with substantial aggregation that runs during your OLTP business hours.

Você tem técnicas para identificar uma consulta que tem um desempenho mais lento com a nova CE.You have techniques for identifying a query that performs slower with the new CE. Além disso, você tem opções para resolver o problema de desempenho.And you have options for how to address the performance issue.

Versões da CEVersions of the CE

Em 1998, uma importante atualização da CE fez parte do SQL ServerSQL Server 7.0, para o qual o nível de compatibilidade era 70.In 1998, a major update of the CE was part of SQL ServerSQL Server 7.0, for which the compatibility level was 70. Essa versão do modelo da CE é definida em quatro suposições básicas:This version of the CE model is set on four basic assumptions:

  • Independência: as distribuições de dados em diferentes colunas são consideradas independentes entre si, a menos que haja informações de correlação disponíveis e elas sejam utilizáveis.Independence: Data distributions on different columns are assumed to be independent of each other, unless correlation information is available and usable.
  • Uniformidade: diferentes valores são espaçados uniformemente e todos eles têm a mesma frequência.Uniformity: Distinct values are evenly spaced and that they all have the same frequency. Mais precisamente, dentro de cada etapa de histograma, diferentes valores são distribuídos uniformemente e cada valor tem a mesma frequência.More precisely, within each histogram step, distinct values are evenly spread and each value has same frequency.
  • Independência (simples): os usuários consultam dados existentes.Containment (Simple): Users query for data that exists. Por exemplo, para uma junção de igualdade entre duas tabelas, considere a seletividade de predicados1 em cada histograma de entrada antes de ingressar histogramas para estimar a seletividade da junção.For example, for an equality join between two tables, factor in the predicates selectivity1 in each input histogram, before joining histograms to estimate the join selectivity.
  • Inclusão: para filtrar predicados em que Column = Constant, supõe-se que a constante realmente exista para a coluna associada.Inclusion: For filter predicates where Column = Constant, the constant is assumed to actually exist for the associated column. Se uma etapa do histograma correspondente não estiver vazia, presume-se que um dos valores diferentes da etapa corresponda ao valor do predicado.If a corresponding histogram step is non-empty, one of the step's distinct values is assumed to match the value from the predicate.

1 Contagem de linhas que satisfaz o predicado.1 Row count that satisfies the predicate.

Atualizações posteriores iniciadas com o SQL Server 2014 (12.x)SQL Server 2014 (12.x), significando níveis de compatibilidade 120 e acima.Subsequent updates started with SQL Server 2014 (12.x)SQL Server 2014 (12.x), meaning compatibility levels 120 and above. As atualizações da CE dos níveis 120 e acima incorporam suposições e algoritmos atualizados que funcionam bem em data warehousing moderno e em cargas de trabalho OLTP.The CE updates for levels 120 and above incorporate updated assumptions and algorithms that work well on modern data warehousing and on OLTP workloads. De suposições da CE 70, as seguintes suposições de modelo foram alteradas a partir da CE 120:From the CE 70 assumptions, the following model assumptions were changed starting with CE 120:

  • Independência torna-se Correlação: a combinação dos diferentes valores de coluna não é necessariamente independente.Independence becomes Correlation: The combination of the different column values are not necessarily independent. Isso poderia parecer mais com uma consulta de dados da vida real.This may resemble more real-life data querying.
  • Independência simples torna-se Independência de base: Os usuários podem consultar dados que não existem.Simple Containment becomes Base Containment: Users might query for data that does not exist. Por exemplo, para que haja uma junção de igualdade entre duas tabelas, usamos histogramas de tabelas básicos para calcular a seletividade da junção e, sem seguida, consideramos a seletividade de predicados.For example, for an equality join between two tables, we use the base tables histograms to estimate the join selectivity, and then factor in the predicates selectivity.

Nível de compatibilidade: é possível garantir que o banco de dados esteja em determinado nível usando o seguinte código do Transact-SQLTransact-SQL para COMPATIBILITY_LEVEL.Compatibility level: You can ensure your database is at a particular level by using the following Transact-SQLTransact-SQL code for COMPATIBILITY_LEVEL.

SELECT ServerProperty('ProductVersion');  
GO  
  
ALTER DATABASE <yourDatabase>  
SET COMPATIBILITY_LEVEL = 130;  
GO  
  
SELECT d.name, d.compatibility_level  
FROM sys.databases AS d  
WHERE d.name = 'yourDatabase';  
GO  

Para um banco de dados SQL ServerSQL Server definido no nível de compatibilidade 120 ou superior, a ativação do sinalizador de rastreamento 9481 força o sistema a usar a CE versão 70.For a SQL ServerSQL Server database set at compatibility level 120 or above, activation of the trace flag 9481 forces the system to use the CE version 70.

CE herdada: para um banco de dados do SQL ServerSQL Server definido no nível de compatibilidade 120 e superior, a CE versão 70 pode ser ativada usando o nível do banco de dados com ALTER DATABASE SCOPED CONFIGURATION.Legacy CE: For a SQL ServerSQL Server database set at compatibility level 120 and above, the CE version 70 can be can be activated by using the at the database level by using the ALTER DATABASE SCOPED CONFIGURATION.

ALTER DATABASE SCOPED CONFIGURATION 
SET LEGACY_CARDINALITY_ESTIMATION = ON;  
GO  
  
SELECT name, value  
FROM sys.database_scoped_configurations  
WHERE name = 'LEGACY_CARDINALITY_ESTIMATION';  
GO

Ou a partir do SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, o Dica de Consulta USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION').Or starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, the Query Hint USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION').

SELECT CustomerId, OrderAddedDate  
FROM OrderTable  
WHERE OrderAddedDate >= '2016-05-01'
OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));  

Repositório de Consultas: Começando pelo SQL Server 2016 (13.x)SQL Server 2016 (13.x), o Repositório de Consultas é uma ferramenta útil para examinar o desempenho das consultas.Query store: Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the query store is a handy tool for examining the performance of your queries. No Management StudioManagement Studio, no Pesquisador de Objetos, no nó do seu banco de dados, um nó Repositório de Consultas é exibido quando o repositório de consultas está habilitado.In Management StudioManagement Studio, in the Object Explorer under your database node, a Query Store node is displayed when the query store is enabled.

ALTER DATABASE <yourDatabase>  
SET QUERY_STORE = ON;  
GO  
  
SELECT q.actual_state_desc AS [actual_state_desc_of_QueryStore],  
        q.desired_state_desc,  
        q.query_capture_mode_desc  
FROM sys.database_query_store_options AS q;  
GO  
  
ALTER DATABASE <yourDatabase>  
SET QUERY_STORE CLEAR;  

Dica

É recomendado instalar a versão mais recente do Management Studio e atualizá-lo com frequência.We recommend that you install the latest release of Management Studio and update it often.

Outra opção para acompanhar o processo de estimativa de cardinalidade é usar o evento estendido chamado query_optimizer_estimate_cardinality.Another option for tracking the cardinality estimation process is to use the extended event named query_optimizer_estimate_cardinality. O exemplo de código Transact-SQLTransact-SQL a seguir é executado no SQL ServerSQL Server.The following Transact-SQLTransact-SQL code sample runs on SQL ServerSQL Server. Ele grava um arquivo .xel em C:\Temp\ (embora o caminho possa ser alterado).It writes a .xel file to C:\Temp\ (although you can change the path). Quando você abre o arquivo .xel no Management StudioManagement Studio, as informações detalhadas são exibidas de forma amigável.When you open the .xel file in Management StudioManagement Studio, its detailed information is displayed in a user friendly manner.

DROP EVENT SESSION Test_the_CE_qoec_1 ON SERVER;  
go  
  
CREATE EVENT SESSION Test_the_CE_qoec_1  
ON SERVER  
ADD EVENT sqlserver.query_optimizer_estimate_cardinality  
    (  
        ACTION (sqlserver.sql_text)  
            WHERE (  
                sql_text LIKE '%yourTable%'  
                and sql_text LIKE '%SUM(%'  
            )  
    )  
ADD TARGET package0.asynchronous_file_target   
        (SET  
            filename = 'c:\temp\xe_qoec_1.xel',  
            metadatafile = 'c:\temp\xe_qoec_1.xem'  
        );  
GO  
  
ALTER EVENT SESSION Test_the_CE_qoec_1  
ON SERVER  
STATE = START;  --STOP;  
GO  

Para obter informações sobre eventos estendidos adaptados para o Banco de Dados SQLSQL Database, veja Eventos estendidos no Banco de Dados SQL.For information about extended events as tailored for Banco de Dados SQLSQL Database, see Extended events in SQL Database.

Etapas para avaliar a versão da CESteps to assess the CE version

A seguir, veja as etapas que você pode usar para avaliar se qualquer uma das suas consultas mais importantes tem um desempenho inferior na CE mais recente.Next are steps you can use to assess whether any of your most important queries perform less well under the latest CE. Algumas das etapas são realizadas com a execução de um exemplo de código apresentado em uma seção anterior.Some of the steps are performed by running a code sample presented in a preceding section.

  1. Abra o Management StudioManagement Studio.Open Management StudioManagement Studio. Verifique se SQL ServerSQL Serverbanco de dados é definido como o mais alto nível de compatibilidade disponível.Ensure your SQL ServerSQL Serverdatabase is set to the highest available compatibility level.

  2. Realize as seguintes etapas preliminares:Perform the following preliminary steps:

    1. Abra o Management StudioManagement Studio.Open Management StudioManagement Studio.

    2. Execute o T-SQL para garantir que o banco de dados SQL ServerSQL Server é definido com o nível de compatibilidade mais alto disponível.Run the T-SQL to ensure that your SQL ServerSQL Server database is set to the highest available compatibility level.

    3. Verifique se o seu banco de dados tem a configuração LEGACY_CARDINALITY_ESTIMATION como OFF.Ensure that your database has its LEGACY_CARDINALITY_ESTIMATION configuration turned OFF.

    4. LIMPE seu repositórios de consultas.CLEAR your query store. É claro, verifique se seu repositório de consultas está ON.Of course, ensure your query store is ON.

    5. Execute a instrução: SET NOCOUNT OFF;Run the statement: SET NOCOUNT OFF;

  3. Execute a instrução: SET STATISTICS XML ON;Run the statement: SET STATISTICS XML ON;

  4. Execute a consulta importante.Run your important query.

  5. No painel de resultados, na guia Mensagens , observe o número real de linhas afetadas.In the results pane, on the Messages tab, note the actual number of rows affected.

  6. No painel de resultados, na guia Resultados , clique duas vezes na célula que contém as estatísticas em formato XML.In the results pane on the Results tab, double-click the cell that contains the statistics in XML format. Um plano de consulta gráfico é exibido.A graphic query plan is displayed.

  7. Clique com o botão direito do mouse na primeira caixa do plano de consulta gráfico e clique em Propriedades.Right-click the first box in the graphic query plan, and then click Properties.

  8. Para a comparação posterior com uma configuração diferente, observe os valores das seguintes propriedades:For later comparison with a different configuration, note the values for the following properties:

    • CardinalityEstimationModelVersion.CardinalityEstimationModelVersion.

    • Número Estimado de Linhas.Estimated Number of Rows.

    • Estimated I/O Coste várias propriedades Estimated semelhantes que envolvem o desempenho real em vez de previsões de contagem de linha.Estimated I/O Cost, and several similar Estimated properties that involve actual performance rather than row count predictions.

    • Operação Lógica e Operação Física.Logical Operation and Physical Operation. Parallelism é um valor aceitável.Parallelism is a good value.

    • Modo de Execução Real.Actual Execution Mode. Batch é um valor aceitável, melhor que Row.Batch is a good value, better than Row.

  9. Compare o número estimado de linhas com o número real de linhas.Compare the estimated number of rows to the actual number of rows. A CE não é precisa em % 1 (alto ou baixo) ou 10%?Is the CE inaccurate by 1% (high or low), or by 10%?

  10. Execute: SET STATISTICS XML OFF;Run: SET STATISTICS XML OFF;

  11. Execute o T-SQL para diminuir o nível de compatibilidade do banco de dados em um nível (por exemplo, 130 até 120).Run the T-SQL to decrease the compatibility level of your database by one level (such as from 130 down to 120).

  12. Execute novamente todas as etapas não preliminares.Rerun all the non-preliminary steps.

  13. Compare os valores de propriedade da CE das duas execuções.Compare the CE property values from the two runs.

    • O percentual de imprecisão na CE mais recente está abaixo da CE mais antiga?Is the inaccuracy percentage under the newest CE less than under the older CE?
  14. Por fim, compare vários valores de propriedade de desempenho das duas execuções.Finally, compare the various performance property values from the two runs.

    • Sua consulta usou um plano diferente nas duas estimativas de CE diferentes?Did your query use a different plan under the two differing CE estimations?

    • A consulta foi executada mais lentamente na CE mais recente?Did your query run slower under the latest CE?

    • A menos que a consulta tenha um desempenho melhor e com um plano diferente na CE mais antiga, certamente, será recomendável a CE mais recente.Unless your query runs better and with a different plan under the older CE, you almost certainly want the latest CE.

    • No entanto, se sua consulta for executada com um plano mais rápido na CE mais antiga, considere forçar o sistema para usar o plano mais rápido e ignorar a CE.However, if your query runs with a faster plan under the older CE, consider forcing the system to use the faster plan and to ignore the CE. Dessa forma, você pode ter a CE mais recente para tudo, ao mesmo tempo que mantém o plano mais rápido por via das dúvidas.This way you can have the latest CE on for everything, while keeping the faster plan in the one odd case.

Como ativar o melhor plano de consultaHow to activate the best query plan

Suponha que, com a CE 120 ou superior, um plano de consulta menos eficiente é gerado para sua consulta.Suppose that with CE 120 or above, a less efficient query plan is generated for your query. Aqui estão algumas opções para ativar o plano melhor:Here are some options you have to activate the better plan:

  1. Você pode definir o nível de compatibilidade de todo o seu banco de dados com um valor menor do que o valor mais recente disponível.You could set the compatibility level to a value lower than the latest available, for your whole database.

    • Por exemplo, configurar o nível de compatibilidade 110 ou inferior ativa a CE 70, mas deixa todas as consultas sujeitas ao modelo de CE anterior.For example, setting the compatibility level 110 or lower activates CE 70, but it makes all queries subject to the previous CE model.

    • Além disso, configurar um nível de compatibilidade inferior também faz inúmeras melhorias no otimizador de consulta para as versões mais recentes serem perdidas.Further, setting a lower compatibility level also misses a number of improvements in the query optimizer for latest versions.

  2. Você poderá usar a opção de banco de dados LEGACY_CARDINALITY_ESTIMATION para fazer com que todo o banco de dados use a CE mais antiga, mantendo outras melhorias no otimizador de consulta.You could use LEGACY_CARDINALITY_ESTIMATION database option, to have the whole database use the older CE, while retaining other improvements in the query optimizer.

  3. Você poderá usar a dica de consulta LEGACY_CARDINALITY_ESTIMATION para fazer com que uma única consulta use a CE mais antiga, mantendo outras melhorias no otimizador de consulta.You could use LEGACY_CARDINALITY_ESTIMATION query hint, to have a single query use the older CE, while retaining other improvements in the query optimizer.

Para obter o controle mais refinado, você pode forçar o sistema a usar o plano gerado com a CE 70 durante o teste.For the finest control, you could force the system to use the plan that was generated with CE 70 during your testing. Depois de fixar seu plano preferido, você poderá definir o banco de dados inteiro para usar o nível de compatibilidade e a CE mais recentes.After you pin your preferred plan, you can set your whole database to use the latest compatibility level and CE. A opção é elaborada a seguir.The option is elaborated next.

Como forçar um plano de consulta específicoHow to force a particular query plan

O repositório de consultas oferece diferentes maneiras pelas quais você pode forçar o sistema a usar um plano de consulta específico:The query store gives you different ways that you can force the system to use a particular query plan:

  • Execute sp_query_store_force_plan.Execute sp_query_store_force_plan.

  • No Management StudioManagement Studio, expanda o nó Repositório de Consultas, clique com o botão direito do mouse em Nós que Consomem Mais Recursos e clique em Exibir Nós que Consomem Mais Recursos.In Management StudioManagement Studio, expand your Query Store node, right-click Top Resource Consuming Nodes, and then click View Top Resource Consuming Nodes. A exibição mostra os botões rotulados Forçar Plano e Não Forçar Plano.The display shows buttons labeled Force Plan and Unforce Plan.

Para obter mais informações sobre o repositório de consultas, veja Monitorando o desempenho com o repositório de consultas.For more information about the query store, see Monitoring Performance By Using the Query Store.

Exemplos de melhorias de CEExamples of CE improvements

Esta seção descreve consultas de exemplo que se beneficiam das melhorias implementadas na CE em versões recentes.This section describes example queries that benefit from the enhancements implemented in the CE in recent releases. Essas são as informações básicas que não exigem ação específica de sua parte.This is background information that does not call for specific action on your part.

Exemplo A. A CE entende que o valor máximo pode ser maior do que quando as estatísticas foram coletadas pela última vezExample A. CE understands maximum value might be higher than when statistics were last gathered

Suponha que as estatísticas foram coletadas pela última vez para OrderTable em 2016-04-30, quando o OrderAddedDate máximo era 2016-04-30.Suppose statistics were last gathered for OrderTable on 2016-04-30, when the maximum OrderAddedDate was 2016-04-30. A CE 120 (e versão superior) entende que as colunas em OrderTable que têm dados crescentes pode ter valores maiores do que o máximo registrado pelas estatísticas.The CE 120 (and above version) understands that columns in OrderTable which have ascending data might have values larger than the maximum recorded by the statistics. Esse entendimento melhora o plano de consulta para instruções Transact-SQLTransact-SQL SELECT como a seguinte.This understanding improves the query plan for Transact-SQLTransact-SQL SELECT statements such as the following.

SELECT CustomerId, OrderAddedDate  
FROM OrderTable  
WHERE OrderAddedDate >= '2016-05-01';  

Exemplo B. A CE entende que os predicados filtrados na mesma tabela estão frequentemente correlacionadosExample B. CE understands that filtered predicates on the same table are often correlated

Na SELECT a seguir, vemos predicados filtrados em Model e em ModelVariant.In the following SELECT we see filtered predicates on Model and ModelVariant. Intuitivamente, entendemos que quando Model é 'Xbox' há uma possibilidade de ModelVariant ser 'One', uma vez que o Xbox tem uma variante chamada One.We intuitively understand that when Model is 'Xbox' there is a chance the ModelVariant is 'One', given that Xbox has a variant called One.

A partir da CE 120, SQL ServerSQL Server entende que pode haver uma correlação entre as duas colunas na mesma tabela, Model e ModelVariant.Starting with CE 120, SQL ServerSQL Server understands there might be a correlation between the two columns on the same table, Model and ModelVariant. A CE faz uma estimativa mais precisa de quantas linhas serão retornadas pela consulta, e o otimizador de consulta gera um plano melhor.The CE makes a more accurate estimation of how many rows will be returned by the query, and the query optimizer generates a more optimal plan.

SELECT Model, Purchase_Price  
FROM dbo.Hardware  
WHERE Model = 'Xbox' AND  
      ModelVariant = 'One';  

Exemplo C. A CE não pressupõe mais nenhuma correlação entre os predicados filtrados de tabelas diferentesExample C. CE no longer assumes any correlation between filtered predicates from different tables

Com a nova e ampla pesquisa sobre cargas de trabalho modernas e dados corporativos reais, descobriu-se que, em geral, não há correlação entre os filtros de predicado de diferentes tabelas.With extense new research on modern workloads and actual business data reveal that predicate filters from different tables usually do not correlate with each other. Na consulta a seguir, a CE pressupõe que não há nenhuma correlação entre s.type e r.date.In the following query, the CE assumes there is no correlation between s.type and r.date. Portanto, a CE faz uma estimativa inferior do número de linhas retornadas.Therefore the CE makes a lower estimate of the number of rows returned.

SELECT s.ticket, s.customer, r.store  
FROM dbo.Sales    AS s  
CROSS JOIN dbo.Returns  AS r  
WHERE s.ticket = r.ticket AND  
      s.type = 'toy' AND  
      r.date = '2016-05-11';  

Consulte TambémSee Also

Monitorar e ajustar o desempenho Monitor and Tune for Performance
Otimizar os planos de consulta com o avaliador de cardinalidade do SQL Server 2014Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator
Dicas de consulta Query Hints
Dicas de consulta USE HINT USE HINT Query Hints
Atualizando bancos de dados usando o Assistente de Ajuste de Consulta Upgrading Databases by using the Query Tuning Assistant
Monitorando o desempenho com o repositório de consultas Monitoring Performance By Using the Query Store
Guia de arquitetura de processamento de consultasQuery Processing Architecture Guide