CXPACKET इंतजार कर रहा है - समानता के लिए लागत सीमा निर्धारित करना


12

शेयरपॉइंट साइट की संपूर्ण समस्या निवारण पर मेरे पिछले प्रश्न के फॉलो-अप के रूप में , मैं सोच रहा था कि क्या मैं सीएक्सपैक प्रतीक्षा के बारे में कुछ कर सकता हूं।

मुझे पता है कि घुटने का झटका समाधान MAXDOP को 1 पर सेट करके सभी समानता को बंद करना है - एक बुरा विचार जैसा लगता है। लेकिन एक अन्य विचार यह है कि समानतावाद को खत्म करने से पहले लागत सीमा को बढ़ा दिया जाए। निष्पादन योजना की लागत के लिए 5 का डिफ़ॉल्ट काफी कम है।

तो मैं सोच रहा था कि अगर वहां पहले से ही कोई प्रश्न लिखा हुआ है जो मुझे उच्चतम निष्पादन योजना लागत के साथ प्रश्न मिल जाएगा (मुझे पता है कि आप उन्हें निष्पादन की उच्चतम अवधि और इसी तरह पा सकते हैं - लेकिन क्या निष्पादन योजना लागत कहीं पुनर्प्राप्त करने योग्य है, भी?) और यह भी मुझे बताएगा कि क्या ऐसी क्वेरी को समानांतर में निष्पादित किया गया है।

क्या किसी के पास इस तरह की स्क्रिप्ट है, या मुझे संबंधित डीएमवी, डीएमएफ या अन्य सिस्टम कैटलॉग विचारों की दिशा में इंगित कर सकते हैं?

जवाबों:


11

CXPACKETकभी कोई कारण नहीं है; यह सभी दोष प्राप्त करता है, लेकिन यह हमेशा किसी और चीज का लक्षण होता है। आपको अधिनियम में इन प्रश्नों को पकड़ने और यह पता लगाने की आवश्यकता है कि "कुछ और" क्या है। यह क्वेरी से क्वेरी से भिन्न हो सकता है, और समानांतरता को पूरी तरह से बंद करना - जैसा कि आपने सुझाव दिया है - ज्यादातर मामलों में अनावश्यक ओवरकिल। लेकिन यह अक्सर काम की कम से कम राशि है, यही वजह है कि यह इस तरह के एक प्रचलित "ठीक है।"

यदि आप एक क्वेरी के लिए वास्तविक योजना प्राप्त कर सकते हैं जो उच्च CXPACKET प्रतीक्षा के लिए जिम्मेदार लगती है, तो इसे SQL संतरी योजना एक्सप्लोरर में लोड करें । इसके पीछे आमतौर पर एक कारण है; हम दिखाते हैं कि कौन से समानांतर संचालन ने थ्रेड स्काइव का नेतृत्व किया, और आप आसानी से अनुमान लगा सकते हैं कि बंद हैं (हम कम से कम निश्चित सीमा से बंद अनुमानों के साथ संचालन को हाइलाइट करते हैं)। आमतौर पर अंतर्निहित समस्या वास्तव में खराब / आउट-ऑफ-डेट (या अनुपलब्ध) आँकड़े है।

दुर्भाग्य से आप sysinos_exec_cached_plans में क्या पाएंगे अनुमानित योजनाएं हैं। वे आपको यह नहीं बताएंगे कि क्या वास्तव में इसका उपयोग किए जाने पर योजना समानांतर चली गई थी, क्योंकि वास्तविक योजना वह नहीं है जो कैश की गई हो। कुछ मामलों में आप एक ही क्वेरी के लिए धारावाहिक और समानांतर योजना दोनों को देखने की उम्मीद करते हैं; यह नहीं है कि SQL सर्वर समानांतर योजनाओं की स्थिति से संबंधित है जो रनटाइम पर समानांतर हो सकती हैं। (इस बारे में बहुत सारी जानकारी यहाँ है ।)


4

यदि आप एक क्वेरी के वास्तविक निष्पादन योजना को देखना चाहते हैं जो चल रही है।

SELECT plan_handle FROM sys.dm_exec_requests WHERE session_id = [YourSPID]

सबसे पहले इस क्वेरी में परिणाम दर्ज करें।

SELECT query_plan FROM sys.dm_exec_query_plan (Enter the result here.)

यह आपको वास्तविक निष्पादन योजना दिखाएगा जो उस क्वेरी के लिए sql का उपयोग करती है। आप उस निष्पादन योजना का उपयोग कर सकते हैं कि आप किस थ्रेड पर प्रतीक्षा कर रहे हैं।

मैंने यह भी पाया है कि हाइपर थ्रेडिंग को बंद करने से मेरे सीएक्सपैकेट प्रतीक्षा समय में काफी कमी आई है।

उम्मीद है की वो मदद करदे।


3

आरोन द्वारा उपरोक्त उत्तर सही है।

अगर आप पहले से ही SQL प्रदर्शन डैशबोर्ड रिपोर्ट और अंतर्निहित डेटा संग्राहक का उपयोग नहीं कर रहे हैं, तो आपको इसे जोड़ना चाहिए, आपको शुरू करना चाहिए।

आप निम्न क्वेरी भी ले सकते हैं, और जैसा कि आप फिट देखते हैं, इसे संशोधित कर सकते हैं:

