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.
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.
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).
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)
sumber