Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Lihat Perkiraan Rencana Eksekusi dengan bendera pelacakan 6408
- Menampilkan
read_commanddalam tampilan manajemen dinamis sys.dm_exec_external_work
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:
Beberapa fungsi T-SQL dapat mencegah pushdown. Untuk informasi selengkapnya, lihat Fitur dan batasan PolyBase.
Untuk daftar fungsi T-SQL yang dapat didorong ke bawah, lihat 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):
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:
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:
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:
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:
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:
Tanpa pushdown agregasi (dengan melihat rencana eksekusi)
Jika agregasi tidak didorong ke bawah, operator agregasi mengejar operator eksternal.
Perkiraan rencana eksekusi 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.