Temukan Objek yang Memiliki Kunci Terbanyak Yang Diambil di Atasnya

Berlaku untuk:SQL ServerAzure SQL Database

Administrator database sering kali perlu mengidentifikasi sumber kunci yang menghambat performa database.

Misalnya, Anda memantau server produksi Anda untuk setiap kemungkinan hambatan. Anda menduga bahwa mungkin ada sumber daya yang sangat diperebutkan, dan ingin tahu berapa banyak kunci yang diambil pada objek tersebut. Setelah objek yang paling sering dikunci diidentifikasi, langkah-langkah dapat diambil untuk mengoptimalkan akses ke objek yang disatukan.

Untuk melakukan ini, gunakan Editor Kueri di SQL Server Management Studio.

Untuk menemukan objek yang memiliki kunci terbanyak

  1. Di Editor Kueri, terbitkan pernyataan berikut.

    -- Find objects in a particular database that have the most
    -- lock acquired. This sample uses AdventureWorksDW2022.
    -- Create the session and add an event and target.
    
    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='LockCounts')
        DROP EVENT session LockCounts ON SERVER;
    GO
    DECLARE @dbid int;
    
    SELECT @dbid = db_id('AdventureWorksDW2022');
    
    DECLARE @sql nvarchar(1024);
    SET @sql = '
        CREATE event session LockCounts ON SERVER
            ADD EVENT sqlserver.lock_acquired (WHERE database_id ='
                + CAST(@dbid AS nvarchar) +')
            ADD TARGET package0.histogram(
                SET filtering_event_name=''sqlserver.lock_acquired'',
                    source_type=0, source=''resource_0'')';
    
    EXEC (@sql);
    GO
    ALTER EVENT session LockCounts ON SERVER
        STATE=start;
    GO
    -- Create a simple workload that takes locks.
    
    USE AdventureWorksDW2022;
    GO
    SELECT TOP 1 * FROM dbo.vAssocSeqLineItems;
    GO
    -- The histogram target output is available from the
    -- sys.dm_xe_session_targets dynamic management view in
    -- XML format.
    -- The following query joins the bucketizing target output with
    -- sys.objects to obtain the object names.
    
    SELECT name, object_id, lock_count
        FROM
        (
        SELECT objstats.value('.','bigint') AS lobject_id,
            objstats.value('@count', 'bigint') AS lock_count
            FROM (
                SELECT CAST(xest.target_data AS XML)
                    LockData
                FROM     sys.dm_xe_session_targets xest
                    JOIN sys.dm_xe_sessions        xes  ON xes.address = xest.event_session_address
                    JOIN sys.server_event_sessions ses  ON xes.name    = ses.name
                WHERE xest.target_name = 'histogram' AND xes.name = 'LockCounts'
                 ) Locks
            CROSS APPLY LockData.nodes('//HistogramTarget/Slot') AS T(objstats)
        ) LockedObjects
        INNER JOIN sys.objects o  ON LockedObjects.lobject_id = o.object_id
        WHERE o.type != 'S' AND o.type = 'U'
        ORDER BY lock_count desc;
    GO
    
    -- Stop the event session.
    
    ALTER EVENT SESSION LockCounts ON SERVER
        state=stop;
    GO
    

Catatan

Contoh kode Transact-SQL sebelumnya berjalan di SQL Server lokal, tetapi mungkin tidak cukup berjalan di Azure SQL Database. Bagian inti dari contoh yang secara langsung melibatkan Peristiwa, seperti ADD EVENT sqlserver.lock_acquired melakukan pekerjaan di Azure SQL Database juga. Tetapi item awal, seperti sys.server_event_sessions harus diedit ke mitra Azure SQL Database mereka seperti sys.database_event_sessions contoh untuk dijalankan. Untuk informasi selengkapnya tentang perbedaan kecil antara SQL Server lokal versus Azure SQL Database, lihat artikel berikut ini:

Setelah pernyataan dalam skrip Transact-SQL sebelumnya selesai, tab Hasil Editor Kueri menampilkan kolom berikut:

  • nama
  • object_id
  • lock_count

Lihat Juga

CREATE EVENT SESSION (T-SQL)
MENGUBAH SESI PERISTIWA (Transact-SQL)
sys.dm_xe_session_targets (Transact-SQL)
sys.dm_xe_sessions (T-SQL)
sys.server_event_sessions (T-SQL)