Estimación de cardinalidad (SQL Server)Cardinality Estimation (SQL Server)

SE APLICA A: síSQL Server síAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelosAPPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

El Optimizador de consultas de SQL ServerSQL Server es un optimizador basado en el costo.The SQL ServerSQL Server Query Optimizer is a cost-based Query Optimizer. Esto significa que selecciona los planes de consulta cuya ejecución tiene el menor costo de procesamiento estimado.This means that it selects query plans that have the lowest estimated processing cost to execute. El optimizador de consultas determina el costo de ejecución de un plan de consulta en función de dos factores principales:The Query Optimizer determines the cost of executing a query plan based on two main factors:

  • El número total de filas procesadas en cada nivel de un plan de consulta, denominado cardinalidad del plan.The total number of rows processed at each level of a query plan, referred to as the cardinality of the plan.
  • El modelo de costos del algoritmo determinado por los operadores que se utiliza en la consulta.The cost model of the algorithm dictated by the operators used in the query.

El primer factor, la cardinalidad, se utiliza como parámetro de entrada del segundo factor, el modelo de costos.The first factor, cardinality, is used as an input parameter of the second factor, the cost model. Por lo tanto, una cardinalidad mejorada se traduce en menores costos y, a su vez, en planes de ejecución más rápidos.Therefore, improved cardinality leads to better estimated costs and, in turn, faster execution plans.

La estimación de cardinalidad en SQL ServerSQL Server calcula la cardinalidad principalmente a partir de histogramas que se crean al crear, manual o automáticamente, índices o estadísticas.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. En ocasiones, SQL ServerSQL Server también utiliza información de restricciones y nuevas versiones lógicas de consultas para determinar la cardinalidad.Sometimes, SQL ServerSQL Server also uses constraint information and logical rewrites of queries to determine cardinality.

En los casos siguientes, SQL ServerSQL Server no puede calcular con precisión las cardinalidades.In the following cases, SQL ServerSQL Server cannot accurately calculate cardinalities. Esto deriva en cálculos de costos inexactos que pueden provocar planes de consulta de menor calidad.This causes inaccurate cost calculations that may cause suboptimal query plans. Si evita estas construcciones en las consultas, el rendimiento de las mismas podría mejora.Avoiding these constructs in queries may improve query performance. En ocasiones es posible utilizar formulaciones de consulta alternativas u otras medidas; esto se indicará en esas ocasiones:Sometimes, alternative query formulations or other measures are possible and these are pointed out:

  • Consultas con predicados que utilizan operadores de comparación entre distintas columnas de la misma tabla.Queries with predicates that use comparison operators between different columns of the same table.
  • Consultas con predicados que utilizan operadores y se cumple alguna de las siguientes condiciones:Queries with predicates that use operators, and any one of the following are true:
    • No hay estadísticas en las columnas que se utilizan a uno u otro lado de los operadores.There are no statistics on the columns involved on either side of the operators.
    • La distribución de valores en las estadísticas no es uniforme, pero la consulta busca un conjunto de valores muy selectivos.The distribution of values in the statistics is not uniform, but the query seeks a highly selective value set. Esta situación se cumple especialmente cuando el operador es distinto al operador de igualdad (=).This situation can be especially true if the operator is anything other than the equality (=) operator.
    • El predicado utiliza el operador de comparación No es igual a (!=) o el operador lógico NOT.The predicate uses the not equal to (!=) comparison operator or the NOT logical operator.
  • Consultas que utilizan alguna de las funciones integradas de SQL Server o una función escalar definida por el usuario cuyo argumento no es un 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 implican columnas de combinación por medio de operadores aritméticos o de concatenación de cadenas.Queries that involve joining columns through arithmetic or string concatenation operators.
  • Consultas que comparan variables cuyos valores no se conocen cuando la consulta se compila y optimiza.Queries that compare variables whose values are not known when the query is compiled and optimized.

En este artículo se explica cómo evaluar y elegir la mejor configuración de estimación de cardinalidad para su sistema.This article illustrates how you can assess and choose the best CE configuration for your system. La mayoría de los sistemas sacan partido de la última estimación de cardinalidad, porque es la más precisa.Most systems benefit from the latest CE because it is the most accurate. Con la estimación de cardinalidad se predice cuántas filas va a devolver la consulta casi con toda seguridad.The CE predicts how many rows your query will likely return. El optimizador de consultas usa la predicción de cardinalidad para generar el mejor plan de consulta posible.The cardinality prediction is used by the Query Optimizer to generate the optimal query plan. Con estimaciones más precisas, el optimizador de consultas normalmente puede hacer mejor su trabajo a la hora de generar un plan de consulta óptimo.With more accurate estimations, the Query Optimizer can usually do a better job of producing a more optimal query plan.

