Share via


Solucionar problemas de bajo rendimiento de consultas: estimación de cardinalidad

El optimizador de consultas de SQL Server se basa en costos. Esto significa que selecciona los planes de consultas cuya ejecución tiene el menor costo de procesamiento estimado. El optimizador de consultas determina el costo de ejecución de un plan de consultas en función de dos factores principales:

  • El número total de filas procesadas en cada nivel de un plan de consultas, denominado cardinalidad del plan.
  • El modelo de costos del algoritmo determinado por los operadores que se utiliza en la consulta.

El primer factor, la cardinalidad, se utiliza como parámetro de entrada del segundo factor, el modelo de costos. Por lo tanto, una cardinalidad mejorada se traduce en menores costos y, a su vez, en planes de ejecución más rápidos.

SQL Server calcula la cardinalidad principalmente a partir de histogramas que se crean al crear, manual o automáticamente, índices o estadísticas. En ocasiones, SQL Server también utiliza información de restricciones y nuevas versiones lógicas de consultas para determinar la cardinalidad.

En los casos siguientes, SQL Server no puede calcular con precisión las cardinalidades. Esto deriva en cálculos de costos inexactos que pueden provocar planes de consultas de menor calidad. Si evita estas construcciones en las consultas, el rendimiento de las mismas podría mejora. En ocasiones es posible utilizar formulaciones de consulta alternativas u otras medidas; esto se indicará en esas ocasiones.

  • Consultas con predicados que utilizan operadores de comparación entre distintas columnas de la misma tabla.
  • Consultas con predicados que utilizan operadores y se cumple alguna de las siguientes condiciones:
    • No hay estadísticas en las columnas que se utilizan a uno u otro lado de los operadores.
    • La distribución de valores en las estadísticas no es uniforme, pero la consulta busca un conjunto de valores muy selectivos. Esta situación se cumple especialmente cuando el operador es distinto al operador de igualdad (=).
    • El predicado utiliza el operador de comparación No es igual a (!=) o el operador lógico NOT.
  • Consultas que utilizan alguna de las funciones integradas de SQL Server o una función con valores escalares definida por el usuario cuyo argumento no es un valor constante.
  • Consultas que implican columnas de combinación por medio de operadores aritméticos o de concatenación de cadenas.
  • Consultas que comparan variables cuyos valores no se conocen cuando la consulta se compila y optimiza.

Se pueden utilizar las siguientes medidas para intentar mejorar el rendimiento en estos tipos de consultas:

  • Genere índices o estadísticas útiles en las columnas que intervienen en la consulta. Para obtener más información, vea Diseñar índices y Estadísticas de índice.

  • Considere la posibilidad de utilizar columnas calculadas y volver a escribir la consulta si ésta utiliza operadores aritméticos o de comparación para comparar o combinar dos o más columnas. Por ejemplo, la siguiente consulta compara los valores de dos columnas:

    SELECT * FROM MyTable
    WHERE MyTable.Col1 > MyTable.Col2
    

    El rendimiento puede mejorarse si se agrega una columna calculada Col3 a MyTable que calcule la diferencia entre Col1 y Col2 (Col1 menos Col2). A continuación, vuelva a escribir la consulta:

    SELECT * FROM MyTable
    WHERE Col3 > 0
    

    El rendimiento probablemente mejore aún más si se genera un índice en MyTable.Col3.

Vea también

Conceptos

Solucionar problemas de bajo rendimiento de las consultas: doblado de constantes y evaluación de expresiones durante la estimación de la cardinalidad

Otros recursos

Optimizar consultas
Solucionar problemas de consultas

Ayuda e información

Obtener ayuda sobre SQL Server 2005