Partilhar via


Como saber se ocorreu uma operação de compressão externa

Este artigo detalha como determinar se uma consulta PolyBase está se beneficiando do pushdown para a fonte de dados externa. Para obter mais informações sobre pushdown externo, consulte cálculos de pushdown no PolyBase.

A minha consulta está a beneficiar de optimização externa?

A computação pushdown melhora o desempenho de consultas em fontes de dados externas. Determinadas tarefas de computação são delegadas à fonte de dados externa em vez de serem trazidas para o SQL Server. Especialmente nos casos de filtragem e rebaixamento de junções, a carga de trabalho na instância do SQL Server pode ser muito reduzida.

A computação pushdown do PolyBase pode melhorar significativamente o desempenho da consulta. Se uma consulta PolyBase estiver a ser executada lentamente, deve determinar se o pushdown da sua consulta PolyBase está a ocorrer.

Existem três cenários diferentes onde o pushdown pode ser observado no plano de execução:

  • Pressão de predicado de filtro
  • Junte-se ao pushdown
  • Redução de agregação

Observação

Há limitações sobre o que pode ser empurrado para fontes de dados externas com cálculos de pushdown do PolyBase:

Dois novos recursos do SQL Server 2019 (15.x) foram introduzidos para permitir que os administradores determinem se uma consulta PolyBase está sendo transferida para a fonte de dados externa:

Este artigo fornece detalhes sobre como usar cada um desses dois casos de uso, para cada um dos três cenários de pushdown.

Utilize TF6408

Por padrão, o plano de execução estimado não expõe o plano de consulta remota e você vê apenas o objeto do operador de consulta remota. Por exemplo, um plano de execução estimado do SQL Server Management Studio (SSMS):

Uma captura de ecrã de um plano de execução estimado no SSMS.

Ou, no Azure Data Studio:

Uma captura de tela de um plano de execução estimado do Azure Data Studio.

A partir do SQL Server 2019 (15.x), você pode habilitar um novo sinalizador de rastreamento 6408 globalmente usando DBCC TRACEON. Por exemplo:

DBCC TRACEON (6408, -1);  

Esse sinalizador de rastreamento só funciona com planos de execução estimados e não tem efeito sobre os planos de execução reais. Esse sinalizador de rastreamento expõe informações sobre o operador de Consulta Remota que mostra o que está acontecendo durante a fase de Consulta Remota.

Os planos de execução são lidos da direita para a esquerda, conforme indicado pela direção das setas. Se um operador está à direita de outro operador, diz-se que o "precede". Se um operador está à esquerda de outro operador, diz-se que está "depois" dele.

  • No SSMS, realce a consulta e selecione Exibir Plano de Execução Estimado na barra de ferramentas ou use Ctrl+L.
  • No Azure Data Studio, realce a consulta e selecione Explicar. Em seguida, considere os seguintes cenários para determinar se o pushdown ocorreu.

Cada um dos exemplos abaixo inclui a saída do SSMS e do Azure Data Studio.

Redução do predicado de filtro (visualizar com plano de execução)

Considere a seguinte consulta, que usa um predicado de filtro na cláusula WHERE:

SELECT *
FROM [Person].[BusinessEntity] AS be
WHERE be.BusinessEntityID = 17907;

Se estiver ocorrendo pushdown do predicado do filtro, o operador do filtro estará antes do operador externo. Quando o operador de filtro está antes do operador externo, a filtragem ocorreu antes de ser selecionado de volta da fonte de dados externa, indicando que o predicado do filtro foi empurrado para baixo.

Com a aplicação do predicado de filtro (vista com plano de execução)

Com o Sinalizador de Rastreamento 6408 habilitado, agora você vê informações adicionais na saída estimada do plano de execução. A saída varia entre o SSMS e o Azure Data Studio.

No SSMS, o plano de consulta remota é exibido no plano de execução estimado como Consulta 2 (sp_execute_memo_node_1) e corresponde ao operador de Consulta Remota na Consulta 1. Por exemplo:

Uma captura de tela de um plano de execução com aplicação de filtro a jusante do SSMS.

No Azure Data Studio, a execução da consulta remota é representada como um plano de consulta único. Por exemplo:

Uma captura de ecrã de um plano de execução que inclui o rebaixamento de predicado do filtro do Azure Data Studio.

Sem aplicação de predicado de filtro (vista com plano de execução)

Se a propagação do predicado do filtro não estiver ocorrendo, o filtro ficará posicionado após o operador externo.

O plano de execução estimado do SSMS:

