2009-04-09 78 views
0

SQL Server 2000在這裏。SQL Server編譯鎖?

我想成爲一個臨時DBA,但不太瞭解數據庫服務器的機制,所以我有點卡住了。有一個客戶端進程同時訪問三個視圖。這三個視圖查詢遠程服務器以撤回數據。

它看起來像是其中一個查詢可以工作,但其他兩個失敗(客戶端進程說它超時,所以我猜測一個鎖可以做到這一點)。查詢過程有一個鎖定,直到SQL過程重新啓動(我有勇氣試圖殺死spid一次,但它不會放過)。在鎖定掛起後對該數據庫的任何查詢,並指責阻止它的第一個進程。

該進程報告這些鎖定...(格式化道歉,預覽功能顯示它完全排隊)。

spid dbid ObjId  IndId Type Resource  Mode Status 
53 17 0   0  DB      S  GRANT 
53 17 1445580188 0  TAB      Sch-S GRANT 
53 17 1445580188 0  TAB  [COMPILE]  X  GRANT 

我不能分析得太好。對象1445580188是sp_bindefault,是master中的系統存儲過程。什麼是獨家鎖定?

查看代碼,以保護專有...我只改變了名稱(他們保持與別名和whatnot一致),並試圖保持一切完全相同。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

ALTER view [dbo].[theView] 
as 
select 
    a.[column1] column_1  
    ,b.[column2] column_2 
    ,[column3] 
    ,[column4] 
    ,[column5] 
    ,[column6] 
    ,[column7] 
    ,[column8] 
    ,[column9] 
    ,[column10] 
    ,p.[column11] 
    ,p.[column12] 
FROM 
    [remoteServer].db1.dbo.[tableP] p 
    join [remoteServer].db2.dbo.tableA a on p.id2 = a.id 
    join [remoteServer].db2.dbo.tableB b on p.id = b.p_id 
WHERE 
    isnumeric(b.code) = 1 

GO 

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

回答

1

看看this link。你確定它的視圖是阻塞的而不是存儲過程嗎?爲了找出問題,請使用上面的表中的ObjId在下面運行此查詢。有些事情你可以做,以減輕存儲過程重新編譯。最大的問題是避免使用「sp_」前綴命名存儲過程,請參閱第10頁上的this article。還應避免在代碼中使用if/else分支,而應使用case語句替代case語句。我希望這有幫助。

[編輯]:

相信sp_binddefault /規則是與用戶定義的類型(UDT)結合使用。您的觀點是否提及任何UDT?

SELECT * FROM sys.Objects where object_id = 1445580188 
+0

Hunh,返回sp_bindefault。編輯問題摘要以反映它。這是主數據庫中的一個系統sproc,我不知道爲什麼它會調用它。 – Chris 2009-04-09 16:55:14

1

對象1445580188是sp_bindefault將在數據庫,不是嗎?此外,它顯示資源=「TAB」=表。

USE master 
SELECT OBJECT_NAME(1445580188), OBJECT_ID('sp_bindefault') 

USE mydb 
SELECT OBJECT_NAME(1445580188) 

如果第二個查詢返回NULL,那麼該對象是一個工作表。

我猜這是一個工作表正在生成處理結果在本地。 JOIN將在本地發生,並且所有數據都必須通過。

現在,我無法闡明編譯鎖定:視圖應該已經編譯好了。這對遠程服務器訪問來說很複雜,我的編譯鎖經驗都與存儲的特效相關。