Es bastante probable que el sistema de aplicaciones tenga una consulta importante cuyo plan cambie a un plan más lento debido a cambios en la estimación de cardinalidad a lo largo de las versiones.Your application system could possibly have an important query whose plan is changed to a slower plan due to changes in the CE throughout versions. Existen diversas técnicas y herramientas para detectar una consulta que se ralentiza debido a problemas de la estimación de cardinalidad.You have techniques and tools for identifying a query that performs slower due to CE issues. También hay diversas opciones para abordar los problemas de rendimiento resultantes.And you have options for how to address the ensuing performance issues.

Versiones de la estimación de cardinalidadVersions of the CE

En 1998, SQL ServerSQL Server 7.0 incorporó una actualización importante de la estimación de cardinalidad, para la que el nivel de compatibilidad fue 70.In 1998, a major update of the CE was part of SQL ServerSQL Server 7.0, for which the compatibility level was 70. Esta versión del modelo de estimación de cardinalidad se establece sobre cuatro suposiciones básicas:This version of the CE model is set on four basic assumptions:

  • Independencia: se supone que las distribuciones de datos en otras columnas de métodos son independientes entre sí, a menos que la información de correlación esté disponible y se pueda usar.Independence: Data distributions on different columns are assumed to be independent of each other, unless correlation information is available and usable.
  • Uniformidad: los distintos valores tienen un espaciado uniforme y todos tienen la misma frecuencia.Uniformity: Distinct values are evenly spaced and that they all have the same frequency. Concretamente, dentro de cada paso del histograma, los distintos valores se distribuyen uniformemente y cada valor tiene la misma frecuencia.More precisely, within each histogram step, distinct values are evenly spread and each value has same frequency.
  • Contención (simple): los usuarios consultan datos que existen.Containment (Simple): Users query for data that exists. Por ejemplo, para una combinación de igualdad entre dos tablas, tenga en cuenta la selectividad de predicados 1 en cada histograma de entrada antes de unir histogramas para estimar la selectividad de combinación.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.
  • Inclusión: para los predicados de filtro donde Column = Constant, se supone que la constante existe realmente para la columna asociada.Inclusion: For filter predicates where Column = Constant, the constant is assumed to actually exist for the associated column. Si un paso del histograma correspondiente no está vacío, se supone que uno de los valores distintos de los pasos coincide con el valor del 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.

Recuento de 1 filas que cumple el predicado.1 Row count that satisfies the predicate.

Las actualizaciones posteriores empezaron por SQL Server 2014 (12.x)SQL Server 2014 (12.x), que se tradujo en los niveles de compatibilidad 120 y posteriores.Subsequent updates started with SQL Server 2014 (12.x)SQL Server 2014 (12.x), meaning compatibility levels 120 and above. Las actualizaciones de estimación de cardinalidad correspondientes a los niveles 120 y posteriores incorporan suposiciones y algoritmos actualizados que funcionan bien en el almacenamiento de datos modernos y en las cargas de trabajo 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. Desde las suposiciones de estimación de cardinalidad de nivel 70, se cambiaron las siguientes suposiciones del modelo a partir de la estimación de cardinalidad de nivel 120:From the CE 70 assumptions, the following model assumptions were changed starting with CE 120:

  • La independencia se convierte en correlación: la combinación de los distintos valores de columna no son necesariamente independientes.Independence becomes Correlation: The combination of the different column values are not necessarily independent. Esto puede parecerse más a las consultas de datos reales.This may resemble more real-life data querying.
  • La contención simple se convierte en contención de base: es posible que los usuarios consulten datos que no existen.Simple Containment becomes Base Containment: Users might query for data that does not exist. Por ejemplo, para una combinación de igualdad entre dos tablas, usamos los histogramas de tablas base para calcular la selectividad de combinación y, después, el factor en la selectividad 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.

Nivel de compatibilidad: para asegurarse de que la base de datos esté en un nivel determinado, use el siguiente código de 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  

En el caso de una base de datos de SQL ServerSQL Server con un nivel de compatibilidad 120 o superior, la activación de la marca de seguimiento 9481 obliga al sistema a usar la versión 70 de la estimación de cardinalidad.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.

Estimación de cardinalidad heredada: en el caso de una base de datos de SQL ServerSQL Server con el nivel de compatibilidad 120 y superior, la versión 70 de la estimación de cardinalidad se puede activar con la instrucción 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

O bien, a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, la sugerencia 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'));  

Almacén de consultas: a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), el almacén de consultas es una herramienta muy útil para examinar el rendimiento de las 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. En Management StudioManagement Studio, en el Explorador de objetos, debajo del nodo de la base de datos, se muestra un nodo del Almacén de consultas, si este 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;  

Sugerencia

Se recomienda instalar la última versión de Management Studio y actualizarlo con frecuencia.We recommend that you install the latest release of Management Studio and update it often.

Importante

Asegúrese de que el almacén de consultas esté configurado correctamente para la base de datos y la carga de trabajo.Ensure the Query Store is correctly configured for your database and workload. Para más información, consulte Procedimiento recomendado con el Almacén de consultas.For more information, see Best practices with Query Store.

Otra opción para llevar un seguimiento del proceso de estimación de cardinalidad consiste en usar el evento extendido denominado query_optimizer_estimate_cardinality.Another option for tracking the cardinality estimation process is to use the extended event named query_optimizer_estimate_cardinality. El siguiente código de ejemplo de Transact-SQLTransact-SQL se ejecuta en SQL ServerSQL Server.The following Transact-SQLTransact-SQL code sample runs on SQL ServerSQL Server. Escribe un archivo .xel en C:\Temp\ (aunque la ruta de acceso se puede cambiar).It writes a .xel file to C:\Temp\ (although you can change the path). Cuando abra el archivo .xel en Management StudioManagement Studio, podrá consultar la información detallada de forma muy sencilla.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 obtener más información sobre los eventos extendidos adaptados para SQL DatabaseSQL Database, consulte Eventos extendidos en SQL Database.For information about extended events as tailored for SQL DatabaseSQL Database, see Extended events in SQL Database.

Pasos para evaluar la versión de estimación de cardinalidadSteps to assess the CE version

