MSDN " मिसिंग ज्वाइन प्रेडिक्ट इवेंट क्लास " यह कहता है कि " इंगित करता है कि एक क्वेरी निष्पादित की जा रही है जिसमें कोई विधेय शामिल नहीं है "।
लेकिन दुर्भाग्य से यह उतना आसान नहीं लगता है।
उदाहरण के लिए, बहुत सरल स्थिति:
create table #temp1(i int);
create table #temp2(i int);
Select * from #temp1, #temp2 option (recompile);
तालिकाओं में कोई डेटा नहीं है, या तो कोई चेतावनी नहीं है, हालांकि यह स्पष्ट रूप से विधेय में शामिल नहीं है।
यदि मैं SQL सर्वर 2005 (उसी लिंक, बस अन्य सर्वर संस्करण) के लिए प्रलेखन पर एक नज़र डालता हूं, तो एक अतिरिक्त वाक्य है: " यह घटना केवल तभी उत्पन्न होती है जब दोनों पक्ष एक पंक्ति में एक से अधिक रिटर्न देते हैं। " पिछली स्थिति में सही समझ। कोई डेटा नहीं है, इसलिए दोनों पक्ष 0 पंक्तियों को वापस करते हैं और कोई चेतावनी नहीं देते हैं। पंक्तियाँ डालें, चेतावनी प्राप्त करें। अच्छा ठीक है।
लेकिन अगली भ्रामक स्थिति के लिए, मैं दोनों तालिका में समान मान सम्मिलित करता हूं:
Insert into #temp1 (i) values (1)
Insert into #temp1 (i) values (1)
Insert into #temp2 (i) values (1)
Insert into #temp2 (i) values (1)
और मुझे मिलता है:
-- no warning:
Select * from #temp1 t1
inner join #temp2 t2 on t1.i = t2.i
option (recompile)
-- has warning:
Select * from #temp1 t1
inner join (select 1 i union all select 1) t2 on t1.i = t2.i
option (recompile)
ऐसा क्यों है?
नोट : कुछ स्क्रिप्ट जो मैंने अपने सर्वर पर इन खराब प्रश्नों का पता लगाने के लिए उपयोग की थीं।
- बेशक, प्रक्रियाओं की निष्पादन योजना
चेतावनी खोजने के लिए डिफ़ॉल्ट सर्वर ट्रेस का उपयोग किया
Declare @trace nvarchar(500); Select @trace = cast(value as nvarchar(500)) From sys.fn_trace_getinfo(Null) Where traceid = 1 and property = 2; Select t.StartTime, te.name, * From sys.fn_trace_gettable(@trace, 1) t Inner join sys.trace_events te on t.EventClass = te.trace_event_id where EventClass = 80 order by t.StartTime desc
निष्पादन योजना कैश, चेतावनी के साथ उन योजनाओं को खोजने के लिए (जैसे यह एक)
WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') SELECT Cast('<?SQL ' + st.text + ' ?>' as xml) sql_text, pl.query_plan, ps.execution_count, ps.last_execution_time, ps.last_elapsed_time, ps.last_logical_reads, ps.last_logical_writes FROM sys.dm_exec_query_stats ps with (NOLOCK) Cross Apply sys.dm_exec_sql_text(ps.sql_handle) st Cross Apply sys.dm_exec_query_plan(ps.plan_handle) pl WHERE pl.query_plan.value('(//Warnings/@NoJoinPredicate)[1]', 'bit') = 1 Order By last_execution_time desc OPTION (RECOMPILE);