Como saber se ocorreu o pushdown externo

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

Minha consulta está se beneficiando do pushdown externo?

A computação de aplicação aprimora 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 levadas para o SQL Server. Especialmente em casos de pushdown de filtragem e junção, a carga de trabalho na instância do SQL Server pode ser muito reduzida.

A computação de pushdown do PolyBase pode aprimorar significativamente o desempenho da consulta. Se uma consulta do PolyBase estiver com a execução lenta, determine se o pushdown da consulta está ocorrendo.

Há três cenários diferentes em que o pushdown pode ser observado no plano de execução:

  • Pushdown de predicado de filtro
  • Pushdown de junção
  • Pushdown de agregação

Observação

Há limitações quanto ao que pode sofrer pushdown para fontes de dados externas com as Computações de pushdown do PolyBase:

Dois novos recursos do SQL Server 2019 (15.x) foram introduzidos para permitir que os administradores determinem se uma consulta no PolyBase está sendo enviada 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.

Usar 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 SSMS (SQL Server Management Studio):

A screenshot of an estimated execution plan in SSMS.

Ou, no Azure Data Studio:

A screenshot of an estimated execution plan from 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 funciona apenas com planos de execução estimados e não tem nenhum efeito sobre planos de execução reais. Este sinalizador de rastreamento expõe informações sobre o operador 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, dizemos que está "antes" dele. Se um operador está à esquerda de outro, dizemos 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 cenários a seguir para determinar se o pushdown ocorreu.

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

Pushdown do predicado de filtro (exibição com o 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 o pushdown do predicado de filtro estiver ocorrendo, o operador de filtro estará antes do operador externo. Quando o operador de filtro está antes do operador externo, a filtragem ocorreu antes de ser selecionado novamente na fonte de dados externa, indicando que o predicado de filtro sofreu pushdown.

Com pushdown do predicado de filtro (exibição com o plano de execução)

Com o Sinalizador de Rastreamento 6408 habilitado, você verá informações adicionais na saída do plano de execução estimado. 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:

A screenshot of an execution plan with filter predicate pushdown from SSMS.

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

A screenshot of an execution plan with filter predicate pushdown from Azure Data Studio.

Sem pushdown do predicado de filtro (exibição com o plano de execução)

Se o pushdown do predicado de filtro não estiver ocorrendo, o filtro estará depois do operador externo.

O plano de execução estimado no SSMS:

A screenshot of an execution plan without filter predicate pushdown from SSMS.

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

A screenshot of an execution plan without filter predicate pushdown from Azure Data Studio.

Pushdown de JOIN

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 JOIN sofrer pushdown para a fonte de dados externa, o operador de junção estará antes do operador externo. Neste exemplo, tanto [BusinessEntity] como [BusinessEntityAddress] são tabelas externas.

Com pushdown de junção (exibição com o plano de execução)

O plano de execução estimado no SSMS:

A screenshot of an execution plan with join pushdown from SSMS.

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

A screenshot of an execution plan with join pushdown from Azure Data Studio.

Sem pushdown de junção (exibição com o plano de execução)

Se JOIN não sofrer pushdown para a fonte de dados externa, o operador de junção estará depois do operador externo. No SSMS, o operador externo está no plano de consulta para sp_execute_memo_node, que está no operador de Consulta Remota na Consulta 1. No Azure Data Studio, o operador de junção está depois dos operadores externos.

O plano de execução estimado no SSMS:

A screenshot of an execution plan without join pushdown from SSMS.

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

A screenshot of an execution plan without join pushdown from Azure Data Studio.

Pushdown de agregação (exibição com o plano de execução)

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

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

Com pushdown de agregação (exibição com o plano de execução)

Se o pushdown de 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 novamente na fonte de dados externa, indicando que a agregação sofreu pushdown.

O plano de execução estimado no SSMS:

A screenshot of an execution plan with aggregate pushdown from SSMS.

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

A screenshot of an execution plan with aggregate pushdown from Azure Data Studio.

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

Se o pushdown de agregação não estiver ocorrendo, o operador de agregação estará depois do operador externo.

O plano de execução estimado no SSMS:

A screenshot of an execution plan without aggregate pushdown from SSMS.

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

A screenshot of an execution plan without aggregate pushdown from Azure Data Studio.

Usar DMV

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

Observação

Para o Hadoop e o armazenamento do Azure, 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 na DMV é limitado a quatro mil caracteres. Se a consulta for suficientemente longa, o read_command poderá ser truncado antes que você veja a função de agregação/WHERE/JOIN no read_command.

Pushdown do predicado de filtro (exibição com a DMV)

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

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

Com o pushdown de filtro (exibição com a DMV)

Se o pushdown do predicado de filtro estiver ocorrendo, você saberá verificando o read_command na DMV. Você verá algo semelhante a 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 de filtro está sendo avaliado na fonte de dados externa. A filtragem no conjuntos de dados ocorreu na fonte de dados externa, e apenas o conjuntos de dados filtrado foi recuperado pelo PolyBase.

Sem o pushdown de filtro (exibição com a 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 de filtro não sofreu pushdown. A filtragem no conjuntos de dados inteiro ocorreu no lado do SQL Server, após o conjuntos de dados ter sido recuperado pelo PolyBase.

Pushdown de JOIN (exibição com a DMV)

Considere a consulta usada no exemplo anterior com JOIN:

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

Com pushdown de junção (exibição com a DMV)

Se JOIN tiver sofrido pushdown 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 à fonte de dados externa, portanto, JOIN sofreu pushdown. A junção no conjunto de dados ocorreu na fonte de dados externa e apenas o conjunto de dados que corresponde à condição de junção foi recuperado pelo PolyBase.

Sem pushdown de junção (exibição com a 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, após ambos os conjuntos de dados serem recuperados pelo PolyBase.

Pushdown de agregação (exibição com a DMV)

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

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

Com pushdown de agregação (exibição com a DMV)

Se o pushdown de agregação estiver ocorrendo, 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 à fonte de dados externa, portanto, a agregação sofreu pushdown. A agregação ocorreu na fonte de dados externa e somente o conjunto de dados agregado foi recuperado pelo PolyBase.

Sem pushdown de agregação (exibição com a DMV)

Se o pushdown de 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, após o conjunto de dados não agregado ter sido recuperado pelo PolyBase.

Próximas etapas