Estos son los pasos que se pueden realizar para saber si alguna de las consultas más importantes tiene un peor rendimiento tras la estimación de cardinalidad más reciente.Next are steps you can use to assess whether any of your most important queries perform less well under the latest CE. Algunos de estos pasos se llevan a cabo ejecutando código de ejemplo incluido en una sección anterior.Some of the steps are performed by running a code sample presented in a preceding section.

  1. Abra Management StudioManagement Studio.Open Management StudioManagement Studio. Asegúrese de que la base de datos de SQL ServerSQL Server está establecida en el nivel de compatibilidad más alto disponible.Ensure your SQL ServerSQL Serverdatabase is set to the highest available compatibility level.

  2. Realice los siguientes pasos preliminares:Perform the following preliminary steps:

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

    2. Ejecute el código T_SQL para asegurarse de que la base de datos de SQL ServerSQL Server está establecida en el nivel de compatibilidad más alto disponible.Run the T-SQL to ensure that your SQL ServerSQL Server database is set to the highest available compatibility level.

    3. Asegúrese de que la configuración LEGACY_CARDINALITY_ESTIMATION de la base de datos está desactivada.Ensure that your database has its LEGACY_CARDINALITY_ESTIMATION configuration turned OFF.

    4. Borre el contenido del almacén de consultas.Clear your Query Store. Asegúrese de que el almacén de consultas está activado.Ensure your Query Store is ON.

    5. Ejecute la instrucción SET NOCOUNT OFF;.Run the statement: SET NOCOUNT OFF;

  3. Ejecute la instrucción SET STATISTICS XML ON;.Run the statement: SET STATISTICS XML ON;

  4. Ejecute la consulta importante.Run your important query.

  5. En la pestaña Mensajes del panel de resultados, anote el número real de filas afectadas.In the results pane, on the Messages tab, note the actual number of rows affected.

  6. En la pestaña Resultados del panel de resultados, haga doble clic en la celda que contiene las estadísticas en formato XML.In the results pane on the Results tab, double-click the cell that contains the statistics in XML format. Se abre un plan de consulta gráfico.A graphic query plan is displayed.

  7. Haga clic con el botón derecho en el primer cuadro del plan de consulta gráfico y, después, haga clic en Propiedades.Right-click the first box in the graphic query plan, and then click Properties.

  8. A fin de poder compararlos posteriormente con otra configuración, anote los valores de las siguientes propiedades:For later comparison with a different configuration, note the values for the following properties:

    • CardinalityEstimationModelVersion.CardinalityEstimationModelVersion.

    • Número de filas estimado.Estimated Number of Rows.

    • Costo de E/S estimadoy otras propiedades de estimación similares que tengan que ver con el rendimiento real más que con las predicciones de números de filas.Estimated I/O Cost, and several similar Estimated properties that involve actual performance rather than row count predictions.

    • Operación lógica y Operación física.Logical Operation and Physical Operation. Paralelismo es un buen valor.Parallelism is a good value.

    • Modo de ejecución real.Actual Execution Mode. Lote es un buen valor, mejor que Fila.Batch is a good value, better than Row.

  9. Compare el número estimado de filas con el número real de filas.Compare the estimated number of rows to the actual number of rows. ¿Existe una imprecisión de la estimación de cardinalidad de un 1 % (por encima o por debajo) o de un 10 %?Is the CE inaccurate by 1% (high or low), or by 10%?

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

  11. Ejecute el código T-SQL para rebajar la base de datos un nivel de compatibilidad (por ejemplo, de 130 a 120).Run the T-SQL to decrease the compatibility level of your database by one level (such as from 130 down to 120).

  12. Vuelva a ejecutar todos los pasos no preliminares.Rerun all the non-preliminary steps.

  13. Compare los valores de propiedad de la estimación de cardinalidad de ambos procesos.Compare the CE property values from the two runs.

    • ¿Es el porcentaje de imprecisión con la nueva estimación de cardinalidad inferior que con la estimación de cardinalidad anterior?Is the inaccuracy percentage under the newest CE less than under the older CE?
  14. Por último, compare los distintos valores de propiedad de rendimiento de ambos procesos.Finally, compare the various performance property values from the two runs.

    • ¿Usó la consulta un plan diferente en cada una de las estimaciones de cardinalidad?Did your query use a different plan under the two differing CE estimations?

    • ¿Tuvo la consulta un rendimiento inferior con la estimación de cardinalidad más reciente?Did your query run slower under the latest CE?

    • A menos que la consulta muestre un mejor rendimiento y con un plan distinto en la estimación de cardinalidad anterior, lo más probable es que la estimación de cardinalidad más reciente sea la que más le convenga.Unless your query runs better and with a different plan under the older CE, you almost certainly want the latest CE.

    • Pero si la consulta se ejecuta con un plan más rápido en la estimación de cardinalidad anterior, considere la posibilidad de obligar al sistema a usar el plan más rápido y omitir la estimación de cardinalidad.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. De este modo, dispondrá de la estimación de cardinalidad más reciente para todo y, al mismo tiempo, mantendrá el plan más rápido para el caso inusual.This way you can have the latest CE on for everything, while keeping the faster plan in the one odd case.

Cómo activar el mejor plan de consultaHow to activate the best query plan

Supongamos que, con la estimación de cardinalidad de nivel 120 o superior, se genera un plan de consulta menos eficaz para la consulta.Suppose that with CE 120 or above, a less efficient query plan is generated for your query. Estas son algunas opciones disponibles para activar el plan mejor plan:Here are some options you have to activate the better plan:

  1. El nivel de compatibilidad se podría establecer en un nivel inferior que el último disponible para toda la base de datos.You could set the compatibility level to a value lower than the latest available, for your whole database.

    • Por ejemplo, al establecer el nivel de compatibilidad 110 o inferior, se activa la estimación de cardinalidad de nivel 70, pero todas las consultas quedan sujetas al modelo de estimación de cardinalidad anterior.For example, setting the compatibility level 110 or lower activates CE 70, but it makes all queries subject to the previous CE model.

    • Además, si se ajusta un nivel de compatibilidad inferior también falta una serie de mejoras en el optimizador de consultas para las versiones más recientes.Further, setting a lower compatibility level also misses a number of improvements in the query optimizer for latest versions.

  2. Puede usar la opción de base de datos LEGACY_CARDINALITY_ESTIMATION para que toda la base de datos use la estimación de cardinalidad anterior y conservar al mismo tiempo otras mejoras en el optimizador de consultas.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. Puede usar la opción de consulta LEGACY_CARDINALITY_ESTIMATION para que una sola consulta use la estimación de cardinalidad anterior y conservar al mismo tiempo otras mejoras en el optimizador de consultas.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 lograr el mayor control, podría obligar al sistema a usar el plan que se generó con la estimación de cardinalidad de 70 durante las pruebas.For the finest control, you could force the system to use the plan that was generated with CE 70 during your testing. Después de asignar un plan de su elección, puede configurar toda la base de datos de forma que use el nivel de compatibilidad y la estimación de cardinalidad más recientes.After you pin your preferred plan, you can set your whole database to use the latest compatibility level and CE. Pasemos a explicar esta opción.The option is elaborated next.

