AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 175965
Accepted
jesijesi
jesijesi
Asked: 2017-06-11 20:30:24 +0800 CST2017-06-11 20:30:24 +0800 CST 2017-06-11 20:30:24 +0800 CST

Entendendo o bloqueio de índice não clusterizado durante uma atualização

  • 772

O script de configuração

CREATE TABLE t2 (   [col1] INT, [col2] INT  );

DECLARE @int INT;
SET @int = 1;

WHILE (@int <= 1000) 
BEGIN
    INSERT INTO t2 
        ([col1], [col2])
    VALUES (@int*2, @int*2);
    SET @int = @int + 1;
END
GO
create clustered index cl on t2(col1)
create  index ncl on t2(col2)

Eu executo uma atualização simples e mantenho a transação aberta no nível de isolamento de leitura confirmada.

begin tran
update t2 set [col2]=[col2]+1  where col1=6

Se eu verificar sp_lock em outra sessão, recebo os resultados abaixo

insira a descrição da imagem aqui

O que estou tentando entender são os bloqueios de teclas no índice não clusterizado (indid 2). Por que há dois bloqueios de teclas no índice não clusterizado?

Se eu verificar a página dbcc na página id 248, eu poderia localizar o óbvio ((1bfceb831cd9)) que é o bloqueio para a entrada para o registro 6 que foi alterado para 7. Saída da PÁGINA DBCC abaixo

insira a descrição da imagem aqui

O que estou tentando entender é qual é o propósito do outro bloqueio de chave (5ebca7ef4e2c) e qual é o seu bloqueio.

sql-server sql-server-2014
  • 1 1 respostas
  • 1303 Views

1 respostas

  • Voted
  1. Best Answer
    Sabin B
    2017-06-12T00:33:08+08:002017-06-12T00:33:08+08:00

    Se você tentar o seguinte...

    CHECKPOINT;
    
    GO
    
    BEGIN TRAN
    
    UPDATE t2
    SET    [col2] = [col2] + 1
    WHERE  col1 = 6
    
    SELECT Operation,
           AllocUnitName
    FROM   sys.fn_dblog(NULL, NULL)
    WHERE  AllocUnitName IS NOT NULL
    
    ROLLBACK 
    

    Você verá

    +-----------------+---------------+
    |    Operation    | AllocUnitName |
    +-----------------+---------------+
    | LOP_MODIFY_ROW  | dbo.t2.cl     |
    | LOP_DELETE_ROWS | dbo.t2.ncl    |
    | LOP_SET_BITS    | dbo.t2.ncl    |
    | LOP_INSERT_ROWS | dbo.t2.ncl    |
    +-----------------+---------------+
    

    Mostrando que o UPDATEíndice não clusterizado é implementado como um par excluir/inserir.

    (5ebca7ef4e2c)é o hash para o registro inicial 6,6 (1bfceb831cd9)é o valor após a atualização 6,7. Veja também o número do slot

    select
        *
        ,%%lockres%%
        ,%%physloc%%
        ,sys.fn_PhysLocFormatter(%%physloc%%)   
    from t2 with (nolock,index = ncl)
    where 
        %%lockres%% = '(5ebca7ef4e2c)'
        --OR 
        --%%lockres%% ='(1bfceb831cd9)'
    
    begin tran
    update t2 set [col2]=[col2]+1  where col1=6
    commit tran
    
    
    select
        *
        ,%%lockres%%
        ,%%physloc%%
        ,sys.fn_PhysLocFormatter(%%physloc%%)   
    from t2 with (nolock,index = ncl)
    where 
        --%%lockres%% = '(5ebca7ef4e2c)'
        --OR 
        %%lockres%% ='(1bfceb831cd9)'
    
    
    update t2 set [col2]=[col2]-1  where col1=6
    
    
    col1    col2    HashValue   bPhysicLocation crackedLocation
    6       6       (5ebca7ef4e2c)  0xB401000001000200  (1:436:2)
    
    col1    col2    HashValue   bPhysicLocation crackedLocation
    6       7      (1bfceb831cd9)   0xB401000001000300  (1:436:3)
    
    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve