Cómo saber si se ha producido una delegación externa

En este artículo se detalla cómo se puede determinar si una consulta de PolyBase se beneficia de la delegación al origen de datos externo. Para obtener más información sobre la delegación externa, vea Cálculos de delegación en PolyBase.

¿Se beneficia mi consulta de la delegación externa?

El cálculo de aplicación mejora el rendimiento de las consultas en los orígenes de datos externos. Ciertas tareas de cálculo se delegan en el origen de datos externo, en lugar de llevarse a SQL Server. Especialmente en los casos de delegación del filtrado y de la combinación, la carga de trabajo en la instancia de SQL Server se puede reducir considerablemente.

El cálculo de delegación de PolyBase puede mejorar en gran medida el rendimiento de la consulta. Si una consulta de PolyBase se ejecuta con lentitud, debe determinar si se está produciendo la delegación de la consulta.

Hay tres escenarios diferentes en los que se puede observar una delegación en el plan de ejecución:

  • Delegación del predicado de filtro
  • Delegación de la combinación
  • Delegación de la agregación

Nota:

Existen limitaciones en lo que respecta a lo que se puede delegar en orígenes de datos externos con cálculos de delegación de PolyBase:

Se han introducido dos nuevas características de SQL Server 2019 (15.x) para permitir a los administradores determinar si una consulta de PolyBase se está delegando en el origen de datos externo:

En este artículo se proporciona información sobre cómo se emplean estos dos casos de uso para cada uno de los tres escenarios de delegación.

Uso de TF6408

De manera predeterminada, el plan de ejecución estimado no expone el plan de consulta remota y solo se ve el objeto del operador de consulta remota. Por ejemplo, este es un plan de ejecución estimado de SQL Server Management Studio (SSMS):

A screenshot of an estimated execution plan in SSMS.

O en Azure Data Studio:

A screenshot of an estimated execution plan from Azure Data Studio.

A partir de SQL Server 2019 (15.x), puede habilitar una nueva marca de seguimiento 6408 globalmente mediante DBCC TRACEON. Por ejemplo:

DBCC TRACEON (6408, -1);  

Esta marca de seguimiento solo funciona con planes de ejecución estimados y no tiene ningún efecto en los planes de ejecución reales. Esta marca de seguimiento expone información sobre el operador Remote Query que muestra lo que sucede durante la fase de consulta remota.

Los planes de ejecución se leen de derecha a izquierda, como indica la dirección de las flechas. Si un operador está a la derecha de otro operador, se dice que está "antes". Si un operador está a la izquierda de otro operador, se dice que está "después".

  • En SSMS, resalte la consulta y seleccione Mostrar plan de ejecución estimado en la barra de herramientas o use Ctrl+L.
  • En Azure Data Studio, resalte la consulta y seleccione Explicar. Tenga en cuenta los escenarios siguientes para determinar si se ha producido la delegación.

Cada uno de los ejemplos siguientes incluye la salida de SSMS y Azure Data Studio.

Delegación del predicado de filtro (vista con plan de ejecución)

Considere la consulta siguiente, en la que se usa un predicado de filtro en la cláusula WHERE:

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

Si se produce la delegación del predicado de filtro, el operador de filtro está antes del operador externo. Cuando el operador de filtro aparece delante del operador externo, el filtrado se produjo antes de que se seleccionara desde el origen de datos externo, lo que indica que el predicado de filtro se ha delegado.

Con delegación del predicado de filtro (vista con plan de ejecución)

Con la marca de seguimiento 6408 habilitada, ahora verá información adicional en la salida del plan de ejecución estimado. La salida varía entre SSMS y Azure Data Studio.

En SSMS, el plan de consulta remota se muestra en el plan de ejecución estimado como Query 2 (sp_execute_memo_node_1) y se corresponde con el operador Remote Query en Query 1. Por ejemplo:

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

En Azure Data Studio, la ejecución de consultas remotas se representa como un plan de consulta único. Por ejemplo:

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

Sin delegación del predicado de filtro (vista con plan de ejecución)

Si no se produce la delegación del predicado de filtro, el filtro estará después del operador externo.

Plan de ejecución estimado en SSMS:

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

Plan de ejecución estimado en Azure Data Studio:

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

Delegación de JOIN

Observe la siguiente consulta, que utiliza el operador de combinación para dos tablas externas en el mismo origen de datos externo:

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

Si JOIN se delega en el origen de datos externo, el operador JOIN estará antes del operador externo. En este ejemplo, [BusinessEntity] y [BusinessEntityAddress] son tablas externas.

Con delegación de la combinación (vista con plan de ejecución)

Plan de ejecución estimado en SSMS:

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

