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 / 115655
Accepted
PseudoToad
PseudoToad
Asked: 2015-09-22 06:58:40 +0800 CST2015-09-22 06:58:40 +0800 CST 2015-09-22 06:58:40 +0800 CST

Comando LockMatchID do SQL Server

  • 772

Estou vendo chamadas como as mostradas abaixo em meus logs de auditoria do SQL Server, mas não tenho ideia do que isso significa. Uma pesquisa no Google revelou uma possível relação com compila/recompila. A linha (ou linhas semelhantes) também pode ser encontrada dentro de vários sprocs internos do SQL Server.

  EXEC %%Object(MultiName = @objname).LockMatchID(ID = @objid, Exclusive = 1, BindInternal = 0)

Alguém tem uma compreensão desse processo?

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 1022 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2015-09-22T09:22:27+08:002015-09-22T09:22:27+08:00

    É um método interno, presumivelmente - a partir do nome - usado para bloquear um objeto com base em seu object_ide garantir que o usuário em execução tenha o direito de fazer alterações adicionais no objeto. Esse bloqueio é necessário para fazer coisas como adicionar/eliminar propriedades, colunas ocultas etc. tabela através de algum método indireto, já que não há LOCK TABLEcomando - mas claramente há canalização interna para ajudar nas operações do sistema).

    Se você olhar para qualquer um dos procedimentos em que isso é usado (há uma lista grande):

    SELECT N'EXEC sp_helptext ''sys.' + QUOTENAME(name) + N''';' 
    FROM sys.all_objects 
    WHERE [schema_id] = 4
      AND LOWER(OBJECT_DEFINITION([object_id])) LIKE N'%lockmatchid%';
    

    Você verá comentários anteriores como:

    -- Lock the table schema and check permissions
    
    -- Share lock default so it cannot be dropped
    
    -- Since binding a default is a schema change, update schema count
    --  for the object in the sysobjects table.
    
    -- Ex-lock and check permission
    
    -- Share Lock rule so that it cannot be dropped
    
    -- Check that table and column exist
    
    -- RESOLVE OBJECT NAME
    
    -- Get exclusive object lock upfront so subsequent %%ColumnEx can proceed
    
    -- Acquire sch-M lock up-front on the published object 
    
    -- LOCK PROC & CHECK PERMISSION --
    
    -- LOCK, CHECK PERMISSION, BUMP SCHEMA FOR RECOMPILE  --
    
    -- obtain owner-qual object name
    
    -- Re-acquire schema mod lock to make the code more resilient to changes
    -- although this must have been done inside sp_Mrepl_schema
    
    -- LOCK TABLE, CHECK STANDARD TABLE-DDL PERMISSIONS
    
    -- Since binding a default is a schema change,
    --  update schema count for the object in the sysobjects table.
    
    -- Update schema count for the object in the sysobjects table.
    
    -- Verify that table exists
    

    (E as pessoas dizem que comentar o código é uma perda de tempo.)

    Também parece haver um LockExclusiveMatchIDmétodo, embora o Exclusiveargumento pareça ter sido adicionado posteriormente a LockMatchID, o que tornou o método exclusivo obsoleto.

    Não tenho certeza de quanto mais específico você precisa para isso - se você quiser rastrear onde há uma alta ocorrência disso, você precisa olhar para as chamadas externas, não para esta declaração específica. Por exemplo, você tem um aplicativo que está renomeando muito os objetos, ou chamando sp_autostatsdiretamente, alterando a replicação ou qualquer outra coisa que você possa inferir da lista gerada acima? Você terá que descobrir quais procedimentos estão sendo chamados para ajudar a determinar o porquê . E o que você fará a respeito (se ao menos puder determinar que há um "problema") não terá nada a ver LockMatchIDespecificamente.

    • 2
  2. Dmitriy Grishin - dogrishin
    2019-11-13T07:26:16+08:002019-11-13T07:26:16+08:00

    Eu enfrentei o mesmo problema e vi muitos bloqueios gerados pelas mesmas instruções e impasses ocorridos no servidor durante os mesmos 3 minutos.

    Por meio de relatórios de impasse, descobri que impasses ocorreram com meus processos e este processo do sistema no meu caso: Proc [Database Id = 32767 Object Id = -993696157]

    select DB_NAME(32767)--NULL
    select OBJECT_NAME(-993696157)--sp_MSactivate_auto_sub
    

    De acordo com este artigo , está relacionado à tarefa do sistema de replicação.

    Esta é uma pilha de chamadas típica de relatório de processo bloqueado\processo de bloqueio\process\executionStack no meu caso:

          <executionStack>
            <frame line="30" stmtstart="1570" stmtend="1796" sqlhandle="0x0300ff7f66f82acdcaae2d0054a9000001000000000000000000000000000000000000000000000000000000" />
            <frame line="917" stmtstart="67266" stmtend="67522" sqlhandle="0x0300ff7f48dddfc2a8b02d0054a9000001000000000000000000000000000000000000000000000000000000" />
            <frame line="52" stmtstart="3496" stmtend="5162" sqlhandle="0x0300ff7f5eea5ef7d25b2d0054a9000001000000000000000000000000000000000000000000000000000000" />
            <frame line="92" stmtstart="4236" stmtend="4768" sqlhandle="0x0300ff7f6366c5c416b12d0054a9000001000000000000000000000000000000000000000000000000000000" />
          </executionStack>
    

    Se eu decodificar com esta consulta:

    select
    cast(
                 (select SUBSTRING(txt.text,(ISNULL(T.x.value('./@stmtstart', 'int'), 0) / 2) + 1,
                               ((CASE ISNULL(T.x.value('./@stmtend', 'int'), -1)
                                      WHEN -1 THEN DATALENGTH(txt.text)
                                      ELSE T.x.value('./@stmtend', 'int')
                                  END - ISNULL(T.x.value('./@stmtstart', 'int'), 0)) / 2) + 1) + CHAR(13) AS statement_txt
                                  ,T.x.value('./@line', 'int') as line
                           from @bpReportXml.nodes('//blocking-process/process/executionStack/frame') AS T(x)
                           cross apply sys.dm_exec_sql_text(T.x.value('xs:hexBinary(substring((./@sqlhandle), 3))', 'varbinary(max)')) AS txt
                           for XML path('')) as xml) AS frame_blocking_process_xml
    

    Então eu obtenho este resultado:

    <statement_txt>EXEC %%Object(MultiName = @qualified_name).LockMatchID(ID = @object_id, Exclusive = 1, BindInternal = 0)
    
    </statement_txt>
    <line>30</line>
    <statement_txt>exec sys.sp_MSsetfilteredstatus @tabid
    
                        -- clear nonsqlsub status for this article.
    
    
    </statement_txt>
    <line>917</line>
    <statement_txt>EXEC @retcode = @cmd
                        @publication,
                        @article,
                        @subscriber,
                        @status,
                        @previous_status,
                        @destination_db,
                        @frequency_type,
                        @frequency_interval,
                        @frequency_relative_interval,
                        @frequency_recurrence_factor,
                        @frequency_subday,
                        @frequency_subday_interval,
                        @active_start_time_of_day,
                        @active_end_time_of_day,
                        @active_start_date,
                        @active_end_date,
                        @optional_command_line,
                        @distribution_jobid OUTPUT,
                        @from_auto_sync,
                        @ignore_distributor,
                        -- Agent offload
                        @offloadagent,
                        @offloadserver,
                        @dts_package_name,
                        @dts_package_password,
                        @dts_package_location,
                        @skipobjectactivation,
                        @distribution_job_name,
                        @publisher,
                        @publisher_type
                        ,@ignore_distributor_failure
    
    
    </statement_txt>
    <line>52</line>
    <statement_txt>EXECUTE @retcode =   sys.sp_changesubstatus 
                            @publication = @publication,
                            @article = @article,
                            @status = @status,
                            @from_auto_sync = @from_auto_sync,
                            @skipobjectactivation = @skipobjectactivation,
                            @publisher = @publisher
    
    
    </statement_txt>
    <line>92</line>
    
    • 0

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