Cara mengetahui apakah pushdown eksternal terjadi

Artikel ini menjelaskan cara menentukan apakah kueri PolyBase mendapat manfaat dari pushdown ke sumber data eksternal. Untuk informasi lebih lanjut tentang pushdown eksternal, lihat Perhitungan pushdown di PolyBase.

Apakah kueri saya mendapat keuntungan dari pushdown eksternal?

Komputasi pushdown meningkatkan performansi kueri pada sumber data eksternal. Tugas komputasi tertentu didelegasikan ke sumber data eksternal alih-alih dibawa ke instans SQL Server. Terutama dalam kasus pemfilteran dan pendorongan gabungan, beban kerja pada instans SQL Server dapat sangat berkurang.

Komputasi pushdown PolyBase dapat secara signifikan meningkatkan performa kueri. Jika kueri PolyBase berjalan lambat, memeriksa apakah fungsi "pushdown" dari kueri PolyBase Anda terjadi.

Anda dapat mengamati pushdown dalam rencana pelaksanaan dalam tiga skenario berbeda:

  • Pendorongan predikat filter
  • Bergabung dengan pushdown
  • Pendorongan agregasi

Dua fitur baru SQL Server 2019 (15.x) memungkinkan administrator untuk menentukan apakah kueri PolyBase sedang didorong ke sumber data eksternal:

Artikel ini menyediakan detail tentang cara menggunakan masing-masing dari dua kasus penggunaan ini, untuk masing-masing dari tiga skenario pushdown.

Keterbatasan

Batasan berikut memengaruhi apa yang dapat Anda eksekusi ke sumber data eksternal dengan komputasi pushdown di PolyBase:

Gunakan bendera pelacakan 6408

Secara default, perkiraan rencana eksekusi tidak mengekspos rencana kueri jarak jauh. Anda hanya melihat sebuah objek operator kueri jarak jauh. Misalnya, perkiraan rencana eksekusi dari SQL Server Management Studio (SSMS):

Cuplikan layar perkiraan rencana eksekusi di SSMS.

Mulai SQL Server 2019 (15.x), Anda dapat mengaktifkan bendera pelacakan baru 6408 secara global menggunakan DBCC TRACEON. Misalnya:

DBCC TRACEON (6408, -1);

Bendera pelacakan ini hanya berfungsi dengan perkiraan rencana eksekusi dan tidak berpengaruh pada rencana eksekusi aktual. Bendera pelacakan ini memaparkan informasi tentang operator Kueri Jarak Jauh yang memperlihatkan apa yang terjadi selama fase Kueri Jarak Jauh.

Gambaran umum rencana eksekusi dibaca dari kanan ke kiri, seperti yang ditunjukkan oleh arah panah. Jika operator berada di sebelah kanan operator lain, itu mendahuluinya. Jika operator berada di sebelah kiri operator lain, operator tersebut berada setelahnya.

  • Di SSMS, sorot kueri dan pilih Tampilkan Perkiraan Rencana Eksekusi dari toolbar atau gunakan Ctrl+L.

Masing-masing contoh berikut mencakup output dari SSMS.

Penurunan predikat filter (tampilan dengan rencana eksekusi)

Pertimbangkan kueri berikut, yang menggunakan predikat filter dalam klausa WHERE:

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

Jika predikat filter didorong ke bawah, operator filter muncul sebelum operator eksternal dalam rencana eksekusi. Ketika operator filter sebelum operator eksternal, pemfilteran terjadi sebelum mesin kueri mengambil data dari sumber data eksternal, yang berarti predikat filter didorong ke bawah.

Dengan penerapan predikat filter secara langsung (lihat dengan rencana eksekusi)

Saat Mengaktifkan bendera pelacakan 6408, Anda akan melihat informasi tambahan dalam perkiraan output rencana eksekusi.

Di SSMS, rencana kueri jarak jauh muncul sebagai Kueri 2 (sp_execute_memo_node_1) dalam perkiraan rencana eksekusi. Ini sesuai dengan operator Kueri Jarak Jauh di Kueri 1. Misalnya:

Cuplikan layar rencana eksekusi dengan filter predikat pushdown dari SSMS.

Tanpa pushdown predikat filter (lihat rencana eksekusi)

Jika predikat filter tidak didorong ke bawah, operator filter muncul setelah operator eksternal.

Perkiraan rencana eksekusi dari SSMS:

Cuplikan layar rencana eksekusi tanpa filter predikat pushdown dari SSMS.

Pembebanan JOIN

Pertimbangkan kueri berikut yang menggunakan JOIN operator untuk dua tabel eksternal pada sumber data eksternal yang sama:

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

Jika mesin kueri mendorong operasi JOIN ke sumber data eksternal, operator Gabung muncul sebelum operator eksternal. Dalam contoh ini, [BusinessEntity] dan [BusinessEntityAddress] adalah tabel eksternal.

Dengan pushdown gabungan (tampilan dengan rencana eksekusi)

Perkiraan rencana eksekusi dari SSMS:

Cuplikan layar dari rencana eksekusi dengan join pushdown di SSMS.

Tanpa penurunan dari penggabungan (tampilan dengan rencana eksekusi)

