यह SQL Server 2016 के साथ एक बग है?
हाँ। निश्चित रूप से यह सही व्यवहार नहीं है। मैंने इसे यहां रिपोर्ट किया है और यह SQL Server 2016 SP2 CU9 में तय किया गया है ।
जैसा कि मिकेल एरिकसन टिप्पणियों में कहते हैं sys.database_scoped_configurations
और sys.dm_exec_sessions
प्रारूप में विचारों के रूप में कार्यान्वित किए जाते हैं
SELECT ...
FROM OpenRowset(TABLE xxxx)
हालांकि नीचे दो योजनाओं की तुलना करना एक स्पष्ट अंतर है।
DBCC TRACEON(3604);
DECLARE @database_scoped_configurations TABLE(x INT);
INSERT INTO @database_scoped_configurations
SELECT configuration_id
FROM sys.database_scoped_configurations
OPTION (QUERYTRACEON 8608, QUERYTRACEON 8615, QUERYTRACEON 8619, QUERYTRACEON 8620 );
DECLARE @dm_exec_sessions TABLE(x INT);
INSERT INTO @dm_exec_sessions
SELECT session_id
FROM sys.dm_exec_sessions
OPTION (QUERYTRACEON 8608, QUERYTRACEON 8615, QUERYTRACEON 8619, QUERYTRACEON 8620 );
इन दोनों प्रश्नों के लिए ट्रेस ध्वज 8619 आउटपुट दिखाता है
नियम लागू करें: EnforceHandAccCard - x0-> स्पूल या टॉप (x0)
SQL सर्वर स्पष्ट रूप से यह पता लगाने में सक्षम नहीं है कि TVF के लिए स्रोत भी सम्मिलित लक्ष्य नहीं है, इसलिए इसे हेलोवीन सुरक्षा की आवश्यकता होती है।
सत्र मामले में इसे एक स्पूल के रूप में लागू किया गया था जो पहले सभी पंक्तियों को कैप्चर करता है। में database_scoped_configurations
एक जोड़कर TOP 1
योजना के लिए। TOP
हैलोवीन सुरक्षा के लिए उपयोग इस लेख में चर्चा की गई है । इस लेख में एक अनछुए ट्रेस ध्वज का भी उल्लेख किया गया है जो अपेक्षा के TOP
अनुसार काम करने के बजाय एक स्पूल को बाध्य करने के लिए है।
DECLARE @database_scoped_configurations TABLE(x INT);
INSERT INTO @database_scoped_configurations
SELECT configuration_id
FROM sys.database_scoped_configurations
OPTION (QUERYTRACEON 8692)
TOP 1
स्पूल के बजाय उपयोग के साथ एक स्पष्ट समस्या यह है कि यह मनमाने ढंग से डाली गई पंक्तियों की संख्या को सीमित करेगा। तो यह केवल तभी मान्य होगा जब फ़ंक्शन द्वारा दी गई पंक्तियों की संख्या <= 1 थी।
प्रारंभिक ज्ञापन इस तरह दिखता है
क्वेरी 2 के लिए प्रारंभिक ज्ञापन के साथ इसकी तुलना करें
यदि मैं उपरोक्त को सही ढंग से समझता हूं तो यह सोचता है कि पहला टीवीएफ अधिकतम एक पंक्ति में वापस आ सकता है और इसलिए एक गलत अनुकूलन लागू करता है। दूसरी क्वेरी के लिए अधिकतम 1.34078E+154
( 2^512
) पर सेट है ।
मुझे नहीं पता कि यह अधिकतम उपद्रव कहां से हुआ है। शायद DMV के लेखक द्वारा आपूर्ति की गई मेटाडेटा? यह भी अजीब है कि TOP(50)
वैकल्पिक हल के लिए फिर से लिखा नहीं होता है TOP(1)
क्योंकि TOP(50)
हेलोवीन मुद्दा बंद नहीं होंगे होने से (हालांकि यह अनिश्चित काल के लिए जारी बंद कर देंगे)