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 Microsoft SQL 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 obtener una estadística que cubra ColumnA y ColumnB, la cardinalidad de los valores combinados de las dos columnas debe ser 5. Lo cual quiere decir 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 por sí sola es 4 y la cardinalidad de ColumnB por sí sola es 2. Un sencillo histograma de cuatro pasos en 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 solo 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 que abarca 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 solo 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 cuando utiliza una tabla en un servidor vinculado, el procesador de consultas debe disponer de estadísticas de distribución de datos del servidor vinculado. Es posible que los usuarios que cuentan con permisos limitados en cualquier columna de la tabla no dispongan de los permisos suficientes para obtener todas las estadísticas útiles y podrían obtener un plan de consulta menos eficaz además de producir un mal 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 miembro del rol fijo de servidor sysadmin, del rol de base de datos fijo db_owner o del rol de base de datos fijo db_ddladmin en el servidor vinculado.