Cómo forzar un plan de consulta particularHow to force a particular query plan

El almacén de consultas ofrece diferentes formas para obligar al sistema a usar un plan de consulta en particular:The query store gives you different ways that you can force the system to use a particular query plan:

  • Ejecute sp_query_store_force_plan.Execute sp_query_store_force_plan.

  • En Management StudioManagement Studio, expanda el nodo Almacén de consultas, haga clic con el botón derecho en Consultas que más recursos consumen y, después, haga clic en Ver consultas que más recursos consumen.In Management StudioManagement Studio, expand your Query Store node, right-click Top Resource Consuming Nodes, and then click View Top Resource Consuming Nodes. La pantalla recoge los botones Forzar plan y No forzar plan.The display shows buttons labeled Force Plan and Unforce Plan.

Para obtener más información sobre el almacén de consultas, vea Supervisar el rendimiento mediante el almacén de consultas.For more information about the query store, see Monitoring Performance By Using the Query Store.

Ejemplos de mejoras en la estimación de cardinalidadExamples of CE improvements

En esta sección se muestran consultas de ejemplo en las que se saca partido de las mejoras implementadas en la estimación de cardinalidad en versiones recientes.This section describes example queries that benefit from the enhancements implemented in the CE in recent releases. Se trata de información general que no precisa de ninguna acción por su parte.This is background information that does not call for specific action on your part.

Ejemplo A. La estimación de cardinalidad entiende que el valor máximo podría ser superior al de las últimas estadísticas recopiladasExample A. CE understands maximum value might be higher than when statistics were last gathered

Imagine que las estadísticas para OrderTable se recopilaron por última vez en 2016-04-30, cuando el valor 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. La estimación de cardinalidad de nivel 120 (y versiones posteriores) entiende que las columnas en OrderTable con datos ascendentes podrían tener valores mayores que el máximo registrado por las estadí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. Este entendimiento mejora el plan de consulta para instrucciones SELECT de Transact-SQLTransact-SQL como la siguiente.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';  

Ejemplo B. La estimación de cardinalidad entiende que, a menudo, los predicados filtrados en una misma tabla se correlacionanExample B. CE understands that filtered predicates on the same table are often correlated

En la siguiente instrucción SELECT vemos predicados filtrados en Model y ModelVariant.In the following SELECT we see filtered predicates on Model and ModelVariant. Deducimos de manera intuitiva que, cuando Model es "Xbox", hay una posibilidad de que ModelVariant sea "One", dado que Xbox tiene una variante que se llama 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 de la estimación de calidad de nivel 120, SQL ServerSQL Server entiende que podría haber una correlación entre las dos columnas en la misma tabla, Model y 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. La estimación de cardinalidad hace una estimación más precisa del número de filas que la consulta va a devolver, mientras que el optimizador de consultas genera un plan mucho mejor.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';  

Ejemplo C. La estimación de cardinalidad ya no da por hecho ninguna correlación entre los predicados filtrados de tablas distintasExample C. CE no longer assumes any correlation between filtered predicates from different tables

Las nuevas investigaciones exhaustivas en las cargas de trabajo y datos empresariales reales de hoy día han puesto de manifiesto que predicar filtros de tablas distintas no hace que se establezca ningún tipo de correlación entre sí.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. En la siguiente consulta, la estimación de cardinalidad da por hecho que no hay ninguna correlación entre s.type y r.date.In the following query, the CE assumes there is no correlation between s.type and r.date. Por tanto, hace una estimación más baja del número de filas devuelto.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 tambiénSee Also

Supervisión y optimización del rendimiento Monitor and Tune for Performance
Optimizing Your Query Plans with the SQL Server 2014 Cardinality EstimatorOptimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator
Sugerencias de consulta Query Hints
Sugerencias de consulta USE HINT USE HINT Query Hints
Actualización de bases de datos mediante el Asistente para la optimización de consultas Upgrading Databases by using the Query Tuning Assistant
Monitoring Performance By Using the Query Store Monitoring Performance By Using the Query Store
Guía de arquitectura de procesamiento de consultasQuery Processing Architecture Guide