2014-10-20 212 views
1

我正在處理多租戶解決方案。因此,我們在SQL Server上有很多數據庫。我正在查看鎖定問題,需要能夠查看哪些鎖正在等待。如何從sys.dm_tran_locks獲取索引名稱

我查詢了sys.dm_tran_locks動態視圖,但還想包含由resource_associated_entity_id列引用的數據庫,對象和索引名稱。這通過鏈接到sys.partitions表,但該表只返回當前數據庫的行,而我正在查看的鎖分佈在幾個數據庫周圍。

有沒有辦法在不創建遊標並使用動態生成的查詢的情況下獲取此信息?

+0

馬丁:我剛剛注意到,我忘了放在有關傳入數據庫名稱的用法。我意識到你已經將它標記爲已接受,但無論如何都要更新以清楚我的意思,讓它變得如此簡單 - 就像:-) – 2014-10-21 18:59:51

回答

2

技術上「不」。沒有元數據函數可以獲取當前數據庫上下文之外的索引名稱。

所以,你有兩個選擇:

這可悲的事實也試圖利用他們在一個同樣有用的方式時使用以下不利影響
  • 動態SQL(如您所懷疑的)
  • SQLCLR函數接受所有必需的ID(包括​​),並通過「context connection = true」進行連接以查詢預期的系統視圖(這是我在SQL#中如何根據索引名稱和sys.objects解決了此問題,但將​​作爲SQLCLR函數 - 標量或TVF的參數並通過動態構建的SQL將其本地連接到所述數據庫的技術對於任何其他元數據都是相同的)。
    編輯
    爲了使其更容易,通過在數據庫名稱和連接之進入SqlCommand.CommandText並使用ID作爲SqlParameter秒。所以簽名會,在得到指標名稱的條款:
    GetIndexName(@DatabaseName sysname, @object_id INT, @index_id INT)
    和使用方法如下:
    GetIndexName(DB_NAME(dmv.database_id), dmv.object_id, dmv.index_id)

僅供參考,這裏是元數據的功能列表,通過是否分組沒有你可以指定數據庫或者當前數據庫只:

可以指定數據庫

電流數據庫 - 僅

2

簡答:不,沒有辦法避免這種情況。 sys.partitions和其他特定於數據庫的視圖令人討厭。對於整個對象,通常可以使用OBJECT_NAME()來解決這個問題,因爲它需要一個數據庫ID。對於分配ID,您運氣不佳。從技術上講,你可以避免使用我們的老朋友sp_msforeachdb自己編寫遊標,但由於沒有記錄,通常也不會以你想要的格式給出結果,所以自己寫這個結果是一個好主意。

因爲sys.dm_tran_locks是高度動態的,所以在您需要的時候獲取鎖定信息並不容易。一種可能的選擇是使用事件探查器跟蹤或擴展事件會話來獲取獲取的確切鎖定序列(顯然,由於這是大量數據,因此只有在對特定查詢進行疑難解答時纔會這樣做)。如果你所需要的只是知道誰在嘮叨時惹到了什麼,sp_msforeachdb 'dbcc opentran(''?'')'仍然非常有效。