Limitar los conjuntos de resultados con TABLESAMPLE
La cláusula TABLESAMPLE limita el número de filas que se devuelven de una tabla en la cláusula FROM a un número o valor de PERCENT de muestra de las filas. Por ejemplo:
TABLESAMPLE (10 PERCENT) /*Return a sample 10 percent of the rows of the result set. */
TABLESAMPLE (15 ROWS) /* Return a sample of 15 rows from the result set. */.
TABLESAMPLE no se puede aplicar a tablas derivadas, tablas de servidores vinculados y tablas derivadas de funciones con valores de tabla, funciones de conjunto de resultados u OPENXML. No se puede especificar TABLESAMPLE en la definición de una vista o una función insertada con valores de tabla.
La sintaxis de la cláusula TABLESPACE es:
TABLESAMPLE [SYSTEM] (sample_number [ PERCENT | ROWS ] )
[ REPEATABLE (repeat_seed) ]
Nota
TABLESAMPLE se introdujo en SQL Server 2005. Si se utiliza TABLESAMPLE en bases de datos actualizadas de una versión anterior, el nivel de compatibilidad de la base de datos se debe establecer, al menos, en 90. Para establecer el nivel de compatibilidad de la base de datos, vea ALTER DATABASE (Transact-SQL).
Puede usar TABLESAMPLE para devolver rápidamente una muestra de una tabla grande cuando se cumple una de las siguientes condiciones:
La muestra no tiene que ser una muestra realmente aleatoria en el nivel de filas individuales.
Las filas de páginas individuales de la tabla no están correlacionadas con otras filas de la misma página.
Importante |
---|
Si realmente desea una muestra aleatoria de filas individuales, modifique la consulta para filtrar aleatoriamente las filas, en lugar de utilizar TABLESAMPLE. Por ejemplo, en la siguiente consulta se utiliza la función NEWID para devolver aproximadamente un uno por ciento de las filas de la tabla Sales.SalesOrderDetail: SELECT * FROM Sales.SalesOrderDetail WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int) La columna SalesOrderID se incluye en la expresión CHECKSUM para que NEWID() se evalúe una vez por fila para lograr el muestreo fila por fila. La expresión CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) se evalúa en un valor float aleatorio entre 0 y 1. |
Usar la opción SYSTEM
SYSTEM especifica un método de muestreo ANSI SQL que depende de la implementación. La especificación de SYSTEM es opcional, pero es el único método de muestreo disponible en SQL Server y se aplica de forma predeterminada.
TABLESAMPLE SYSTEM devuelve un porcentaje aproximado de filas y genera un valor aleatorio para cada página física de 8 KB de la tabla. Basándose en el valor aleatorio de una página y el porcentaje especificado en la consulta, una página se incluye en la muestra o se excluye de la misma. Cada página incluida devolverá todas las filas en el conjunto de resultados de muestra. Por ejemplo, si se especifica TABLESAMPLE SYSTEM 10 PERCENT, SQL Server devolverá todas las filas de aproximadamente el 10% de las páginas de datos especificadas de la tabla. Si las filas están distribuidas de manera uniforme en las páginas de la tabla y si hay un número suficiente de páginas en la tabla, el número de filas devueltas debe aproximarse al tamaño de muestra solicitado. Sin embargo, puesto que el valor aleatorio generado para cada página es independiente de los valores generados para cualquier otra página, es posible que se devuelva un porcentaje de páginas superior o inferior al solicitado. El operador TOP(n) se puede utilizar para limitar el número de filas a un máximo determinado.
Si se especifica un número de filas en lugar de un porcentaje basado en el número total de filas de la tabla, el número se convertirá en un porcentaje de las filas y, por tanto, de las páginas que se debe devolver. A continuación, se realizará la operación TABLESAMPLE con ese porcentaje calculado.
Si la tabla sólo tiene una página, se devolverán todas las filas de la página o ninguna. En este caso, TABLESAMPLE SYSTEM sólo puede devolver el 100 por cien o el 0 por ciento de las filas de una página, con independencia del número de filas de la página.
La utilización de TABLESAMPLE SYSTEM para una tabla determinada limita el plan de ejecución al uso de un recorrido (del montón o del índice clúster, si existe uno) en dicha tabla. Aunque el plan muestra la realización de un recorrido de la tabla, en realidad sólo es necesario leer las páginas incluidas en el conjunto de resultados del archivo de datos.
Importante |
---|
La cláusula TABLESAMPLE SYSTEM se debe utilizar con precaución, y requiere cierto conocimiento de algunas de las implicaciones del uso del muestreo. Por ejemplo, es probable que una combinación de dos tablas devuelva una coincidencia para cada fila en ambas tablas; sin embargo, si se especifica TABLESAMPLE SYSTEM para una de las dos tablas, es improbable que algunas filas devueltas de la tabla sin muestrear tengan una fila coincidente en la tabla muestreada. Este comportamiento puede llevarle a sospechar que existe un problema de coherencia de datos en las tablas base, cuando realmente los datos son válidos. De forma similar, si se especifica TABLESAMPLE SYSTEM para las dos tablas combinadas, puede que el problema aparente sea peor. |
Usar la opción REPEATABLE
La opción REPEATABLE hace que se devuelva de nuevo una muestra seleccionada. Si REPEATABLE se especifica con el mismo valor de repeat_seed, SQL Server devolverá el mismo subconjunto de filas, siempre que no se haya modificado la tabla. Si REPEATABLE se especifica con un valor de repeat_seed distinto, SQL Server generalmente devolverá una muestra distinta de las filas de la tabla. Se consideran cambios en la tabla las siguientes acciones: insertar, actualizar, eliminar, volver a generar índices, desfragmentar índices, restaurar una base de datos y adjuntar una base de datos.
Ejemplos
A. Seleccionar un porcentaje de filas
La tabla Person.Person contiene 19.972 filas. La siguiente instrucción devuelve aproximadamente el 10 por ciento de las filas. El número de filas devueltas suele cambiar cada que se ejecuta la instrucción.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (10 PERCENT) ;
B. Seleccionar un porcentaje de filas con un valor de inicialización
La siguiente instrucción devuelve el mismo conjunto de filas cada vez que se ejecuta. El valor de inicialización de 205 se ha elegido arbitrariamente.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (10 PERCENT)
REPEATABLE (205) ;
C. Seleccionar un número de filas
La instrucción siguiente devuelve aproximadamente 100 filas. El número real de filas devueltas puede variar considerablemente. Si especifica un número pequeño, como 5, es posible que no obtenga ningún resultado en el ejemplo.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (100 ROWS) ;