Sql server SQL Server编译锁?

Sql server SQL Server编译锁?,sql-server,database,locking,Sql Server,Database,Locking,这里是SQLServer2000 我试图成为一名临时DBA,但对数据库服务器的机制知之甚少,所以我有点卡住了。有一个客户端进程可以同时访问三个视图。这三个视图查询远程服务器以提取数据 看起来,其中一个查询可以工作,但另两个查询失败(客户端进程说它超时了,所以我猜锁可以做到这一点)。查询进程有一个锁,它会一直存在,直到SQL进程重新启动为止(我有勇气尝试过一次杀死spid,但它不会松手)。在锁定挂起后对该数据库的任何查询,并将其阻塞归咎于第一个进程 进程报告这些锁。。。(对格式设置表示歉意,预览功

这里是SQLServer2000

我试图成为一名临时DBA,但对数据库服务器的机制知之甚少,所以我有点卡住了。有一个客户端进程可以同时访问三个视图。这三个视图查询远程服务器以提取数据

看起来,其中一个查询可以工作,但另两个查询失败(客户端进程说它超时了,所以我猜锁可以做到这一点)。查询进程有一个锁,它会一直存在,直到SQL进程重新启动为止(我有勇气尝试过一次杀死spid,但它不会松手)。在锁定挂起后对该数据库的任何查询,并将其阻塞归咎于第一个进程

进程报告这些锁。。。(对格式设置表示歉意,预览功能将其显示为完全对齐)

我无法很好地分析这一点。对象1445580188是sp_bindefault,它是master中的一个系统存储过程。它挂在专用锁上的目的是什么

查看代码,为了保护专有信息……我只更改了名称(它们与别名和其他名称保持一致),并试图保持其他所有内容完全相同

    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
看一看。您确定阻塞的是视图而不是存储过程吗?要找到答案,请使用上表中的ObjId运行下面的查询。您可以采取一些措施来减轻存储过程的重新编译。最重要的一点是避免使用“sp_”前缀命名存储过程,请参见第10页的。另外,避免在代码中使用if/else分支,而是使用带有case语句的where子句。我希望这有帮助

[编辑]:

我相信sp_bindfault/rule与用户定义类型(UDT)一起使用。您的观点是否参考了任何UDT

SELECT * FROM sys.Objects where object_id = 1445580188

对象1445580188是主数据库中的sp_bindefault,否?此外,它还显示resource=“TAB”=表

如果第二个查询返回NULL,则该对象是一个工作表

我猜这是一个生成的工作表,用于在本地处理结果。 连接将在本地进行,所有数据都必须跨接


现在,我无法解释编译锁:视图应该已经编译好了。远程服务器访问使这变得复杂,我的编译锁经验都与存储的进程有关。

Hunh,返回sp_bindefault。编辑问题摘要以反映它。这是主数据库中的一个系统存储过程,我不知道它为什么这么叫。也许你可以把视图的来源放在你的帖子上,以帮助弄清这一点。在包含视图的数据库上没有UDT。即将发布视图,已更改为保护专有。远程服务器上的TableA和TableB如何?不会以这种方式显示,不会。在Management Studio中,数据库的“类型”->“用户定义数据类型”下没有任何内容。
SELECT * FROM sys.Objects where object_id = 1445580188
USE master
SELECT OBJECT_NAME(1445580188), OBJECT_ID('sp_bindefault')

USE mydb
SELECT OBJECT_NAME(1445580188)