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 / 139214
Accepted
GordonLiddy
GordonLiddy
Asked: 2016-05-23 12:12:09 +0800 CST2016-05-23 12:12:09 +0800 CST 2016-05-23 12:12:09 +0800 CST

Planejar o tamanho do cache e a memória reservada

  • 772

Ao executar uma consulta incluindo o plano de execução real, o operador raiz ( SELECT) informa que o tamanho do plano em cache é 32 KB.

Uma consulta que une sys.dm_exec_cached_planse sys.dm_os_memory_objects, examinando o plano em questão, diz que os valores para pages_in_bytese max_pages_in_bytessão 32768 (32 KB), o que corresponde ao tamanho do plano armazenado em cache.

O que não entendo é o que significa o valor em sys.dm_exec_cached_plans.size_in_bytes, que é 49152 (48 KB). Eu li BOL em todas essas colunas e, especialmente, size_in_bytesque diz:

" Número de bytes consumidos pelo objeto de cache. "

Não consigo colocar a última peça do quebra-cabeça no lugar, para entender o que realmente significa.

Eu sei que todos os operadores (sem falar sobre a concessão de memória adicional usada para classificações e hashes) requerem alguma quantidade de memória fixa, para armazenar estado, fazer cálculos etc., que é armazenado com o plano otimizado no cache, mas onde?

Então, minhas perguntas são:

  • O que size_in_bytesrealmente significa
  • Por que é um valor maior do que "Tamanho do plano em cache"?
  • Onde está reservada a quantidade fixa de memória para todos os operadores/iteradores, é com o "Tamanho do plano em cache" (32Kb no meu exemplo) ou em qualquer outro lugar?

Sei que são Detran diferentes com funções diferentes, mas estão relacionados. Os planos compilados (em cache) em sys.dm_exec_cached_plansjunções sys.dm_os_memory_objectsna memory_object_addresscoluna. O motivo de postar as perguntas aqui, é que estou pedindo ajuda sobre isso, entendendo como interpretar os DMVs e suas colunas.

Se size_in_bytesfor o tamanho do plano em cache, por que o SQL Server informa outro valor no plano de execução real?

Nova consulta, novos números:

  • Plano real
    • Tamanho do plano em cache 16 KB
    • CompileMemory 96KB
  • Detran:
    • sys.dm_exec_cached_plans.size_in_bytes24 KB
    • sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes16 KB.

Além disso, observe que esta consulta não requer nenhuma concessão de memória adicional para classificações e operações de hash.

Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
sql-server sql-server-2012
  • 2 2 respostas
  • 5894 Views