Uma captura de tela de um plano de execução sem aplicação de filtro de predicado do SSMS.

O plano de execução estimado do Azure Data Studio:

Uma captura de tela de um plano de execução sem a aplicação do predicado de filtro do Azure Data Studio.

Propagação de JUNÇÃO

Considere a seguinte consulta que utiliza o operador JOIN para duas tabelas externas na mesma fonte de dados externa:

SELECT be.BusinessEntityID, bea.AddressID
FROM [Person].[BusinessEntity] AS be
INNER JOIN [Person].[BusinessEntityAddress] AS bea
ON be.BusinessEntityID = bea.BusinessEntityID;

Se o JOIN for empurrado para baixo para a fonte de dados externa, o operador Join estará antes do operador externo. Neste exemplo, [BusinessEntity] e [BusinessEntityAddress] são tabelas externas.

Com inserção para baixo de junção (visualizar com plano de execução)

O plano de execução estimado do SSMS:

Uma captura de ecrã de um plano de execução com pushdown de joins do SSMS.

O plano de execução estimado do Azure Data Studio:

Uma captura de tela de um plano de execução com pushdown de junção do Azure Data Studio.

Sem pushdown de junção (ver o plano de execução)

Se o JOIN não for empurrado para baixo para a fonte de dados externa, o operador Join estará atrás do operador externo. No SQL Server Management Studio (SSMS), o operador externo está no plano de consulta para o sp_execute_memo_node, que se encontra no operador de Consulta Remota da Consulta 1. No Azure Data Studio, o operador Join está após o(s) operador(es) externo(s).

O plano de execução estimado do SSMS:

Uma captura de tela de um plano de execução sem pushdown de junção do SSMS.

O plano de execução estimado do Azure Data Studio:

Uma captura de ecrã de um plano de execução sem pushdown de 'join' do Azure Data Studio.

Empurrar para baixo de agregação (vista com plano de execução)

Considere a seguinte consulta, que usa uma função agregada:

SELECT SUM([Quantity]) as Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];

Com agregação otimizada por pushdown (visualizar com plano de execução)

Se o pushdown da agregação estiver ocorrendo, o operador de agregação estará antes do operador externo. Quando o operador de agregação está antes do operador externo, a agregação ocorreu antes de ser selecionada de volta da fonte de dados externa, indicando que a agregação foi empurrada para baixo.

O plano de execução estimado do SSMS:

Uma captura de tela de um plano de execução com pushdown agregado do SSMS.

O plano de execução estimado do Azure Data Studio:

Uma captura de tela de um plano de execução com pushdown agregado do Azure Data Studio.

Sem pushdown para agregação (visualizar com plano de execução)

Se o pushdown da agregação não estiver ocorrendo, o operador de agregação estará após o operador externo.

O plano de execução estimado do SSMS:

Uma captura de tela de um plano de execução sem pushdown agregado do SSMS.

O plano de execução estimado do Azure Data Studio:

Uma captura de tela de um plano de execução sem pushdown agregado do Azure Data Studio.

Use o DMV

Com o SQL Server 2019 (15.x) e versões posteriores, a coluna read_command do DMV sys.dm_exec_external_work mostra a consulta enviada para a fonte de dados externa. Isso permite determinar se o pushdown está ocorrendo, mas não expõe o plano de execução. A visualização da consulta remota não requer TF6408.

Observação

Para o armazenamento do Hadoop e do Azure, o read_command sempre retorna NULL.

Você pode executar a seguinte consulta e usar o start_time/end_time e read_command para identificar a consulta que está sendo investigada:

SELECT execution_id, start_time, end_time, read_command
FROM sys.dm_exec_external_work
ORDER BY execution_id desc;

Observação

Uma limitação do método sys.dm_exec_external_work é que o campo read_command no Detran é limitado a 4000 caracteres. Se a consulta for suficientemente longa, o read_command pode ser truncado antes que você veja a função WHERE/JOIN/agregação no read_command.

Pushdown do predicado do filtro (visualizar com DMV)

Considere a consulta usada no exemplo de predicado de filtro anterior:

SELECT *
FROM [Person].[BusinessEntity] be
WHERE be.BusinessEntityID = 17907;

Com pushdown de filtro (ver com DMV)

Você pode saber se o pushdown do predicado do filtro está ocorrendo verificando o read_command no Detran. Você verá algo como este exemplo:

SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID], [T1_1].[rowguid] AS [rowguid], 
  [T1_1].[ModifiedDate] AS [ModifiedDate] FROM 
  (SELECT [T2_1].[BusinessEntityID] AS [BusinessEntityID], [T2_1].[rowguid] AS [rowguid], 
    [T2_1].[ModifiedDate] AS [ModifiedDate] 
FROM [AdventureWorks2022].[Person].[BusinessEntity] AS T2_1 
WHERE ([T2_1].[BusinessEntityID] = CAST ((17907) AS INT))) AS T1_1;

A cláusula WHERE está no comando enviado para a fonte de dados externa, o que significa que o predicado do filtro está sendo avaliado na fonte de dados externa. A filtragem no conjunto de dados ocorreu na fonte de dados externa e apenas o conjunto de dados filtrado foi recuperado pelo PolyBase.

Sem pushdown de filtro (ver com DMV)

Se o pushdown não estiver ocorrendo, você verá algo como:

SELECT "BusinessEntityID","rowguid","ModifiedDate" FROM "AdventureWorks2022"."Person"."BusinessEntity"

Não há nenhuma cláusula WHERE no comando enviado para a fonte de dados externa, portanto, o predicado do filtro não é empurrado para baixo. A filtragem em todo o conjunto de dados ocorreu no lado do SQL Server, depois que o conjunto de dados foi recuperado pelo PolyBase.

Pushdown de JOIN (ver com Vista de Gestão Dinâmica)

Considere a consulta usada no exemplo JOIN anterior:

SELECT be.BusinessEntityID, bea.AddressID
FROM [Person].[BusinessEntity] be
INNER JOIN [Person].[BusinessEntityAddress] bea ON be.BusinessEntityID = bea.BusinessEntityID;

Com pushdown de junção (visualizar com DMV)

Se o JOIN for empurrado para baixo para a fonte de dados externa, você verá algo como:

SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID], [T1_1].[AddressID] AS [AddressID] 
FROM (SELECT [T2_2].[BusinessEntityID] AS [BusinessEntityID], [T2_1].[AddressID] AS [AddressID] 
FROM [AdventureWorks2022].[Person].[BusinessEntityAddress] AS T2_1 
INNER JOIN  [AdventureWorks2022].[Person].[BusinessEntity] AS T2_2  
ON ([T2_1].[BusinessEntityID] = [T2_2].[BusinessEntityID])) AS T1_1;

A cláusula JOIN está no comando enviado para a fonte de dados externa, portanto, a JOIN é empurrada para baixo. A junção no conjunto de dados ocorreu na fonte de dados externa e somente o conjunto de dados que corresponde à condição de junção foi recuperado pelo PolyBase.

Sem pushdown de junção (ver com DMV)

Se o pushdown da junção não estiver ocorrendo, você verá que há duas consultas diferentes executadas na fonte de dados externa:

SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID], [T1_1].[AddressID] AS [AddressID] 
FROM [AdventureWorks2022].[Person].[BusinessEntityAddress] AS T1_1;

SELECT [T1_1].[BusinessEntityID] AS [BusinessEntityID] FROM [AdventureWorks2022].[Person].[BusinessEntity] AS T1_1;

A junção dos dois conjuntos de dados ocorreu no lado do SQL Server, depois que ambos os conjuntos de dados são recuperados pelo PolyBase.

Pushdown de agregação (ver com DMV)

Considere a seguinte consulta, que usa uma função agregada:

SELECT SUM([Quantity]) as Quant
FROM [AdventureWorks2022].[Production].[ProductInventory];

Com aplicação de pushdown na agregação (ver com visões de gerenciamento dinâmico - DMV)

Se estiver ocorrendo pushdown da agregação, você verá a função de agregação no read_command. Por exemplo:

SELECT [T1_1].[col] AS [col] FROM (SELECT SUM([T2_1].[Quantity]) AS [col] 
FROM [AdventureWorks2022].[Production].[ProductInventory] AS T2_1) AS T1_1

A função de agregação está no comando enviado para a fonte de dados externa, de modo que a agregação é empurrada para baixo. A agregação ocorreu na fonte de dados externa e apenas o conjunto de dados agregado foi recuperado pelo PolyBase.

Sem pushdown de agregação (ver com DGV)

Se o pushdown da agregação não estiver ocorrendo, você não verá a função de agregação no read_command. Por exemplo:

SELECT "Quantity" FROM "AdventureWorks2022"."Production"."ProductInventory"

A agregação foi realizada no SQL Server, depois que o conjunto de dados não agregados foi recuperado pelo PolyBase.

Próximos passos