Xem các khóa có được trong quá trình thực hiện truy vấn (SQL Server)


12

Kế hoạch thực hiện truy vấn không hiển thị các chi tiết khóa theo mặc định, có thể xem các khóa, cùng với loại, có được trong quá trình thực hiện truy vấn không?

Câu trả lời:


14

Có thể xem các khóa, cùng với loại, có được trong quá trình thực hiện truy vấn không?

Có, để xác định ổ khóa,

  1. Bạn có thể sử dụng beta_lockinfobởi Erland Sommarskog

    beta_lockinfolà một thủ tục được lưu trữ cung cấp thông tin về các quy trình và các khóa họ giữ cũng như các giao dịch đang hoạt động của họ. beta_lockinfođược thiết kế để thu thập càng nhiều thông tin về tình huống chặn càng tốt, để bạn có thể ngay lập tức tìm ra thủ phạm và tiêu diệt quá trình chặn nếu tình huống tuyệt vọng. Sau đó, bạn có thể ngồi lại và phân tích đầu ra từ beta_lockinfođể hiểu tình huống chặn phát sinh như thế nào và tìm ra những hành động cần thực hiện để ngăn chặn tình huống tái diễn. Đầu ra từ beta_lockinfohiển thị tất cả quy trình hoạt động cũng như các quy trình thụ động có khóa, đối tượng nào họ khóa, lệnh nào họ gửi lần cuối và câu lệnh nào họ đang thực hiện. Bạn cũng có được các kế hoạch truy vấn cho các báo cáo hiện tại. Thông thường, bạn chạybeta_lockinfođể xem trực tiếp đầu ra, nhưng cũng có một chế độ lưu trữ nơi dữ liệu được lưu vào bảng. Đây không phải là ít hữu ích nhất, nếu bạn muốn ai đó gửi cho bạn đầu ra từ beta_lockinfomột trang web mà bạn không có quyền truy cập vào chính mình.

  2. Một phương pháp khác là sử dụng sp_whoIsActivebởi Adam Machanic với@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

cảm ơn, các procs được lưu trữ ở trên rất tốt cho các kịch bản quản trị db, nhưng, bạn có biết bất kỳ giải pháp thay thế nào cho các kịch bản tối ưu hóa truy vấn không. Tôi đang cố gắng hiểu hành vi khóa của một truy vấn chèn trong môi trường phát triển (không có nhiều dữ liệu, vì vậy truy vấn không chạy rất lâu). Tôi muốn xem tất cả các khóa được truy vấn sau khi thực hiện, tôi rất thích xem kế hoạch khóa, tương tự như cách hoạt động của kế hoạch truy vấn.
Faisal Mansoor

1
Vì bạn đang sử dụng máy chủ sql 2012, ở cấp độ truy vấn chi tiết, bạn nên xem xét XEvents - Xác định truy vấn nào đang giữ Khóa . Điều này sẽ cung cấp cho bạn một khởi đầu tốt.
Kin Shah

4

Đây là cách tôi xem các khóa theo quy trình / bảng / loại khóa:

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
Đó là một câu trả lời tuyệt vời và thật xấu hổ khi nó sử dụng các quan điểm tương thích. Thôi nào, năm 2015!
spaghettidba

3

Bạn có thể xem lịch sử khóa thu được trong tab "Tin nhắn" sau khi chạy này: DBCC TRACEON (1200, 3604, -1) Nhưng HÃY THỬ, nó đang bật các cờ theo dõi GLOBALLY, vì vậy đừng quên tắt chúng ngay khi bạn không cần họ.


1

Bạn có thể xem các khóa cho phiên bằng sp_lock hoặc sys.dm_tran_locks. Trong cả hai cách bạn có thể lọc theo phiên. Bạn cũng có thể sử dụng Sự kiện mở rộng để làm điều đó.


0

Có, bạn có thể xem các khóa và loại của nó trong quá trình thực hiện truy vấn thông qua

  1. SP_whoisactive của Adam cơ học bấm vào đây để xem

  2. Ngoài ra, nếu bạn muốn tạo một báo cáo khối với bạn có thể thực hiện với sự trợ giúp của theo dõi như được giải thích ở đây


1
performance counterssẽ chỉ cung cấp cho bạn hành vi rộng. OP muốn ở cấp truy vấn.
Kin Shah

@Kin, cảm ơn, chỉ cần xóa thông tin bổ sung :)
KASQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.