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 / 298835
Accepted
Mark Adam Proctor
Mark Adam Proctor
Asked: 2021-09-01 10:51:09 +0800 CST2021-09-01 10:51:09 +0800 CST 2021-09-01 10:51:09 +0800 CST

Como o otimizador trata tabelas #temp ainda não preenchidas ao estimar a cardinalidade?

  • 772

Eu tenho construído procedimentos armazenados e não consigo encontrar nenhuma documentação sobre como o otimizador do SQL Server lida com tabelas #temp.

Se eu tiver 4 junções a uma tabela #temp onde essa tabela #temp é criada DURANTE a execução do procedimento armazenado e a tabela #temp pode conter de zero a muitos registros, como isso é estimado?

Estima-se que seja tão grande quanto algumas das tabelas na junção, já que não há estatísticas no momento de CREATE/ALTER? Estima-se que seja pequeno? Estima-se que seja como outras mesas #temporárias?

Observe que isso está assumindo que não há recompilação no tempo de execução e que o original é usado.

sql-server temporary-tables
  • 2 2 respostas
  • 553 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2021-09-02T03:07:30+08:002021-09-02T03:07:30+08:00

    O SQL Server geralmente cria um conjunto completo de planos de execução para as instruções em um procedimento armazenado antes que o procedimento comece a ser executado.

    Essa abordagem é ligeiramente modificada quando as tabelas temporárias estão presentes:

    • A compilação de cada instrução que faz referência a uma tabela temporária é adiada até que a instrução seja realmente executada.
    • O SQL Server oferece suporte à recompilação em nível de instrução desde a versão 2005. Somente a(s) instrução(ões) afetada(s) é(ão) recompilada(s); o restante dos planos do procedimento não são afetados.
    • Compilação adiada significa que o SQL Server conhece a cardinalidade de tempo de execução da tabela temporária durante a otimização.
    • O SQL Server também pode criar estatísticas automaticamente para dar suporte à consulta que está sendo compilada. Isso acontece durante a compilação e, tecnicamente, resulta em uma recompilação.
    • O plano de execução construído, portanto, se beneficia de informações precisas de cardinalidade e objetos estatísticos criados automaticamente (se essa opção estiver ativada).

    Da documentação sobre Recompilando Planos de Execução :

    Nas versões do SQL Server anteriores a 2005, sempre que uma instrução em um lote causa recompilação, todo o lote, seja enviado por meio de um procedimento armazenado, gatilho, lote ad-hoc ou instrução preparada, era recompilado. A partir do SQL Server 2005 (9.x), somente a instrução dentro do lote que aciona a recompilação é recompilada. Além disso, há tipos adicionais de recompilações no SQL Server 2005 (9.x) e posterior devido ao seu conjunto de recursos expandido.

    A recompilação em nível de instrução beneficia o desempenho porque, na maioria dos casos, um pequeno número de instruções causa recompilações e suas penalidades associadas, em termos de tempo de CPU e bloqueios. Essas penalidades são, portanto, evitadas para as outras instruções no lote que não precisam ser recompiladas.

    e da Compilação Diferida de Variáveis ​​de Tabela :

    Com a compilação adiada de variável de tabela, a compilação de uma instrução que faz referência a uma variável de tabela é adiada até a primeira execução real da instrução. Esse comportamento de compilação adiada é idêntico ao comportamento de tabelas temporárias.


    Esse é o esboço básico, mas não toda a história.

    Como já apontado em outra resposta , tabelas temporárias em procedimentos armazenados também podem ser armazenadas em cache para reutilização . Esse armazenamento em cache pode melhorar significativamente o desempenho e a escalabilidade, mas complica as condições para recompilação do plano e como as informações estatísticas são mantidas.

    Descrevo essas complexidades adicionais para o leitor interessado (e avançado) em Cache de Tabela Temporária Explicado e Cache de Tabela Temporária em Procedimentos Armazenados .

    • 13
  2. Hannah Vernon
    2021-09-01T11:11:12+08:002021-09-01T11:11:12+08:00

    Grosso modo, as estimativas de cardinalidade para a criação de estatísticas em tabelas #temp seguem as de tabelas regulares e não temporárias. Dito isto, como Paul White aponta aqui , tabelas temporárias dentro de procedimentos armazenados podem sofrer com valores de estatísticas em cache.

    Na página acima, a conclusão mais importante é:

    Tabelas temporárias em procedimentos armazenados têm várias características inesperadas:

    • Objetos temporários podem ser armazenados em cache nas execuções, apesar das instruções CREATE e DROP explícitas
    • As estatísticas associadas a um objeto temporário em cache também são armazenadas em cache
    • As estatísticas podem estar 100% erradas em comparação com o conteúdo atual de uma tabela temporária
    • Uma TRUNCATE TABLE implícita no final do procedimento dobra o impacto esperado nos contadores de modificação de coluna
    • É possível atualizar as estatísticas em cache antes da instrução que fez com que elas fossem criadas
    • OPTION (RECOMPILE) altera a maneira como as modificações de coluna são transportadas entre as chamadas de procedimento
    • UPDATE STATISTICS manual não é suficiente para forçar uma recompilação

    Sugiro dar uma olhada no post para entender completamente como você pode ser afetado pelo cache de tabela temporária.

    • 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