DECLARE @MinExecutions int; 
SET @MinExecutions = 5 

SELECT EQS.total_worker_time AS TotalWorkerTime 
      ,EQS.total_logical_reads + EQS.total_logical_writes AS TotalLogicalIO 
      ,EQS.execution_count As ExeCnt 
      ,EQS.last_execution_time AS LastUsage 
      ,EQS.total_worker_time / EQS.execution_count as AvgCPUTimeMiS 
      ,(EQS.total_logical_reads + EQS.total_logical_writes) / EQS.execution_count  
       AS AvgLogicalIO 
      ,DB.name AS DatabaseName 
      ,SUBSTRING(EST.text 
                ,1 + EQS.statement_start_offset / 2 
                ,(CASE WHEN EQS.statement_end_offset = -1  
                       THEN LEN(convert(nvarchar(max), EST.text)) * 2  
                       ELSE EQS.statement_end_offset END  
                 - EQS.statement_start_offset) / 2 
                ) AS SqlStatement 
      -- Optional with Query plan; remove comment to show, but then the query takes !!much longer!! 
      --,EQP.[query_plan] AS [QueryPlan] 
FROM sys.dm_exec_query_stats AS EQS 
     CROSS APPLY sys.dm_exec_sql_text(EQS.sql_handle) AS EST 
     CROSS APPLY sys.dm_exec_query_plan(EQS.plan_handle) AS EQP 
     LEFT JOIN sys.databases AS DB 
         ON EST.dbid = DB.database_id      
WHERE EQS.execution_count > @MinExecutions 
      AND EQS.last_execution_time > DATEDIFF(MONTH, -1, GETDATE()) 
ORDER BY AvgLogicalIo DESC 
        ,AvgCPUTimeMiS DESC

0

मेरे पिछले अनुभव में थ्रेशोल्ड फॉर पैरेललिज्म सीएक्सपैकेट को कम करने में मदद नहीं करता था।

CXPACKETस्केव्ड पैरेललिज़्म के परिणामस्वरूप गलत आँकड़ों के कारण उच्च प्रतीक्षा हो सकती है।

  1. CXPACKET वेट्स पर अधिक: तिरछा समानांतरवाद
  2. Microsoft कनेक्ट आइटम
  3. मेरी क्वेरी समानता के कारण प्रतीक्षा नहीं कर रही है? - टिम फोर्ड

एसक्यूएल के बाद मैं सत्रों को खोजने के लिए उपयोग किया जाता है जिसमें सीएक्सपैकेट और " अन्य प्रतीक्षा " दोनों हैं (कृपया नीचे दिए गए चित्र देखें)।

एसक्यूएल

DECLARE @RawResult TABLE ([database_id] INT,[session_id] INT,exec_context_id INT, [blocking_session_id] INT,task_state VARCHAR(20),
                          [cpu_time] BIGINT,[wait_duration_ms] BIGINT, [wait_type] VARCHAR(100),[resource_description] nvarchar(3072),
                          [sql_handle] varbinary(64),[plan_handle] varbinary(64)
                          )
INSERT INTO @RawResult
SELECT 
    [R].[database_id],
    [S].[session_id],
    [W].exec_context_id,
    [W].blocking_session_id,
    [T].task_state,
    [R].[cpu_time],
    [W].[wait_duration_ms],
    [W].[wait_type],
    [W].[resource_description],
    [R].[sql_handle],
    [R].[plan_handle]
FROM sys.dm_os_waiting_tasks [W]
INNER JOIN sys.dm_os_tasks [T] ON
    [W].[waiting_task_address] = [T].[task_address]
INNER JOIN sys.dm_exec_sessions [S] ON
    [W].[session_id] = [S].[session_id]
INNER JOIN sys.dm_exec_requests [R] ON
    [S].[session_id] = [R].[session_id]
WHERE [S].[is_user_process] = 1
--AND S.session_id <> @@SPID--???
--ORDER BY [W].[session_id],[W].[exec_context_id];


SELECT  
    DB_NAME(C.database_id) AS database_name,
    C.[database_id],
    C.[session_id],
    C.exec_context_id,
    C.blocking_session_id,
    C.task_state,
    C.[cpu_time],
    C.[wait_duration_ms],
    C.[wait_type],
    C.[sql_handle],
    C.[plan_handle],
    [H].text,
    [P].[query_plan],
    C.[resource_description]
FROM @RawResult C
OUTER APPLY sys.dm_exec_sql_text (C.[sql_handle]) [H]
OUTER APPLY sys.dm_exec_query_plan (C.[plan_handle]) [P]
WHERE C.[session_id] IN
                    (
                        SELECT A.[session_id]
                        FROM @RawResult A
                        INNER JOIN @RawResult B
                            ON A.[session_id] = B.[session_id]
                            AND A.wait_type='CXPACKET'
                            AND B.wait_type <> 'CXPACKET'
                    )
ORDER BY C.[session_id],C.[exec_context_id]

यहाँ छवि विवरण दर्ज करें

बड़े स्कैन भी मूल कारण का हिस्सा हो सकते हैं। जब मैंने उपरोक्त क्वेरी से निष्पादन योजना की जांच की, तो मुझे अपने डेटाबेस में एक ऐसा स्कैन मिला। निष्पादन योजना में एक अनुपलब्ध सूचकांक सुझाव भी था।

यहाँ छवि विवरण दर्ज करें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.