Plan de ejecución estimado en Azure Data Studio:

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

Sin delegación de la combinación (vista con plan de ejecución)

Si JOIN no se delega en el origen de datos externo, el operador JOIN estará después del operador externo. En SSMS, el operador externo se encuentra en el plan de consulta para sp_execute_memo_node, que está en el operador Remote Query en Query 1. En Azure Data Studio, el operador JOIN está después de los operadores externos.

Plan de ejecución estimado en SSMS:

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

Plan de ejecución estimado en Azure Data Studio:

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

Delegación de la agregación (vista con plan de ejecución)

Considere la siguiente consulta, que usa una función de agregado:

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

Con delegación de la agregación (vista con plan de ejecución)

Si se produce la delegación de la agregación, el operador de agregación está antes del operador externo. Cuando el operador de agregación aparece delante del operador externo, la agregación se produjo antes de que se seleccionara desde el origen de datos externo, lo que indica que la agregación de filtro se ha delegado.

Plan de ejecución estimado en SSMS:

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

Plan de ejecución estimado en Azure Data Studio:

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

Sin delegación de la agregación (vista con plan de ejecución)

Si no se produce la delegación de la agregación, el operador de agregación estará después del operador externo.

Plan de ejecución estimado en SSMS:

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

Plan de ejecución estimado en Azure Data Studio:

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

Uso de DMV

En SQL Server 2019 (15.x) y versiones posteriores, la columna read_command de la DMV sys.dm_exec_external_work muestra la consulta que se envía al origen de datos externo. Esto le permite determinar si se está produciendo la delegación, pero no expone el plan de ejecución. Para ver la consulta remota, no se requiere TF6408.

Nota:

Para Hadoop y Azure Storage, read_command siempre devuelve NULL.

Puede ejecutar la consulta siguiente y usar start_time/end_time y read_command para identificar la consulta que se está investigando:

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

Nota:

Una limitación del método sys.dm_exec_external_work es que el campo read_command de la DMV no acepta más de 4000 caracteres. Si la consulta es lo bastante larga, read_command podría truncarse antes de que se vea la función de agregación, WHERE o JOIN en read_command.

Delegación del predicado de filtro (vista con DMV)

Considere la consulta que se usó en el anterior ejemplo de predicado de filtro:

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

Con delegación del filtro (vista con DMV)

Para detectar si se produce la delegación del predicado de filtro, consulte read_command en la DMV. Verá algo parecido al ejemplo siguiente:

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;

La cláusula WHERE está en el comando que se envía al origen de datos externo, lo que significa que el predicado de filtro se está evaluando en el origen de datos externo. El filtrado del conjunto de datos se produjo en el origen de datos externo y PolyBase solo recuperó el conjunto de datos filtrado.

Sin delegación del filtro (vista con DMV)

Si no se produce la delegación, verá algo parecido a lo siguiente:

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

No hay ninguna cláusula WHERE en el comando que se envía al origen de datos externo, por lo que el predicado de filtro no se delega. El filtrado de todo el conjunto de datos se produjo en SQL Server, después de que PolyBase recuperara el conjunto de datos.

Delegación de JOIN (vista con DMV)

Considere la consulta que se usó en el anterior ejemplo de JOIN:

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

Con delegación de la combinación (vista con DMV)

Si JOIN se delega en el origen de datos externo, verá algo parecido a lo siguiente:

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;

La cláusula JOIN está en el comando que se envía al origen de datos externo, por lo que JOIN se delega. La combinación del conjunto de datos se produjo en el origen de datos externo y PolyBase solo recuperó el conjunto de datos que coincide con la condición de combinación.

Sin delegación de la combinación (vista con DMV)

Si no se produce la delegación de la combinación, verá que hay dos consultas diferentes que se ejecutan en el origen de datos externo:

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;

La combinación de los dos conjuntos de datos se produjo en SQL Server, después de que PolyBase recuperara ambos conjuntos de datos.

Delegación de la agregación (vista con DMV)

Considere la siguiente consulta, que usa una función de agregado:

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

Con delegación de la agregación (vista con DMV)

Si se produce la delegación de la agregación, verá la función de agregación en read_command. Por ejemplo:

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

La función de agregación está en el comando que se envía al origen de datos externo, por lo que la agregación se delega. La agregación se produjo en el origen de datos externo y PolyBase solo recuperó el conjunto de datos agregado.

Sin delegación de la agregación (vista con DMV)

Si no se produce la delegación de la agregación, no verá la función de agregación en read_command. Por ejemplo:

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

La agregación se realizó en SQL Server, después de que PolyBase recuperara el conjunto de datos sin agregar.

Pasos siguientes