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 / 44714
Accepted
ooutwire
ooutwire
Asked: 2013-06-18 13:03:48 +0800 CST2013-06-18 13:03:48 +0800 CST 2013-06-18 13:03:48 +0800 CST

Desanexar/Anexar ou Offline/Online Limpa o Cache do Buffer para um Banco de Dados Específico?

  • 772

Um amigo meu me disse hoje que, em vez de pular o SQL Server, eu poderia simplesmente desanexar e reanexar um banco de dados e essa ação limparia as páginas e os planos do banco de dados fornecidos do cache. Eu discordei e forneço minhas evidências abaixo. Se você discorda de mim ou tem uma refutação melhor, por favor, forneça-a.

Estou usando o AdventureWorks2012 nesta versão do SQL Server:

SELECIONE @@VERSÃO;
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Developer Edition (64 bits) no Windows NT 6.1 (Build 7601: Service Pack 1)

Tendo carregado o banco de dados, executo a seguinte consulta:

Em primeiro lugar, execute o script de engorda AW de Jonathan K encontrado aqui:

AW Engordar

----------------------
-- Passo 1: Coisas de Bpool?
----------------------
USE [AdventureWorks2012];
VAI

SELECIONE
     OBJECT_NAME(p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT(*) / 128 AS [tamanho do buffer (MB)]
   , COUNT(*) AS [buffer_count]
A PARTIR DE
     sys.allocation_units AS um
     INNER JOIN sys.dm_os_buffer_descriptors AS b
           ON a.allocation_unit_id = b.allocation_unit_id
     INNER JOIN sys.partitions AS p
           ON a.container_id = p.hobt_id
ONDE
     b.database_id = DB_ID()
     E p.object_id > 100
GRUPO POR
     p.object_id
   , p.index_id
ORDENAR POR
     buffer_count DESC;

O resultado é mostrado aqui: insira a descrição da imagem aqui

Desanexe e anexe novamente o banco de dados e, em seguida, execute novamente a consulta.

----------------------
-- Etapa 2: desanexar/anexar
----------------------
-- Destacar
USE [mestre]
VAI
EXEC master.dbo.sp_detach_db @dbname = N'AdventureWorks2012'
VAI

-- Anexar
USE [mestre];
VAI

CRIAR BANCO DE DADOS [AdventureWorks2012] ON
(
    FILENAME = N'C:\sql server\files\AdventureWorks2012_Data.mdf'
)
    ,
(
    FILENAME = N'C:\sql server\files\AdventureWorks2012_Log.ldf'
)
 PARA ANEXO;
VAI

O que está no bpool agora?

----------------------
-- Passo 3: Coisas de Bpool?
----------------------
USE [AdventureWorks2012];
VAI

SELECIONE
     OBJECT_NAME(p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT(*) / 128 AS [tamanho do buffer (MB)]
   , COUNT(*) AS [buffer_count]
A PARTIR DE
     sys.allocation_units AS um
     INNER JOIN sys.dm_os_buffer_descriptors AS b
           ON a.allocation_unit_id = b.allocation_unit_id
     INNER JOIN sys.partitions AS p
           ON a.container_id = p.hobt_id
ONDE
     b.database_id = DB_ID()
     E p.object_id > 100
GRUPO POR
     p.object_id
   , p.index_id
ORDENAR POR
     buffer_count DESC;

E o resultado: insira a descrição da imagem aqui

Todas as leituras são lógicas neste ponto?

--------------------------------
-- Etapa 4: somente leituras lógicas?
--------------------------------
USE [AdventureWorks2012];
VAI

DEFINIR ESTATÍSTICA IO ON;   
    SELECIONE * DE DatabaseLog;
    VAI
DEFINIR ESTATÍSTICA IO OFF;  

/*
(1597 linhas afetadas)
Tabela 'DatabaseLog'. Contagem de varredura 1, leituras lógicas 782, leituras físicas 0, leituras antecipadas 768, leituras lógicas lob 94, leituras físicas lob 4, leituras antecipadas lob 24.
*/  

E podemos ver que o buffer pool não foi totalmente destruído pelo desanexar/anexar. Parece que meu amigo estava errado. Alguém discorda ou tem um argumento melhor?

Outra opção é off-line e, em seguida, on-line do banco de dados. Vamos tentar isso.

--------------------------------
-- Passo 5: Offline/Online?
--------------------------------
ALTER DATABASE [AdventureWorks2012] DEFINIR OFFLINE;
VAI
ALTER DATABASE [AdventureWorks2012] DEFINIDO ONLINE;
VAI

----------------------
-- Passo 6: Coisas de Bpool?
----------------------
USE [AdventureWorks2012];
VAI

SELECIONE
     OBJECT_NAME(p.object_id) AS [ObjectName]
   , p.object_id
   , p.index_id
   , COUNT(*) / 128 AS [tamanho do buffer (MB)]
   , COUNT(*) AS [buffer_count]
A PARTIR DE
     sys.allocation_units AS um
     INNER JOIN sys.dm_os_buffer_descriptors AS b
           ON a.allocation_unit_id = b.allocation_unit_id
     INNER JOIN sys.partitions AS p
           ON a.container_id = p.hobt_id
ONDE
     b.database_id = DB_ID()
     E p.object_id > 100
GRUPO POR
     p.object_id
   , p.index_id
ORDENAR POR
     buffer_count DESC;

Parece que a operação offline/online funcionou muito melhor.

insira a descrição da imagem aqui

sql-server sql-server-2008-r2
  • 1 1 respostas
  • 1726 Views

1 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2013-06-18T17:03:27+08:002013-06-18T17:03:27+08:00

    Eu inicialmente pensei que você estava em algo aqui. A suposição de trabalho foi na linha de que talvez o buffer pool não tenha sido liberado imediatamente, pois requer "algum trabalho" para fazê-lo e por que se preocupar até que a memória seja necessária. Mas...

    Seu teste é falho.

    O que você está vendo no buffer pool são as páginas lidas como resultado da reanexação do banco de dados, não os restos da instância anterior do banco de dados.

    E podemos ver que o buffer pool não foi totalmente destruído pelo desanexar/anexar. Parece que meu amigo estava errado. Alguém discorda ou tem um argumento melhor?

    Sim. Você está interpretando physical reads 0como significando que não houve nenhuma leitura física

    Tabela 'DatabaseLog'. Contagem de varredura 1, leituras lógicas 782, leituras físicas 0, leituras antecipadas 768 , leituras lógicas lob 94, leituras físicas lob 4, leituras antecipadas lob 24.

    Conforme descrito no blog de Craig Freedman, o mecanismo sequencial de leitura antecipada tenta garantir que as páginas estejam na memória antes de serem solicitadas pelo processador de consultas, e é por isso que você vê zero ou uma contagem de leitura física abaixo do esperado relatada.

    Quando o SQL Server executa uma verificação sequencial de uma tabela grande, o mecanismo de armazenamento inicia o mecanismo de leitura antecipada para garantir que as páginas estejam na memória e prontas para verificação antes de serem necessárias para o processador de consulta. O mecanismo de leitura antecipada tenta ficar 500 páginas à frente da digitalização.

    Nenhuma das páginas necessárias para satisfazer sua consulta estava na memória até que a leitura antecipada as colocasse lá.

    Por que online/offline resulta em um perfil de pool de buffer diferente garante um pouco mais de investigação ociosa. @MarkSRasmussen pode nos ajudar com isso na próxima vez que ele nos visitar.

    • 9

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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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