none
clustered 和nonclustered index获得的key lock RRS feed

  • 问题

  • inside sql server书上用AdventureWorks数据库的Product表举例说明聚集索引和非聚集索引都会获得key lock.代码如下:

    USE AdventureWorks
    
    go
    
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    
    go
    
    BEGIN TRAN
    
    SELECT * FROM Production .Product 
    
    WHERE Name LIKE 'Racing Socks%'
    
    
    
    select resource_type,resource_database_id,resource_description,resource_associated_entity_id,request_mode,request_type,request_status from sys.dm_tran_locks where resource_associated_entity_id >0 
    
    

    结果有4个key lock,分别对应两个index。

    但是我自己创建了一个表,也有聚集非聚集索引,隔离级别也是可重复读。但查询的结果只有非聚集索引获得了key lock.请问这是为什么?

    CREATE DATABASE rita
    go
    use rita
    go
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    go
    create table test(id int primary key,itext varchar(5))
    go
    create nonclustered index i1 on test (itext)
    go
    insert into test values(1,'abc'),(2,'ab'),(3,'a'),(4,'d'),(5,'e'),(6,'f'),(7,'g')
    go
    begin tran 
    select * from test
    where itext like 'a%' 

     


    每当风再起,想起你
    2010年10月20日 9:15

答案

  • 你可以查看一下执行计划,应该是不同的.所用到的索引也不同,所以锁不一样

     


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    • 已标记为答案 rita_zhao1 2010年10月21日 7:45
    2010年10月20日 10:10
    版主

全部回复

  • 你可以查看一下执行计划,应该是不同的.所用到的索引也不同,所以锁不一样

     


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    • 已标记为答案 rita_zhao1 2010年10月21日 7:45
    2010年10月20日 10:10
    版主
  • 我自己创建的表的执行计划只有nonclustered,没有涉及到clustered。之前Product的表的查询两个索引都涉及了。

    那请问这是因为什么引起的呢?或者说,在聚集和非聚集索引都存在的情况下,索引利用是如何决定的呢?


    每当风再起,想起你
    2010年10月20日 13:27
  • Depends on query and result set.
    2010年10月20日 13:30
  • 成本估算吧, sql server会选择它自认为成本较低的执行策略来执行,虽然有时会出错

    create nonclustered index i1 on test (itext)

    index1可以满足之前的查询,没有必要使用clustered index




    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年10月20日 14:26
    版主