2 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2016-06-17T23:58:47+08:002016-06-17T23:58:47+08:00

    A razão pela qual o size_in_bytescampo do sys.dm_exec_cached_plansDMV, pelo menos em termos de "Planos Compilados", é maior que o CachedPlanSizeatributo do QueryPlannó no plano XML é porque um Plano Compilado não é a mesma coisa que um Plano de Consulta. Um Plano Compilado é composto por vários Objetos de Memória, cujo tamanho combinado equivale ao size_in_bytescampo. Portanto, a descrição de " Número de bytes consumidos pelo objeto de cache " que você encontrou na documentação é precisa; é apenas que é fácil interpretar mal o que significa "objeto de cache" dado o nome do DMV e que o termo "plano" tem vários significados.

    Um Plano Compilado é um contêiner que contém várias informações relacionadas ao lote de consulta (ou seja, não apenas uma única instrução), uma (ou mais) dessas partes sendo o(s) plano(s) de consulta. Os planos compilados têm um objeto de memória de nível superior de MEMOBJ_COMPILE_ADHOC, que é a linha sys.dm_os_memory_objectsvinculada por meio do memory_object_addresscampo em ambos os DMVs. Este objeto de memória contém a tabela de símbolos, coleção de parâmetros, links para objetos relacionados, cache do acessador, cache de metadados TDS e possivelmente alguns outros itens. Planos compilados são compartilhados entre Sessões/Usuários que estão executando o mesmo lote com as mesmas configurações de Sessão. No entanto, alguns objetos relacionados não são compartilhados entre sessões/usuários.

    Planos compilados também possuem um ou mais objetos dependentes que podem ser encontrados passando o plan_handle(in sys.dm_exec_cached_plans) para o sys.dm_exec_cached_plan_dependent_objectsDMF. Existem dois tipos de objetos dependentes: Plano Executável (Objeto de Memória = MEMOBJ_EXECUTE ) e Cursor (Objeto de Memória = MEMOBJ_CURSOREXEC ). Haverá 0 ou mais objetos Cursor, um para cada cursor. Haverá também um ou mais objetos de Plano Executável, um para cada Usuário executando o mesmo lote , portanto Planos Executáveis ​​não sãocompartilhada entre os usuários. Planos executáveis ​​contêm parâmetros de tempo de execução e informações de variáveis ​​locais, estado de tempo de execução, como a instrução atualmente em execução, IDs de objeto para objetos criados em tempo de execução (suponho que isso se refira a variáveis ​​de tabela, tabelas temporárias, procedimentos armazenados temporários etc.) , e possivelmente outros itens.

    Cada instrução em um lote de várias instruções está contida em uma instrução compilada (objeto de memória = MEMOBJ_STATEMENT ). O tamanho de cada instrução compilada (ou seja, pages_in_bytes) dividido por 1024 deve corresponder aos CachedPlanSize="xx"valores dos <QueryPlan>nós no plano XML. As instruções compiladas geralmente têm um (possivelmente mais?) Planos de consulta de tempo de execução associados (objeto de memória = MEMOBJ_XSTMT ). Por fim, para cada plano de consulta em tempo de execução que seja uma consulta, deve haver um contexto de execução de consulta associado (objeto de memória = MEMOBJ_QUERYEXECCNTXTFORSE ).

    Com relação às instruções compiladas, os lotes de instrução única não têm objetos separados de instrução compilada (ou seja, MEMOBJ_STATEMENT ) ou plano de consulta de tempo de execução (ou seja, MEMOBJ_XSTMT ). O valor para cada um desses objetos será armazenado no objeto Plano Compilado principal (ou seja , MEMOBJ_COMPILE_ADHOC ) e, nesse caso, o pages_in_bytesvalor desse objeto principal dividido por 1024 deve corresponder ao CachedPlanSizetamanho no <QueryPlan>nó do plano XML. Esses valores não serão iguais, no entanto, em lotes de várias instruções.


    O size_in_bytesvalor pode ser derivado somando as entradas no sys.dm_os_memory_objectsDMV (os itens anotados acima em negrito), todos relacionados dm_os_memory_objects.page_allocator_addresspara esse Plano Compilado. O truque para obter o valor correto é primeiro obter o memory_object_addressfrom sys.dm_exec_cached_planspara um plano compilado específico e, em seguida, usá-lo para obter a linha MEMOBJ_COMPILE_ADHOCsys.dm_os_memory_objects correspondente com base em seu memory_object_addresscampo. Em seguida, pegue o page_allocator_addressvalor sys.dm_os_memory_objectsdessa linha e use-o para pegar todas as linhas sys.dm_os_memory_objectsque tenham o mesmo page_allocator_addressvalor. (Observe que esta técnica não funciona para os outros tipos de objetos em cache: Parse Tree , Extended Proc , CLR Compiled Proc e CLR Compiled Func.)

    Usando o memory_object_addressvalor obtido de sys.dm_exec_cached_plans, você pode ver todos os componentes do Plano Compilado por meio da seguinte consulta:

    DECLARE @CompiledPlanAddress VARBINARY(8) = 0x00000001DC4A4060;
    
    SELECT obj.memory_object_address, obj.pages_in_bytes, obj.type
    FROM   sys.dm_os_memory_objects obj
    WHERE  obj.page_allocator_address = (
                                   SELECT planobj.page_allocator_address
                                   FROM   sys.dm_os_memory_objects planobj
                                   WHERE  planobj.memory_object_address = @CompiledPlanAddress
                                  )
    ORDER BY obj.[type], obj.pages_in_bytes;
    

    A consulta abaixo lista todos os Planos compilados sys.dm_exec_cached_plansjunto com o Plano de consulta e as instruções para cada lote. A consulta diretamente acima é incorporada à consulta abaixo via XML como o MemoryObjectscampo:

    SELECT cplan.bucketid,
           cplan.pool_id,
           cplan.refcounts,
           cplan.usecounts,
           cplan.size_in_bytes,
           cplan.memory_object_address,
           cplan.cacheobjtype,
           cplan.objtype,
           cplan.plan_handle,
           '---' AS [---],
           qrypln.[query_plan],
           sqltxt.[text],
           '---' AS [---],
           planobj.pages_in_bytes,
           planobj.pages_in_bytes / 1024 AS [BaseSingleStatementPlanKB],
           '===' AS [===],
           cplan.size_in_bytes AS [TotalPlanBytes],
           bytes.AllocatedBytes,
           (SELECT CONVERT(VARCHAR(30), obj.memory_object_address, 1)
                   AS [memory_object_address], obj.pages_in_bytes, obj.[type]
                   --,obj.page_size_in_bytes
            FROM   sys.dm_os_memory_objects obj
            WHERE  obj.page_allocator_address = planobj.page_allocator_address
            FOR XML RAW(N'object'), ROOT(N'memory_objects'), TYPE) AS [MemoryObjects]
    FROM   sys.dm_exec_cached_plans cplan
    OUTER APPLY sys.dm_exec_sql_text(cplan.[plan_handle]) sqltxt
    OUTER APPLY sys.dm_exec_query_plan(cplan.[plan_handle]) qrypln
    INNER JOIN sys.dm_os_memory_objects planobj
            ON planobj.memory_object_address = cplan.memory_object_address
    OUTER APPLY (SELECT SUM(domo.[pages_in_bytes]) AS [AllocatedBytes]
                 FROM   sys.dm_os_memory_objects domo
                 WHERE  domo.page_allocator_address = planobj.page_allocator_address) bytes
    WHERE  cplan.parent_plan_handle IS NULL
    AND    cplan.cacheobjtype IN (N'Compiled Plan', N'Compiled Plan Stub')
    --AND cplan.plan_handle = 0x06000D0031CD572910529CE001000000xxxxxxxx
    ORDER BY cplan.objtype, cplan.plan_handle;
    

    Observe que:

    • o TotalPlanBytescampo é apenas uma reafirmação do sys.dm_exec_cached_plans.size_in_bytescampo,
    • o AllocatedBytescampo é a SOMA dos objetos de memória relacionados que normalmente correspondem TotalPlanBytes(ou seja size_in_bytes)
    • o AllocatedBytescampo ocasionalmente será maior que TotalPlanBytes(ou seja size_in_bytes, ) devido ao aumento do consumo de memória durante a execução. Isso parece acontecer principalmente devido à recompilação (que deve ser evidente com o usecountscampo mostrando 1)
    • o BaseSingleStatementPlanKBcampo deve corresponder ao CachedPlanSizeatributo do QueryPlannó no XML, mas somente ao usar um único lote de consulta.
    • para lotes com várias consultas, deve haver linhas marcadas como MEMOBJ_STATEMENTem sys.dm_os_memory_objects, uma para cada consulta. O pages_in_bytescampo dessas linhas deve corresponder aos <QueryPlan>nós individuais do plano XML.

    Recursos:

    • Quais são os diferentes objetos em cache no cache do plano?
    • 1.0 Estrutura do Cache do Plano e Tipos de Objetos em Cache
    • 2.0 Sql_Handle e Plan_Handle explicados
    • Documentação para sys.dm_exec_cached_plans
    • Documentação para sys.dm_os_memory_objects
    • Documentação para sys.dm_exec_sql_text
    • Documentação para sys.dm_exec_query_plan
    • 13
  2. Ali varzeshi
    2020-03-28T02:48:22+08:002020-03-28T02:48:22+08:00

    O Pro SQL Server Internals examinou esse problema.

    dbcc freeproccache
    GO
    DECLARE
    @SQL nvarchar (MAX)
    ,@I INT = 0
    while @I < 1000
    BEGIN
        SELECT @SQL = N'declare @C int;select @C=ID from dbo.Employees where ID='
               + CONVERT (nvarchar (10), @I);
    
        EXEC (@SQL);
        SELECT @I += 1;
    END
    GO
    
    
    SELECT
    p.usecounts, p.cacheobjtype, p.objtype, p.size_in_bytes, t.[text]
    FROM
    sys.dm_exec_cached_plans p CROSS apply
    sys.dm_exec_sql_text (p.plan_handle) t
    WHERE
    p.cacheobjtype LIKE 'Compiled Plan%' AND
    t.[text] LIKE '%Employees%'
    ORDER BY
    p.objtype DESC;
    

    existem 1.000 planos armazenados em cache, cada um dos quais usa 32 KB de memória ou 32 MB no total. Como você pode imaginar , consultas ad-hoc em sistemas ocupados podem levar ao uso excessivo de memória cache do plano.

    exec sys.sp_configure N'optimize for ad hoc workloads', N'1';
    reconfigure with override;
    

    com a configuração Otimizar para cargas de trabalho ad hoc habilitada, você veria o conteúdo do cache do plano. Como você pode ver, agora ele usa apenas 272 KB de memória, em vez dos 32 MB que usava antes

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

    • 1

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