Sql*_*ner 2 sql sql-server sql-server-2008
我有一个包含 200 个表的生产数据库。自上周以来,我无法访问其中一张桌子。当我只选择前 100 行时,它会继续运行。
如何找出该表无法访问的原因?如何判断表是否有锁?所有其他表都运行良好
据我了解,查询时无法得到任何结果。
这可能有很多原因。
1)它可以被锁定。要进行脏读,请尝试使用NOLOCK提示进行查询。
SELECT Column1 FROM TableName WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
要检查表上是否有锁,请使用以下脚本:
declare @a table (
spid int,
[dbid] int,
objid int,
indid int,
[type] varchar(10),
resource varchar(100),
mode varchar(2),
[status] varchar(20)
);
insert into @a
exec sp_lock
select object_name(objid) tablename, * from @a where object_name(objid) = 'TableName'
Run Code Online (Sandbox Code Playgroud)
2)当统计数据过时时,查询可能会很慢。尝试更新它们。
UPDATE STATISTICS dbo.TableName;
Run Code Online (Sandbox Code Playgroud)
3)运营商TOP本身。top 运算符基本上获取整个数据集并对其进行排序,并给出前 100 个。您可以添加查询提示以在排序之前获取一些数据。
SELECT TOP 10 Column1 FROM TableName (OPTION FAST(1))
--Have avoided doing a `SELECT * FROM....`
SELECT 1 FROM TableName (OPTION FAST(1))
--Without `TOP`
Run Code Online (Sandbox Code Playgroud)