Limitando conjuntos de resultados utilizando TABLESAMPLE
A cláusula TABLESAMPLE limita o número de linhas retornadas de uma tabela na cláusula FROM para um número de exemplo ou PERCENT de linhas. Por exemplo:
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 não pode ser se aplicado a tabelas derivadas, tabelas de servidores vinculados, tabelas derivadas de funções com valor de tabela, funções de conjunto de linhas ou OPENXML. TABLESAMPLE não pode ser especificado na definição de uma exibição ou uma função com valor de tabela embutida.
A sintaxe para a cláusula TABLESPACE é a seguinte:
TABLESAMPLE [SYSTEM] (sample_number [ PERCENT | ROWS ] )
[ REPEATABLE (repeat_seed) ]
Observação |
---|
TABLESAMPLE foi introduzido no SQL Server 2005. Quando TABLESAMPLE é utilizado em bancos de dados que são atualizados de uma versão anterior, o nível de compatibilidade do banco de dados deve ser definido a pelo menos 90. Para definir o nível de compatibilidade, consulte ALTER DATABASE (Transact-SQL). |
Você pode usar TABLESAMPLE para retornar rapidamente um exemplo de uma tabela grande quando uma das seguintes das condições for verdadeira:
O exemplo não precisa ser um exemplo verdadeiramente aleatório no nível de linhas individuais.
As linhas em páginas individuais da tabela não estão correlacionadas a outras linhas na mesma página.
Importante |
---|
Se você realmente quiser um exemplo aleatório de linhas individuais, altere sua consulta para filtrar linhas aleatoriamente, ao invés de utilizar TABLESAMPLE. Por exemplo, a seguinte consulta utiliza a função NEWID para retornar aproximadamente 1% das linhas da tabela Sales.SalesOrderDetail: SELECT * FROM Sales.SalesOrderDetail WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int) A coluna SalesOrderID está incluída na expressão CHECKSUM de forma que NEWID() é avaliado uma vez por linha para obter o exemplo em uma base por linha. A expressão CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) é avaliada como um valor float aleatório entre 0 e 1. |
Utilizando a opção SYSTEM
SYSTEM especifica um método de exemplo dependente da implementação do ANSI SQL. A especificação de SYSTEM é opcional, mas esta opção é o único método de exemplo disponível no SQL Server e é aplicada por padrão.
TABLESAMPLE SYSTEM retorna uma porcentagem aproximada de linhas e gera um valor aleatório para cada página física de 8 KB na tabela. Baseado no valor aleatório para uma página e na porcentagem especificada na consulta, uma página é incluída ou não no exemplo. Cada página incluída retorna todas as linhas no conjunto de resultados do exemplo. Por exemplo, se você especificar TABLESAMPLE SYSTEM 10 PERCENT, o SQL Server retornará todas as linhas em aproximadamente 10% das páginas de dados especificadas da tabela. Se as linhas forem distribuídas uniformemente nas páginas da tabela, e se houver um número suficiente de páginas na tabela, o número de linhas retornado deverá se aproximar ao tamanho de exemplo solicitado. Entretanto, como o valor aleatório gerado para cada página é independente dos valores gerados para qualquer página, poderá ser retornada uma porcentagem de páginas maior ou menor que a solicitada. O operador TOP(n) pode ser utilizado para limitar o número de linhas a um máximo especificado.
Quando são especificadas várias linhas, em vez de uma porcentagem baseada no número total de linhas na tabela, esse número é convertido em uma porcentagem das linhas e, portanto, páginas que deveriam ser retornadas. A operação TABLESAMPLE é executada com essa porcentagem computada.
Se a tabela for composta de uma única página, serão retornadas todas as linhas da página ou nenhuma. Nesse caso, TABLESAMPLE SYSTEM poderá retornar somente 100% ou 0% das linhas em uma página, independentemente do número de linhas na página.
A utilização do TABLESAMPLE SYSTEM para uma tabela específica limita o plano de execução ao utilizar uma verificação de tabela (uma verificação do heap ou do índice clusterizado, se houver) naquela tabela. Embora o plano mostre que uma verificação de tabela está em execução, somente as páginas incluídas no conjunto de resultados precisam realmente ser lidas no arquivo de dados.
Importante |
---|
A cláusula TABLESAMPLE SYSTEM deve ser utilizada com precaução e com alguma compreensão das implicações da utilização de um exemplo. Por exemplo, é provável que uma junção de duas tabelas retorne uma correspondência para cada linha em ambas as tabelas; porém, se for especificado TABLESAMPLE SYSTEM para qualquer uma das tabelas, algumas linhas retornadas da tabela sem exemplo não deverão ter uma linha correspondente na tabela de exemplo. Esse comportamento poderia levá-lo a suspeitar que existe um problema de consistência de dados nas tabelas subjacentes, quando na realidade os dados são válidos. Da mesma forma, se for especificado TABLESAMPLE SYSTEM para ambas as tabelas que foram unidas, o problema percebido poderá ser ainda pior. |
Utilizando a opção REPEATABLE
A opção REPEATABLE faz com que um exemplo selecionado seja retornado novamente. Quando REPEATABLE é especificado com o mesmo valor repeat_seed, o SQL Server retorna o mesmo subconjunto de linhas, desde que não seja feita nenhuma alteração na tabela. Quando REPEATABLE é especificado com um valor repeat_seed diferente, o SQL Server retorna um exemplo diferente das linhas na tabela. As ações a seguir da tabela são consideradas alterações: inserção, atualização, exclusão, recriação de índice, desfragmentação de índice, restauração de um banco de dados e anexação de um banco de dados.
Exemplos
A. Selecionando uma porcentagem de linhas
A tabela Person.Person contém 19.972 linhas. A instrução a seguir retorna aproximadamente 10% das linhas. O número de linhas retornado normalmente é alterado sempre que a instrução é executada.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (10 PERCENT) ;
B. Selecionando uma porcentagem de linhas com um valor de semente
A instrução a seguir retorna o mesmo conjunto de linhas sempre que é executada. O valor de semente 205 foi escolhido aleatoriamente.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (10 PERCENT)
REPEATABLE (205) ;
C. Selecionando um número de linhas
A instrução a seguir retorna aproximadamente 100% das linhas. O número real de linhas retornadas pode variar significativamente. Se for especificado um número pequeno, como cinco, você pode não receber resultados no exemplo.
USE AdventureWorks2008R2 ;
GO
SELECT FirstName, LastName
FROM Person.Person
TABLESAMPLE (100 ROWS) ;