Requisitos de las estadísticas de distribución para proveedores OLE DB

Para mejorar la optimización de las consultas distribuidas, SQL Server define extensiones para la especificación OLE DB que los proveedores OLE DB pueden utilizar para generar informes acerca de las estadísticas de distribución de los conjuntos de filas, o tablas, que exponen. Aunque estas extensiones están definidas en la documentación de SQL Server, los desarrolladores de los proveedores OLE DB deben incluir código que admita estas extensiones si desean que la información esté disponible en SQL Server. Si un proveedor tiene código que admite las extensiones, SQL Server puede utilizarlas para optimizar el rendimiento de las consultas distribuidas. Si un proveedor no admite las extensiones, SQL Server utiliza simples estimaciones de las estadísticas de distribución.

[!NOTA]

El proveedor OLE DB de MicrosoftSQL Server Native Client y el proveedor de Microsoft OLE DB para Oracle admiten las estadísticas de distribución.

Las extensiones de las estadísticas de distribución se crean a partir de una unidad denominada estadística. Cada tabla puede tener cero o más estadísticas, y cada estadística informa de los datos de una o más columnas. Una estadística registra lo siguiente:

  • La cardinalidad de los valores o el número de valores únicos, en cada columna de la estadística.

  • La cardinalidad de los valores concatenados de todas las columnas de la estadística.

  • Opcionalmente, un histograma que presenta información acerca de distintos intervalos de valores de clave en la primera columna del ámbito de la estadística. Los valores presentados pueden incluir el número de filas de cada intervalo de claves, el número de valores únicos en cada intervalo de claves, o el número de filas de la tabla cuyos valores de clave sean menores o iguales que el valor de clave superior del intervalo.

A continuación, se muestra una tabla de ejemplo.

ColumnA

ColumnB

'abc'

'xyz'

'abc'

'xyz'

'def'

'xyz'

'mno'

'xyz'

'mno'

'mmm'

'tuv'

'xyz'

Para una estadística que abarque ColumnA y ColumnB, la cardinalidad de los valores combinados de las dos columnas es 5. Esto significa que hay 5 combinaciones únicas de valores para ColumnA y ColumnB porque las dos primeras filas tienen el mismo valor combinado ('abc' + 'xyz').

La cardinalidad de ColumnA es 4 y la cardinalidad de ColumnB es 2. Un histograma simple de cuatro pasos para ColumnA podría presentar la información siguiente.

Intervalo de valores

Porcentaje de filas de tabla dentro del intervalo

de 'aaa' a 'hzz'

50%

de 'iaa' a 'nzz'

33%

de 'oaa' a 'rzz'

00%

de 'taa' a 'zzz'

17%

Cada origen de datos OLE DB registra las estadísticas de distribución con distintas combinaciones de columnas y el conjunto de estadísticas que presenta un proveedor OLE DB es específico de cada implementación. Por ejemplo, en SQL Server 6.5 y versiones anteriores, las estadísticas de distribución sólo se generan para las columnas incluidas en los índices y hay una estadística para cada índice definido en una tabla. En SQL Server 7.0 y versiones posteriores se generan las siguientes estadísticas:

  • Una estadística para cada índice definido en una tabla.

  • Una estadística para cada instrucción CREATE STATISTIC.

  • Una estadística para cada estadística generada automáticamente.

Una columna presenta un grado elevado de selectividad si es probable que devuelva un número pequeño de filas para un valor determinado que se especifica en un argumento de predicado. Las estadísticas de distribución se pueden utilizar para estimar el grado de selectividad:

  • Las columnas con cardinalidad elevada tienen más valores de datos. Cada valor de datos tiene más probabilidades de coincidir con un número menor de filas que una columna con cardinalidad baja.

  • Si un proveedor OLE DB presenta un histograma que informa de cómo se distribuyen los valores en una columna, el optimizador de SQL Server también puede estimar si el valor específico de un argumento de predicado se encuentra dentro de un intervalo que tiene mucha o poca selectividad.

Si se dispone de estadísticas de distribución óptimas para un servidor vinculado, el optimizador también podrá crear un plan de ejecución eficaz para la parte local de una consulta distribuida.

El optimizador de SQL Server utiliza las estadísticas de distribución para intentar reducir la cantidad de datos que se debe comunicar entre el proveedor OLE DB y SQL Server. Por ejemplo, al realizar una combinación distribuida entre TableA en el servidor local y TableB en un servidor vinculado, SQL Server puede utilizar las estadísticas de distribución para determinar cuál de estos procesos es más eficaz:

  • Enviar las filas de TableA que coincidan con predicados de no combinación al servidor vinculado y hacer que éste realice la combinación.

  • Recuperar las filas de TableB que coincidan con predicados de no combinación en el servidor local y realizar la combinación en éste.

Si un proveedor OLE DB no presenta información acerca de la cardinalidad de una columna, el optimizador de SQL Server estima una cardinalidad baja. Si un proveedor no genera un histograma de distribución para una estadística, el optimizador actúa como si los valores estuviesen distribuidos por igual entre las filas de la tabla.

SQL Server utiliza las siguientes extensiones de proveedores OLE DB para mostrar las estadísticas de distribución:

  • Una nueva propiedad de origen de datos, DBPROP_TABLESTATISTICS, indica si el proveedor muestra las estadísticas de distribución.

  • Una interfaz IDBSchemaRowset, TABLE_STATISTICS, muestra las estadísticas disponibles para una tabla base especificada. Se incluye la cardinalidad de columna y fila.

  • IOpenRowset::OpenRowset acepta argumentos que identifican una estadística. Cuando se especifica una estadística, OpenRowset devuelve un conjunto de filas de histograma que muestra la distribución de los valores de la primera columna abarcada por la estadística especificada en StatisticID.

Estas extensiones de OLE DB se incluyen en OLE DB 2.6 y versiones posteriores. Para obtener información acerca de estas extensiones en lo referente a estadísticas de distribución, vea la especificación de OLE DB 2.6.

Los proveedores OLE DB pueden implementar una mejora de rendimiento que consiste en muestrear sólo una parte de las filas de una tabla base para determinar las estadísticas de distribución y los histogramas. Estos proveedores deberán ampliar los datos de cardinalidad e histograma para reflejar los valores totales de la tabla antes de informar acerca de ellos en los conjuntos de filas TABLE_STATISTICS y del histograma.

El hecho de que un proveedor OLE DB mantenga actualizados los datos de los conjuntos de filas TABLE_STATISTICS y del histograma con el contenido actual de la tabla base se define en la implementación.

[!NOTA]

Para crear los mejores planes de consulta al usar una tabla en un servidor vinculado, el procesador de consultas debe tener estadísticas de la distribución de datos del servidor vinculado. Los usuarios con permisos limitados en las columnas de la tabla puede que no tengan permisos suficientes para obtener todas las estadísticas de utilidad, y puede que reciban un plan de consulta menos eficaz y experimenten un bajo rendimiento. Si el servidor vinculado es una instancia de SQL Server, para obtener todas las estadísticas disponibles, el usuario debe ser propietario de la tabla o ser miembro de la función fija de servidor sysadmin, de la función fija de base de datos db_owner o de la función fija de base de datos db_ddladmin en el servidor vinculado.