मैं एक क्वेरी के साथ एक प्रदर्शन समस्या में भाग रहा हूं जिसे मैं अपना सिर प्राप्त करने के लिए नहीं देख सकता हूं।
मैंने क्वेरी को कर्सर परिभाषा से बाहर निकाला।
इस क्वेरी को निष्पादित होने में कुछ सेकंड लगते हैं
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
वास्तविक निष्पादन योजना इस तरह दिखती है।
सर्वर वाइड सेटिंग को नोटिफाई करना MaxDOP 1 पर सेट किया गया था। मैंने मैक्सडॉप सेटिंग्स के साथ खेलने की कोशिश की।
OPTION (MAXDOP 0)
क्वेरी में जोड़ना , या सर्वर सेटिंग्स को बदलना बेहतर प्रदर्शन और इस क्वेरी योजना के परिणामस्वरूप होता है।
हालाँकि, प्रश्न में एप्लिकेशन (डायनेमिक्स AX) इस तरह के प्रश्नों को निष्पादित नहीं करता है, यह कर्सर का उपयोग करता है।
कैप्चर किया गया वास्तविक कोड यही है।
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
इस निष्पादन योजना के परिणामस्वरूप (और दुर्भाग्य से एक ही कई-दूसरे निष्पादन समय)।
मैंने कई चीजों की कोशिश की है जैसे कैश्ड प्लान को छोड़ना, कर्सर की परिभाषा के अंदर क्वेरी में विकल्प जोड़ना, ... लेकिन उनमें से कोई भी मुझे एक समानांतर योजना नहीं लगती है।
मैंने काफी हद तक शापर्स की समानतावाद सीमाओं की तलाश में Google को खोजा है, लेकिन कोई सीमाएं नहीं मिल रही हैं।
क्या में यहां कुछ भूल रहा हूँ?
वास्तविक SQL बिल्ड वह है SQL Server 2008 (SP1) - 10.0.2573.0 (X64)
जो मुझे पता है कि असमर्थित है, लेकिन मैं इस उदाहरण को अपग्रेड नहीं कर सकता क्योंकि मैं फिट देखता हूं। मुझे डेटाबेस को किसी अन्य सर्वर पर स्थानांतरित करने की आवश्यकता होगी और इसका मतलब होगा कि धीमे WAN पर काफी बड़े असम्पीडित बैकअप को खींचना।
ट्रेस ध्वज 4199 से कोई फ़र्क नहीं पड़ता है, और न ही OPTION (RECOMPILE)।
कर्सर गुण हैं:
API | Fast_Forward | Read Only | Global (0)