【问题标题】:Locking when using Read Uncommitted使用未提交读取时锁定
【发布时间】:2014-04-25 02:33:38
【问题描述】:

我有一个查询需要一点时间才能运行,因此它在隔离级别设置为未提交读取的情况下运行,数据可能很脏,因为它仅用于快速概览系统。

在美好的一天(早上的第一件事)运行查询大约需要 3-15 秒。 (日期排序会减慢它的速度,没有排序的瞬间)

但是随着一天的开始,跑步需要的时间越来越长,最终需要超过 2 分钟的时间。

我注意到查询在执行时似乎获得了很多 OBJECT/PAGE 锁。

我不明白为什么它在设置为未提交读取时获取锁。


查询使用的索引之一设置为使用行/页锁定。

我的问题:

设置为使用行/页锁的索引是否会导致数据在被访问时被锁定,即使查询是未提交的读取?

【问题讨论】:

    标签: sql-server deadlock


    【解决方案1】:

    READ UNCOMMITTED 隔离级别仅更改读取器的行为。在READ COMMITTED 和更高的隔离级别中,当一个任务试图从一行中读取时,它首先向锁管理器请求一个共享锁。只有在没有来自其他会话的现有排他锁的情况下,该请求才会被兑现,否则它将不得不等待它。

    READ UNCOMMITTED 中,读者不会请求共享锁,因此没有机会等待可能的独占锁被释放。

    但是,无论使用何种隔离级别,更新时的锁定行为都是相同的。与任何其他悲观隔离级别一样,排他锁仍在READ UNCOMMITTED 中进行(并保持到事务结束)。

    查询完成所需时间的增加可归因于此,也可归因于某些资源争用,很可能与内存有关。简而言之,您的查询与同时运行的其他查询竞争数据缓存。

    记下一天中不同时间的page life expectancy柜台:

    SELECT @@SERVERNAME AS [Server Name], [object_name], instance_name, cntr_value AS [Page Life Expectancy]
    FROM sys.dm_os_performance_counters WITH (NOLOCK)
    WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances
    AND counter_name = N'Page life expectancy' OPTION (RECOMPILE);
    

    另外,要查看哪些数据占用的空间最多,请使用以下查询:

    SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, 
    CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)],  
    COUNT(*) AS [BufferCount], p.Rows AS [Row Count],
    p.data_compression_desc AS [Compression Type]
    FROM sys.allocation_units AS a WITH (NOLOCK)
    INNER JOIN sys.dm_os_buffer_descriptors AS b WITH (NOLOCK)
    ON a.allocation_unit_id = b.allocation_unit_id
    INNER JOIN sys.partitions AS p WITH (NOLOCK)
    ON a.container_id = p.hobt_id
    WHERE b.database_id = CONVERT(int,DB_ID())
    AND p.[object_id] > 100
    GROUP BY p.[object_id], p.index_id, p.data_compression_desc, p.[Rows]
    ORDER BY [BufferCount] DESC OPTION (RECOMPILE);
    

    [可以在此处找到此和其他诊断查询:http://sqlserverperformance.wordpress.com/]

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2015-05-20
      • 2010-12-06
      • 2013-09-18
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多