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