sp_cursoropen dan paralelisme

15

Saya mengalami masalah kinerja dengan kueri yang sepertinya tidak bisa saya pahami.

Saya menarik kueri dari definisi kursor.

Permintaan ini membutuhkan waktu beberapa detik untuk dieksekusi

SELECT A.JOBTYPE
FROM PRODROUTEJOB A
WHERE ((A.DATAAREAID=N'IW')
AND ((A.CALCTIMEHOURS<>0)
AND (A.JOBTYPE<>3)))
AND EXISTS (SELECT 'X'
FROM PRODROUTE B
WHERE ((B.DATAAREAID=N'IW')
AND (((((B.PRODID=A.PRODID)
AND ((B.PROPERTYID=N'PR1526157') OR (B.PRODID=N'PR1526157')))
AND (B.OPRNUM=A.OPRNUM))
AND (B.OPRPRIORITY=A.OPRPRIORITY))
AND (B.OPRID=N'GRIJZEN')))
AND NOT EXISTS (SELECT 'X'
FROM ADUSHOPFLOORROUTE C
WHERE ((C.DATAAREAID=N'IW')
AND ((((((C.WRKCTRID=A.WRKCTRID)
AND (C.PRODID=B.PRODID))
AND (C.OPRID=B.OPRID))
AND (C.JOBTYPE=A.JOBTYPE))
AND (C.FROMDATE>{TS '1900-01-01 00:00:00.000'}))
AND ((C.TODATE={TS '1900-01-01 00:00:00.000'}))))))
GROUP BY A.JOBTYPE
ORDER BY A.JOBTYPE

Rencana eksekusi yang sebenarnya terlihat seperti ini.

masukkan deskripsi gambar di sini

Memperhatikan pengaturan lebar server diatur ke MaxDOP 1, saya mencoba bermain-main dengan pengaturan maxdop.

Menambah OPTION (MAXDOP 0)kueri, atau mengubah pengaturan server menghasilkan kinerja yang jauh lebih baik dan rencana kueri ini.

masukkan deskripsi gambar di sini

Namun, aplikasi yang dipermasalahkan (Dynamics AX) tidak menjalankan kueri seperti ini, ia menggunakan kursor.

Kode aktual yang ditangkap adalah ini.

declare @p1 int
set @p1=189527589
declare @p3 int
set @p3=16
declare @p4 int
set @p4=1
declare @p5 int
set @p5=2
exec sp_cursoropen @p1 output,N'SELECT A.JOBTYPE FROM PRODROUTEJOB A WHERE ((A.DATAAREAID=N''IW'') AND ((A.CALCTIMEHOURS<>0) AND (A.JOBTYPE<>3))) AND EXISTS (SELECT ''X'' FROM PRODROUTE B WHERE ((B.DATAAREAID=N''IW'') AND (((((B.PRODID=A.PRODID) AND ((B.PROPERTYID=N''PR1526157'') OR (B.PRODID=N''PR1526157''))) AND (B.OPRNUM=A.OPRNUM)) AND (B.OPRPRIORITY=A.OPRPRIORITY)) AND (B.OPRID=N''GRIJZEN''))) AND NOT EXISTS (SELECT ''X'' FROM ADUSHOPFLOORROUTE C WHERE ((C.DATAAREAID=N''IW'') AND ((((((C.WRKCTRID=A.WRKCTRID) AND (C.PRODID=B.PRODID)) AND (C.OPRID=B.OPRID)) AND (C.JOBTYPE=A.JOBTYPE)) AND (C.FROMDATE>{TS ''1900-01-01 00:00:00.000''})) AND ((C.TODATE={TS ''1900-01-01 00:00:00.000''})))))) GROUP BY A.JOBTYPE ORDER BY A.JOBTYPE ',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5

menghasilkan rencana eksekusi ini (dan sayangnya waktu eksekusi beberapa detik yang sama).

masukkan deskripsi gambar di sini

Saya sudah mencoba beberapa hal seperti menjatuhkan paket yang di-cache, menambahkan opsi dalam kueri di dalam definisi kursor, ... Tapi tak satu pun dari mereka tampaknya membuat saya rencana paralel.

Saya juga telah mencari di Google untuk mencari batasan paralelisme dari kursor tetapi sepertinya tidak dapat menemukan batasan.

Apakah saya melewatkan sesuatu yang jelas di sini?

Membangun SQL yang sebenarnya SQL Server 2008 (SP1) - 10.0.2573.0 (X64)yang saya sadari tidak didukung, tetapi saya tidak dapat memutakhirkan hal ini sesuai keinginan saya. Saya perlu mentransfer database ke server lain dan itu berarti menarik cadangan yang tidak terkompresi cukup besar melalui WAN yang lambat.

Bendera jejak 4199 tidak membuat perbedaan, dan begitu pula OPTION (RECOMPILE).

Properti kursor adalah:

API | Fast_Forward | Read Only | Global (0)
Tom V - Tim Monica
sumber

Jawaban:

20

FAST_FORWARDkursor tidak mendukung paralelisme (meskipun server yang menghasilkan rencana harus 2012 atau di atas untuk mendapatkan NonParallelPlanReasonsebagai bagian dari XML showplan).

Ketika Anda menentukan FAST_FORWARD, pengoptimal memilih antara STATICdan DYNAMICuntuk Anda.

Rencana pelaksanaan yang disediakan menunjukkan pengoptimal memilih rencana statis. Karena kueri berisi agregasi, saya ragu rencana kursor dinamis bahkan mungkin di sini. Namun demikian, meminta FAST_FORWARDjenis kursor mencegah rencana paralel.

Anda harus mengubah jenis kursor secara eksplisit menjadi salah satu STATICatau KEYSET, misalnya. Kedua tipe kursor ini dapat menggunakan paralelisme.

Karena itu, karena ini adalah kursor API, mengubah jenis kursor kemungkinan akan membutuhkan perubahan aplikasi. Secara alami, Anda perlu melakukan benchmark kinerja untuk memeriksa bahwa mengubah tipe kursor benar-benar merupakan pilihan terbaik untuk Anda.

Paul White Reinstate Monica
sumber