2009-04-09 104 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将在本地发生,并且所有数据都必须通过。

现在,我无法阐明编译锁定:视图应该已经编译好了。这对远程服务器访问来说很复杂,我的编译锁经验都与存储的特效相关。