ক্যোয়ারী এক্সিকিউশন চলাকালীন অর্জিত লকগুলি দেখুন (এসকিউএল সার্ভার)


12

ক্যোয়ারী এক্সিকিউশন প্ল্যানটি ডিফল্টরূপে লকিংয়ের বিশদটি প্রদর্শন করে না, কোয়েরি কার্যকর করার সময় লকগুলি, প্রকারের সাথে কীভাবে পাওয়া সম্ভব?

উত্তর:


14

কোনও ক্যোয়ারির সঞ্চালনের সময় যে ধরণের লকগুলি অর্জিত হয়েছিল তা কী কী দেখতে পারা সম্ভব?

হ্যাঁ, লক নির্ধারণের জন্য,

  1. আপনি এরল্যান্ড সোমমারস্কোগ দ্বারা ব্যবহার করতে পারেনbeta_lockinfo

    beta_lockinfoহ'ল একটি সঞ্চিত প্রক্রিয়া যা তাদের সক্রিয় লেনদেনগুলির পাশাপাশি প্রসেস এবং লকগুলি সম্পর্কে তাদের সক্রিয় লেনদেন সম্পর্কিত তথ্য সরবরাহ করে। beta_lockinfoযতটা সম্ভব ব্লকিং পরিস্থিতি সম্পর্কে যথাসম্ভব তথ্য সংগ্রহ করার জন্য ডিজাইন করা হয়েছে, যাতে আপনি পরিস্থিতিটি তাত্ক্ষণিকভাবে অপরাধীকে খুঁজে পেতে এবং পরিস্থিতি হতাশায় অবরুদ্ধকরণ প্রক্রিয়াটিকে মেরে ফেলতে পারেন। তারপরে আপনি beta_lockinfoকীভাবে অবরুদ্ধ পরিস্থিতি তৈরি হয়েছিল তা বুঝতে এবং আপনি পরিস্থিতিটিকে পুনঃব্যবস্থা থেকে রোধ করতে কী পদক্ষেপ নিতে হবে তা বুঝতে আপনি পিছনে বসে আউটপুট বিশ্লেষণ করতে পারেন । প্রাপ্ত beta_lockinfoফলাফলগুলি সমস্ত সক্রিয় প্রক্রিয়া পাশাপাশি লকগুলি সহ প্যাসিভ প্রক্রিয়াগুলি প্রদর্শন করে, কোন বস্তুগুলি তারা লক করে, কোন আদেশটি তারা সর্বশেষ জমা দিয়েছে এবং কোন বিবৃতিটি তারা কার্যকর করছে। আপনি বর্তমান বিবৃতিগুলির জন্য ক্যোয়ারী পরিকল্পনাগুলিও পান। সাধারণত, আপনি চালানbeta_lockinfoআউটপুটটি সরাসরি দেখতে, তবে একটি সংরক্ষণাগার মোডও রয়েছে যেখানে ডেটাটি টেবিলে সংরক্ষণ করা হয়। এটি সর্বনিম্ন কার্যকর নয়, যদি আপনি চান যে কেউ beta_lockinfoআপনাকে নিজের কাছে অ্যাক্সেস না করে এমন কোনও সাইট থেকে আপনাকে আউটপুট পাঠায় ।

  2. আরেকটি পদ্ধতি হ'ল sp_whoIsActiveঅ্যাডাম মাচানিকের সাথে ব্যবহার করা@get_locks = 1

    EXEC sp_WhoIsActive 
    @filter = '', 
    @filter_type = 'session', 
    @not_filter = '', 
    @not_filter_type = 'session', 
    @show_own_spid = 0, 
    @show_system_spids = 0, 
    @show_sleeping_spids = 1, 
    @get_full_inner_text = 0, 
    @get_plans = 1, 
    @get_outer_command = 1, 
    @get_transaction_info = 0, 
    @get_task_info = 1, 
    @get_locks = 1,   ----------> 1 = ON (get lock info); 0 = OFF
    @get_avg_time = 0, 
    @get_additional_info = 0, 
    @find_block_leaders = 0, 
    @delta_interval = 0, 
    @output_column_list = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]', 
    @sort_order = '[start_time] ASC', 
    @format_output = 1, 
    @destination_table = '', 
    @return_schema = 0, 
    @schema = NULL, 
    @help = 0

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

1
যেহেতু আপনি স্ক্যালি সার্ভার 2012 ব্যবহার করছেন, তাই ক্যোয়ারির দানাদার স্তরে, আপনার এক্সএভেন্টসটি অনুসন্ধান করা উচিত - কোন প্রশ্নগুলি লক ধরেছে তা নির্ধারণ করুন । এটি আপনাকে একটি ভাল সূচনা দেবে।
কিন শাহ

4

প্রক্রিয়া / সারণী / লক প্রকার অনুসারে আমি কীভাবে তালাবাদের দিকে নজর দিচ্ছি:

SELECT 
    HostName,
    "OS UserName",
    Login, 
    spid, 
    "Database", 
    TableID,
    "Table Name_________", 
    IndID, 
--  [Index Name],
    "Lock Type", 
    "Lock Mode", 
    Status, 
--  Resource,
    Count(*) AS "Lock Count"
