Requisitos de estatísticas de distribuição para provedores OLE DB

Para aprimorar a otimização de consultas distribuídas, o SQL Server define extensões para a especificação OLE DB que os provedores de OLE DB podem utilizar para relatar estatísticas de distribuição nos conjuntos de linhas ou tabelas expostos por eles. Embora essas extensões sejam definidas na documentação do SQL Server, os desenvolvedores individuais OLE DB precisam oferecer suporte a código para extensões em seus provedores para disponibilizar as informações no SQL Server. Se o provedor tiver código que ofereça suporte às extensões, o SQL Server poderá usar as extensões para otimizar o desempenho das consultas distribuídas. Se o provedor não oferecer suporte a extensões, o SQL Server usará estimativas simples das estatísticas de distribuição.

ObservaçãoObservação

O Native Client OLE DB Provider do Microsoft SQL Server e o OLE DB Provider for Oracle do Microsoft oferecem suporte a estatísticas de distribuição.

As extensões de estatísticas de distribuição são criadas em torno de uma unidade chamada estatística. Cada tabela pode ter zero ou mais estatísticas e cada estatística informa dados para uma ou mais colunas. Uma estatística registra o seguinte:

  • A cardinalidade dos valores ou o número de valores exclusivos em cada coluna coberta pela estatística.

  • A cardinalidade dos valores concatenados de todas as colunas cobertas pela estatística.

  • Opcionalmente, um histograma que relata informações sobre os vários intervalos de valores de chave da primeira coluna coberta pela estatística. Os valores relatados podem incluir o número de linhas de cada intervalo de chave; o número de valores exclusivos de cada intervalo de chave ou o número de linhas da tabela cujos valores de chave são menores ou iguais ao maior valor de chave do intervalo.

Esta é uma tabela de exemplo.

ColumnA

ColumnB

'abc'

'xyz'

'abc'

'xyz'

'def'

'xyz'

'mno'

'xyz'

'mno'

'mmm'

'tuv'

'xyz'

Com relação à estatística que cobre a ColumnA e a ColumnB, a cardinalidade dos valores combinados das duas colunas é 5. Isso significa que há 5 combinações exclusivas de valores para a ColumnA e a ColumnB porque as duas primeiras linhas têm o mesmo valor combinado ('abc' + 'xyz').

A cardinalidade independente da ColumnA é 4 e a cardinalidade independente da ColumnB é 2. Um histograma simples, de quatro etapas, na ColumnA poderia relatar.

Intervalo de valor

Porcentagem de linhas de tabela no intervalo

'aaa' a 'hzz'

50%

'iaa' a 'nzz'

33%

'oaa' a 'rzz'

00%

'taa' a 'zzz'

17%

As estatísticas de distribuição de registro de fontes de dados OLE DB em diferentes combinações de colunas, e o conjunto de estatísticas relatadas por um provedor OLE DB, são definidos para implementação. Por exemplo, as versões 6.5 e anteriores do SQL Server criam estatísticas de distribuição apenas para as colunas cobertas por índices, e têm uma estatística para cada índice definido na tabela. A versão 7.0 e posteriores do SQL Server criam as seguintes estatísticas:

  • Uma estatística para cada índice definido em uma tabela.

  • Uma estatística para cada instrução CREATE STATISTIC.

  • Uma estatística para cada estatística gerada automaticamente.

Uma coluna possui um alto grau de seletividade se tiver probabilidade de retornar um pequeno número de linhas para um valor particular especificado em um argumento de predicado. As estatísticas de distribuição podem ser usadas para calcular o grau de seletividade:

  • As colunas com alta cardinalidade têm mais valores de dados, e cada valor de dado tem probabilidade de corresponder a um número menor de linhas que uma coluna com baixa cardinalidade.

  • Se um provedor OLE DB fornecer um histograma que relate como os valores são distribuídos em uma coluna, o otimizador do SQL Server também poderá estimar se o valor específico em um argumento de predicado integra um intervalo com boa ou má seletividade.

Ter boas estatísticas de distribuição para um servidor vinculado pode igualmente auxiliar o otimizador a criar um plano de execução eficaz para a parte local de uma consulta distribuída.

O otimizador do SQL Server usa estatísticas de distribuição em uma tentativa de reduzir a quantidade de dados que precisam ser comunicados entre o provedor OLE DB e o SQL Server. Por exemplo, ao executar uma junção distribuída entre a TableA no servidor local e a TableB em um servidor vinculado, o SQL Server pode usar as estatísticas de distribuição para determinar qual destes processo é o mais eficaz:

  • Enviar as linhas da TableA que correspondem a predicados de não junção para o servidor vinculado e fazer com que o servidor vinculado execute a junção.

  • Recuperar as linhas da TableB que correspondem a predicados de não junção no servidor local e executar a junção no servidor local.

Se o provedor OLE DB não relatar informações de cardinalidade sobre uma coluna, o otimizador do SQL Server fará uma estimativa de baixa cardinalidade. Se o provedor não relatar um histograma de distribuição para a estatística, o otimizador operará como se os valores fossem distribuídos uniformemente nas linhas da tabela.

O SQL Server usa as extensões a seguir de provedores OLE DB para relatar sobre estatísticas de distribuição:

  • Uma propriedade de fonte de dados DBPROP_TABLESTATISTICS indica que o provedor relata estatísticas de distribuição.

  • Um IDBSchemaRowset, TABLE_STATISTICS, lista as estatísticas disponíveis para a tabela base especificada. Isso inclui a cardinalidade da coluna e da linha.

  • IOpenRowset::OpenRowsetaceita argumentos que identificam uma estatística. Quando uma estatística é especificada, OpenRowset retorna um conjunto de linhas de histograma que mostra os valores de distribuição da primeira coluna coberta pela estatística especificada em StatisticID.

Essas extensões para OLE DB são incluídas na versão 2.6 u posterior do OLE DB. Para obter informações sobre essas extensões, com relação às estatísticas de distribuição, consulte a especificação da versão 2.6 do OLE DB.

Um provedor OLE DB pode optar por implementar um aprimoramento de desempenho de amostragem em apenas uma parte das linhas da tabela base para determinar as estatísticas e histogramas de distribuição. Esses provedores podem escalar as cardinalidades e os dados de histograma para que reflitam os valores totais da tabela antes de relatá-los nos conjuntos de linhas de TABLE_STATISTICS e histogramas.

Se o provedor OLE DB irá manter ou não os dados dos conjuntos de linhas de TABLE_STATISTICS e do histograma atualizados com o conteúdo atual da tabela base é definido para implementação.

ObservaçãoObservação

Para criar os melhores planos de consulta quando você estiver usando uma tabela em um servidor viculado, o processador de consulta deverá ter estatísticas de distribuição de dados do servidor viculado. Os usuários que tiverem limitado as permissões em qualquer coluna da tabela talvez não tenham permissões suficientes para obter todas as estatísticas úteis, e poderão receber um plano de consulta menos eficiente e perceber um baixo desempenho. Se o servidor vinculado for uma instância do SQL Server, para obter todas as estatísticas disponíveis, o usuário deverá ser proprietário da tabela ou membro da função de servidor fixa sysadmin, da função de banco de dados fixa db_owner ou da função de banco de dados fixa db_ddladmin no servidor vinculado.