Jika mesin kueri tidak mendorong operasi JOIN ke sumber data eksternal, operator Gabung muncul setelah operator eksternal. Di SSMS, rencana kueri untuk sp_execute_memo_node menyertakan operator eksternal. Operator ini adalah bagian dari operator Kueri Jarak Jauh di Kueri 1.

Perkiraan rencana eksekusi dari SSMS:

Cuplikan layar rencana eksekusi tanpa join pushdown dari SSMS.

Pushdown agregasi (tampilan dengan rencana eksekusi)

Pertimbangkan kueri berikut, yang menggunakan fungsi agregat:

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

Dengan penerapan pushdown pada agregasi (lihat dengan rencana eksekusi)

Jika agregasi didorong ke bawah, operator agregasi muncul sebelum operator eksternal. Saat operator agregasi sebelum operator eksternal, kueri melakukan agregasi sebelum memilih data dari sumber data eksternal, yang berarti agregasi didorong ke bawah.

Perkiraan rencana eksekusi dari SSMS:

Cuplikan layar rencana eksekusi dengan pushdown agregat dari SSMS.

Tanpa pushdown agregasi (dengan melihat rencana eksekusi)

Jika agregasi tidak didorong ke bawah, operator agregasi mengejar operator eksternal.

Perkiraan rencana eksekusi dari SSMS:

Cuplikan layar rencana eksekusi tanpa pendorongan agregat dari SSMS.

Menggunakan DMV

Di SQL Server 2019 (15.x) dan versi yang lebih baru, read_command kolom sys.dm_exec_external_work DMV memperlihatkan kueri yang Anda kirim ke sumber data eksternal. Anda dapat mengecek apakah pushdown sedang terjadi, tetapi tidak mengekspos rencana eksekusi. Anda tidak memerlukan bendera pelacakan 6408 untuk menampilkan kueri jarak jauh.

Nota

Untuk penyimpanan Hadoop dan Azure, read_command selalu mengembalikan NULL.

Jalankan kueri berikut dan gunakan start_time/end_time nilai dan read_command untuk mengidentifikasi kueri yang Sedang Anda selidiki:

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

Nota

Salah satu batasan metode sys.dm_exec_external_work adalah bahwa read_command bidang dalam DMV dibatasi hingga 4.000 karakter. Jika kueri cukup panjang, read_command mungkin terpotong sebelum Anda melihat WHERE, JOIN, atau fungsi agregasi di read_command.

Pemrosesan predikat filter lebih awal (tampilan dengan DMV)

Pertimbangkan kueri yang digunakan dalam contoh predikat filter sebelumnya:

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

Dengan pushdown filter (tampilan menggunakan DMV)

Anda dapat memeriksa read_command di DMV untuk melihat apakah pushdown predikat filter terjadi. Anda melihat contoh serupa dengan kueri berikut:

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;

Perintah yang dikirim ke sumber data eksternal menyertakan WHERE klausa, yang berarti predikat filter dievaluasi di sumber data eksternal. Pemfilteran pada himpunan data terjadi di sumber data eksternal, dan PolyBase hanya mengambil himpunan data yang difilter.

Tanpa pushdown filter (tampilan dengan DMV)

Jika pushdown tidak terjadi, Anda akan melihat sesuatu seperti:

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

Perintah yang dikirim ke sumber data eksternal tidak menyertakan WHERE klausa, sehingga predikat filter tidak didorong ke bawah. Pemfilteran pada seluruh himpunan data terjadi di sisi SQL Server, setelah PolyBase mengambil himpunan data.

Penurunan JOIN (melihat dengan DMV)

Pertimbangkan kueri yang digunakan dalam contoh sebelumnya JOIN :

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

Dengan pushdown dari join (tampilan menggunakan DMV)

Jika Anda memasukkan JOIN ke bawah ke sumber data eksternal, Anda akan melihat sesuatu seperti:

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;

Perintah yang Anda kirim ke sumber data eksternal menyertakan JOIN klausa, sehingga JOIN didorong ke bawah. Sumber data eksternal menangani gabungan pada himpunan data, dan PolyBase hanya mengambil himpunan data yang cocok dengan kondisi gabungan.

Tanpa pemindahan gabungan (tampilan dengan DMV)

Jika penurunan penggabungan tidak terjadi, Anda akan melihat dua kueri berbeda yang dilakukan pada sumber data eksternal.

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;

Sisi SQL Server bertanggung jawab dalam penggabungan dua himpunan data setelah PolyBase mengambil kedua dataset tersebut.

Pushdown agregasi (tampilan dengan DMV)

Pertimbangkan kueri berikut, yang menggunakan fungsi agregat:

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

Dengan pengoptimalan pushdown pada agregasi (tampilan dengan DMV)

Jika pushdown agregasi terjadi, Anda dapat melihat fungsi agregasi di read_command. Misalnya:

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

Fungsi agregasi ada dalam perintah yang dikirim ke sumber data eksternal, sehingga agregasi didorong ke bawah. Agregasi terjadi di sumber data eksternal, dan PolyBase hanya mengambil himpunan data agregat.

Tanpa pushdown agregasi (lihat melalui DMV)

Jika agregasi tidak melakukan pushdown, Anda tidak akan melihat fungsi agregasi di read_command. Misalnya:

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

PolyBase mengambil himpunan data yang tidak diagregasi, dan SQL Server melakukan agregasi.