Sorgu yürütme sırasında edinilen kilitleri görüntüleme (SQL Server)


12

Sorgu yürütme planı varsayılan olarak kilitleme ayrıntılarını göstermez, bir sorgunun yürütülmesi sırasında alınan türle birlikte kilitleri görüntülemek mümkün müdür?

Yanıtlar:


14

sorgunun yürütülmesi sırasında edinilen kilitlerin türüyle birlikte görüntülenmesi mümkün müdür?

Evet, kilitleri belirlemek için,

  1. Erland Sommarskog tarafından kullanabilirsinizbeta_lockinfo

    beta_lockinfoişlemler ve sahip oldukları kilitler ve bunların etkin işlemleri hakkında bilgi sağlayan saklı bir yordamdır. beta_lockinfoengelleme durumu hakkında olabildiğince fazla bilgi toplamak üzere tasarlanmıştır, böylece durumun çaresiz olması durumunda suçluyu anında bulabilir ve engelleme sürecini öldürebilirsiniz. Daha sonra arkanıza yaslanıp beta_lockinfoengelleme durumunun nasıl ortaya çıktığını anlamak ve durumun tekrarlanmasını önlemek için hangi önlemlerin alınacağını anlamak için çıktıyı analiz edebilirsiniz . Çıktı beta_lockinfo, tüm aktif süreçlerin yanı sıra kilitli pasif süreçleri, hangi nesneleri kilitlediklerini, en son hangi komutu gönderdiklerini ve hangi ifadeyi yürüttüklerini gösterir. Mevcut ifadeler için sorgu planları da alırsınız. Normalde koşarsınbeta_lockinfoçıktıya doğrudan bakmak için, ancak verilerin tabloya kaydedildiği bir arşiv modu da vardır . Bu, en azından kullanışlı değildir, birisinin çıktıyı beta_lockinfokendinize erişemediğiniz bir siteden göndermesini istiyorsanız .

  2. Başka bir yöntem kullanmaktır sp_whoIsActiveAdam Machanic ile birlikte@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

teşekkürler, yukarıda saklanan proc db yönetici senaryoları için mükemmeldir, ancak, sorgu optimizasyon senaryoları için herhangi bir alternatif biliyor musunuz. (Bu çok fazla veri yok, bu yüzden sorgu çok uzun çalışmaz) geliştirme ortamında bir ekleme sorgusu kilitleme davranışını anlamaya çalışıyorum. Ben yürütüldükten sonra bir sorgu tarafından elde edilen tüm kilitleri görmek istiyorum, ben sorgu planı nasıl çalışır benzer, kilit planını görmek ilgileniyorum.
Faysal Mansur

1
Sql server 2012 kullandığınızdan, ayrıntılı bir sorgu düzeyinde, XEvents - Hangi sorguların kilitleri tuttuğunu belirleyin . Bu size iyi bir başlangıç ​​sağlayacaktır.
Kin Shah

4

İşte süreç / tablo / kilit türüne göre kilitlere nasıl bakacağım:

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
Harika bir cevap ve uyumluluk görünümlerini kullanması çok utanç verici. Hadi, 2015!
spaghettidba

3

Alınan kilit geçmişini çalıştırdıktan sonra "Mesajlar" sekmesinde görebilirsiniz: DBCC TRACEON (1200, 3604, -1) Ancak DİKKAT, bu izleme bayraklarını KÜRESELLEŞTİRİYOR, bu yüzden en kısa sürede bunları kapatmayı unutmayın onlara ihtiyacım var.


1

Sp_lock veya sys.dm_tran_locks kullanarak bir oturumun kilitlerini görüntüleyebilirsiniz. Her iki şekilde de oturuma göre filtre uygulayabilirsiniz. Bunu yapmak için Genişletilmiş Olaylar'ı da kullanabilirsiniz.


0

Evet, sorgu yürütme sırasında kilitleri ve türünü

  1. Adam mekaniğinin SP_whoisactive görüntülemek için buraya tıklayın

  2. Üstelik burada bir blok raporu oluşturmak istiyorsanız, burada açıklanan iz yardımı ile yapabilirsiniz.


1
performance counterssize örnek olarak geniş bir davranış verecektir. OP sorgu düzeyinde istiyor.
Kin Shah

@Kin, teşekkürler, fazladan bilgi kaldırıldı :)
KASQLDBA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.