FROM (
    SELECT
        Convert(VarChar(30), RTRIM(P.HostName)) AS HostName,
        Convert(VarChar(30), RTRIM(P.nt_UserName)) AS "OS UserName",
        Convert(VarChar(30), Suser_SName(p.sid)) AS Login, 
        Convert(SmallInt, req_spid) AS spid,
        Convert(VarChar(30), DB_Name(rsc_dbid)) AS "Database",
        rsc_objid AS TableID,
    Convert(VarChar(30), Object_Name(rsc_objid, rsc_dbid))
        AS [Table Name_________],
        rsc_indid AS IndID, 
        CASE SubString (lock_type.name, 1, 4) 
            When '' Then 'None'
            When 'DB' Then 'Database'
            When 'FIL' Then 'File'
            When 'IDX' Then 'Index'
            When 'TAB' Then 'Table'
            When 'PAG' Then 'Page'
            When 'KEY' Then 'Key'
            When 'EXT' Then 'Extent'
            When 'RID' Then 'Row ID'
            When 'APP' Then 'Application'
            Else SubString (lock_type.name, 1, 4)
        END AS "Lock Type",
        Case SubString (lock_mode.name, 1, 12)
            When NULL Then 'N/A'
            When 'Sch-S' Then 'SCHEMA (Stability)'--'SCHEMA stability lock'
            When 'Sch-M' Then 'SCHEMA (Modification)'--'SCHEMA modification lock'
            When 'S' Then 'SHARED'--'SHARED Lock acquisition'
            When 'U' Then 'UPDATE'--'UPDATE lock acquisition'
            When 'X' Then 'EXCLUSIVE'--'EXCLUSIVE lock granted'
            When 'IS' Then 'SHARED (Intent)'--'INTENT for SHARED lock'
            When 'IU' Then 'UPDATE (Intent)'--'INTENT for UPDATE lock'
            When 'IX' Then 'EXCLUSIVE (Intent)'--'INTENT for EXCLUSIVE lock'
            When 'SIU' Then 'SHARED (Intent UPDATE)'--'SHARED lock with INTENT for UPDATE'
            When 'SIX' Then 'SHARED (Intent EXCLUSIVE)'--'SHARED lock with INTENT for EXCLUSIVE'
            When 'UIX' Then 'UPDATE'--'UPDATE lock with INTENT for EXCLUSIVE'
            When 'BU' Then 'UPDATE (BULK)'--'BULK UPDATE lock'
            Else SubString (lock_mode.name, 1, 12)
        END AS "Lock Mode", 
        SubString(lock_status.name, 1, 5) AS Status,
        SubString (rsc_text, 1, 16) AS Resource
    FROM 
        Master..SysLockInfo S
        JOIN Master..spt_values lock_type on S.rsc_type = lock_type.number
        JOIN Master..spt_values lock_status on S.req_status = lock_status.number
        JOIN Master..spt_values lock_mode on S.req_mode = lock_mode.number -1
        JOIN Master..SysProcesses P on S.req_spid = P.spid
    WHERE
            lock_type.type = 'LR'
        AND lock_status.type = 'LS'
        AND lock_mode.type = 'L'
        AND DB_Name(rsc_dbid) NOT IN ('master', 'msdb', 'model')
    ) AS X
WHERE TableID > 0
GROUP BY 
    HostName,
    "OS UserName",
    Login, 
    spid, 
    "Database", 
    TableID,
    "Table Name_________", 
    IndID, 
    "Lock Type", 
    "Lock Mode", 
    Status
ORDER BY
    spid, "Database", "Table Name_________", "Lock Type", Login

3
এটি দুর্দান্ত উত্তর এবং এটি এমন লজ্জাজনক যে এটি সামঞ্জস্যতা দর্শন ব্যবহার করে। আসুন, এটি 2015!
স্প্যাগেটিডবা

3

এটি চালানোর পরে আপনি "বার্তাগুলি" ট্যাবে অধিগ্রহণ করা লকগুলির ইতিহাস দেখতে পারেন: ডিবিসিসি ট্র্যাকিয়ন (1200, 3604, -1) তবে সাবধান, এটি সেই ট্রেস পতাকাগুলি স্বেচ্ছায় সক্ষম করে তুলছে, তাই আপনি যত তাড়াতাড়ি না তা বন্ধ করতে ভুলবেন না তাদের দরকার


1

আপনি sp_lock বা sys.dm_tran_locks ব্যবহার করে একটি সেশনের জন্য লকগুলি দেখতে পারেন। উভয় উপায়ে আপনি অধিবেশন দ্বারা ফিল্টার করতে পারেন। এটি করতে আপনি বর্ধিত ইভেন্টগুলিও ব্যবহার করতে পারেন।


0

হ্যাঁ আপনি কোয়েরি প্রয়োগের সময় লক এবং এর ধরণটি দেখতে পারেন

  1. অ্যাডাম মেকানিক্সের এসপি_জয়েটিভ দেখতে এখানে ক্লিক করুন

  2. এছাড়াও আপনি যদি এখানে একটি ব্লক প্রতিবেদন তৈরি করতে চান তবে এখানে বর্ণিত হিসাবে ট্রেসের সাহায্যে করতে পারেন


1
performance countersকেবল আপনাকে উদাহরণস্বরূপ বিস্তৃত আচরণ দেবে। ওপি কোয়েরি স্তরে চায়।
কিন শাহ

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