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 / 258014
Accepted
J.D.
J.D.
Asked: 2020-01-23 15:49:41 +0800 CST2020-01-23 15:49:41 +0800 CST 2020-01-23 15:49:41 +0800 CST

Geralmente, é mais rápido selecionar em uma tabela temporária do que selecionar em uma tabela real?

  • 772

Eu pensei ter lido em algum lugar que escrever no tempdb é mais rápido do que uma tabela real que não está no tempdb. Isso é verdade em qualquer capacidade? Eu pensei que me lembro de dizer algo especial sobre tempdb e armazenar os dados na memória?

sql-server sql-server-2016
  • 2 2 respostas
  • 5728 Views

2 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2020-01-23T17:13:28+08:002020-01-23T17:13:28+08:00

    escrever no tempdb é mais rápido do que uma tabela real que não está no tempdb

    É verdade. Há dois aprimoramentos de E/S no TempDb.

    Gravações em uma tabela em um banco de dados de usuário devem ter seus registros de log liberados no disco na confirmação ou, se uma inserção minimamente registrada (como SELECT ... INTO), deve ter as páginas do banco de dados liberadas no disco na confirmação. A maneira como o log mínimo funciona em um banco de dados do usuário é que as páginas do banco de dados são gravadas diretamente no disco. Quando o SELECT ... INTO for concluído, as novas páginas foram todas gravadas nos arquivos físicos.

    As gravações de TempDb não precisam ser liberadas no disco na confirmação, pois o TempDb nunca é recuperado após uma falha. Então eles simplesmente não são. Suas alterações geram registros de log, mas o buffer de log é liberado para o disco somente quando está cheio, não para cada confirmação.

    E desde o SQL Server 2014 , as inserções minimamente registradas no TempDb nem sempre são gravadas em disco. Se você carregar uma tabela temporária pequena e de curta duração, ela pode nunca ser gravada no disco. O log terá alguns registros sobre as alocações de página e entradas de metadados para a tabela, mas é isso.

    EG execute o seguinte lote em tempdb, um banco de dados de recuperação completo e um banco de dados de recuperação simples para ver as diferenças.

    drop table if exists foo
    go
    declare @data bigint
    declare @log bigint 
    select @log = sum(case when type_desc = 'LOG' then num_of_bytes_written end) 
          ,@data =  sum(case when type_desc = 'ROWS' then num_of_bytes_written end) 
    from sys.database_files f
    cross apply sys.dm_io_virtual_file_stats(db_id(),f.file_id) fs
    
    select * 
    into foo
    from sys.objects 
    
    select -@log + sum(case when type_desc = 'LOG' then num_of_bytes_written end)  log_bytes
          ,-@data +  sum(case when type_desc = 'ROWS' then num_of_bytes_written end) data_bytes
          , (select recovery_model_desc from sys.databases where database_id = db_id()) recovery_model
    from sys.database_files f
    cross apply sys.dm_io_virtual_file_stats(db_id(),f.file_id) fs
    

    e você verá algo como:

    Para recuperação simples:

    log_bytes            data_bytes           recovery_model
    -------------------- -------------------- ---------------
    24576                16384                SIMPLE
    

    para recuperação total:

    log_bytes            data_bytes           recovery_model
    -------------------- -------------------- ---------------
    36864                0                    FULL
    

    e para tempdb:

    log_bytes            data_bytes           recovery_model
    -------------------- -------------------- ---------------
    0                    0                    SIMPLE
    

    Às vezes, para tempdb, você verá o buffer de log liberado:

    log_bytes            data_bytes           recovery_model
    -------------------- -------------------- ---------------
    61440                0                    SIMPLE
    
    • 56
  2. David Spillett
    2020-01-24T09:28:41+08:002020-01-24T09:28:41+08:00

    Além de gravar em tempdb, muitas vezes, nem todos os discos / redes de E/S atingidos, conforme estendido na resposta de David Browne , dependendo da sua configuração de E/S, você pode descobrir que, mesmo quando os dados são grandes o suficiente para serem enviados para o disco, ainda é mais rápido do que selecionar em uma tabela "normal":

    • O TempDB pode estar em unidades diferentes, portanto, tenha sua própria largura de banda de E/S. Isso é especialmente significativo com unidades giratórias em vez de SSDs. Ler e gravar no mesmo banco de dados (ou outro banco de dados nas mesmas unidades) envolverá mais movimentos de cabeça que adicionam mais latência de E/S e potencialmente limitam sua largura de banda de E/S efetiva. Copiar dados entre bancos de dados em diferentes unidades/matrizes não terá a mesma latência extra.

    • O TempDB pode até estar em uma mídia mais rápida que seu armazenamento principal. Talvez em unidades locais onde o armazenamento principal esteja na rede ou SSDs NVMe onde o armazenamento principal esteja em unidades tradicionais.

    Essas duas diferenças também podem ser vistas dentro do mesmo banco de dados se você usar vários grupos de arquivos para distribuir partes dos dados entre diferentes unidades/matrizes.

    O oposto também pode ser verdadeiro se você tiver vários bancos de dados que estão ativamente em uso. Como o TempDB é um recurso compartilhado, e as unidades/rede que o hospedam, podem estar sob mais carga do que os arquivos de dados para qualquer banco de dados individual.

    • 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

    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