CXPACKET এর সাথে ডিলিং অপেক্ষা করে - সমান্তরালতার জন্য ব্যয় প্রান্তিককরণ নির্ধারণ করে


12

একটি শেয়ারপয়েন্ট সাইটটি সমস্যা সমাধানের ক্ষেত্রে আমার পূর্ববর্তী প্রশ্নের অনুসরণ হিসাবে , আমি ভাবছিলাম যে আমি যদি স্যাক্সপ্যাকেট অপেক্ষা করতে পারি সে সম্পর্কে কিছু করতে পারি।

আমি জানি হাঁটু-জারক সমাধানটি হল MAXDOP 1 এ সেট করে সমস্ত সমান্তরালতা বন্ধ করে দেওয়া - এটি একটি খারাপ ধারণা বলে মনে হচ্ছে। তবে আরেকটি ধারণা হ'ল সমান্তরালতা শুরু হওয়ার আগে ব্যয়ের প্রান্তিক বৃদ্ধি করা an কার্যকর করার পরিকল্পনার ব্যয়ের জন্য 5 এর ডিফল্টটি মোটামুটি কম low

সুতরাং আমি ভাবছিলাম যে সেখানে ইতিমধ্যে লিখিত কোনও প্রশ্নের বাইরে যদি আমার সর্বাধিক নির্বাহী পরিকল্পনার ব্যয়ের সাথে আমার অনুসন্ধানগুলি পাওয়া যায় (আমি জানি যে আপনি সর্বোচ্চ কার্যকর সময়কাল সহ আরও কিছু খুঁজে পেতে পারেন - তবে কি মৃত্যুদন্ড কার্যকর করার পরিকল্পনা ব্যয়টি কোথাও পুনরুদ্ধারযোগ্য, খুব?) এবং এটিও আমাকে বলবে যে এই জাতীয় কোনও প্রশ্নের সমান্তরালে কার্যকর করা হয়েছে কিনা।

কারও কাছে কি এমন স্ক্রিপ্ট হাতে আছে, বা এটি খুঁজে বের করার জন্য আমাকে প্রাসঙ্গিক ডিএমভি, ডিএমএফ বা অন্যান্য সিস্টেম ক্যাটালগ মতামতের দিকে নির্দেশ করতে পারে?

উত্তর:


11

CXPACKETকখনও কারণ হয় না; এটি সমস্ত দোষ পায়, তবে এটি সর্বদা অন্য কোনও কিছুর লক্ষণ। আপনাকে এই ক্যোয়ারীগুলি এ্যাক্টে ধরতে হবে এবং "অন্য কিছু" কী তা নির্ধারণ করতে হবে। এটি ক্যোয়ারী থেকে ক্যোয়ারিতে আলাদা হতে পারে এবং সমান্তরালতা পুরোপুরি বন্ধ করা হ'ল - আপনার পরামর্শ অনুসারে - বেশিরভাগ ক্ষেত্রে অপ্রয়োজনীয় ওভারকিল। তবে এটি প্রায়শই কাজের সর্বনিম্ন পরিমাণ হয়, এজন্যই এটি এতটা প্রচলিত "ফিক্স"।

যদি আপনি এমন কোনও প্রশ্নের জন্য একটি আসল পরিকল্পনা পেতে পারেন যা উচ্চ সিএক্সপ্যাক্যাট অপেক্ষা করে বলে মনে করে তবে এটি এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরারে লোড করুন । এর পিছনে সাধারণত একটি কারণ থাকে; আমরা দেখিয়েছি যে সমান্তরাল ক্রিয়াকলাপগুলি থ্রেড স্কুতে পরিচালিত করেছিল এবং আপনি সহজেই এটি বন্ধ থাকা অনুমানের সাথে সংযুক্ত করতে পারেন (আমরা কমপক্ষে একটি নির্দিষ্ট প্রান্তিক দ্বারা বন্ধ করা অনুমানের সাথে অপারেশনগুলি হাইলাইট করি)। সাধারণত অন্তর্নিহিত সমস্যাটি সত্যই খারাপ / পুরানো (বা অনুপলব্ধ) পরিসংখ্যান।

দুর্ভাগ্যক্রমে আপনি sys.dm_exec_cached_plans এ যা পাবেন তা অনুমান করা পরিকল্পনা। বাস্তবে এটি ব্যবহার করার সময় পরিকল্পনাটি সমান্তরালে চলেছিল কিনা তা তারা আপনাকে জানায় না, কারণ আসল পরিকল্পনাটি ক্যাশেড নয় not কিছু ক্ষেত্রে আপনি একই ক্যোয়ারির জন্য সিরিয়াল এবং সমান্তরাল পরিকল্পনা উভয়ই দেখতে আশা করছেন; এটি এসকিউএল সার্ভারটি সমান্তরাল পরিকল্পনার পরিস্থিতিটির সাথে কীভাবে পরিচালনা করে যা রানটাইমের সময় সমান্তরাল হতে পারে। ( এখানে এ সম্পর্কে প্রচুর তথ্য ।)


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

এটি আপনাকে প্রকৃত বাস্তবায়ন পরিকল্পনাটি দেখাবে যা সেই ক্যোয়ারির জন্য ব্যবহৃত স্কয়ার। আপনি কোন থ্রেডে অপেক্ষা করছেন তা দেখতে আপনি সেই কার্যকরকরণ পরিকল্পনাটি ব্যবহার করতে পারেন।

আমি আরও জানতে পেরেছি যে হাইপার থ্রেডিং বন্ধ করে দেওয়া আমার সিএক্সপ্যাকেট অপেক্ষা করার সময়কে হ্রাস করে।

আশা করি এইটি কাজ করবে.


3

হারুনের উপরের উত্তরটি সঠিক।

আমি কেবল এটি যুক্ত করতে চাই, আপনি যদি ইতিমধ্যে এসকিউএল পারফরম্যান্স ড্যাশবোর্ড রিপোর্টগুলি এবং অন্তর্নির্মিত ডেটা সংগ্রাহক ব্যবহার না করে থাকেন তবে আপনার শুরু করা উচিত।

আপনি নীচের ক্যোয়ারীটিও নিতে পারেন এবং ফিট হিসাবে আপনি এটি সংশোধন করতে পারেন:

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 হ্রাস করতে সহায়তা করে নি।

CXPACKETস্কেউড প্যারালালিজমের ফলস্বরূপ ভুল পরিসংখ্যানের কারণে উচ্চ প্রত্যাশা ঘটতে পারে।

  1. সিএক্সপ্যাকেটের জন্য আরও অপেক্ষা করুন: সমান্তরাল সমালোচনা
  2. মাইক্রোসফ্ট কানেক্ট আইটেম
  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]

এখানে চিত্র বর্ণনা লিখুন

বড় স্ক্যানগুলিও মূল কারণটির অংশ হতে পারে। আমি যখন উপরের জিজ্ঞাসা থেকে কার্যকরকরণের পরিকল্পনাটি পরীক্ষা করেছিলাম, তখন আমি আমার ডাটাবেসে এই জাতীয় একটি স্ক্যান পেয়েছি। কার্যকর করার পরিকল্পনায় একটি অনুপস্থিত সূচকের পরামর্শও ছিল।

এখানে চিত্র বর্ণনা লিখুন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.