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 / 482
Accepted
BradC
BradC
Asked: 2011-01-11 12:48:48 +0800 CST2011-01-11 12:48:48 +0800 CST 2011-01-11 12:48:48 +0800 CST

Como posso saber POR QUE uma inserção em uma determinada tabela é lenta?

  • 772

Eu sei que um INSERT em uma tabela SQL pode ser lento por vários motivos:

  • Existência de INSERT TRIGGERs na mesa
  • Muitas restrições impostas que precisam ser verificadas (geralmente chaves estrangeiras)
  • A página é dividida no índice clusterizado quando uma linha é inserida no meio da tabela
  • Atualizando todos os índices não clusterizados relacionados
  • Bloqueio de outras atividades na mesa
  • Tempo de resposta de gravação de E/S ruim
  • ... alguma coisa que eu perdi?

Como posso saber qual é o responsável no meu caso específico? Como posso medir o impacto das divisões de página em relação às atualizações de índice não clusterizadas em relação a todo o resto?

Eu tenho um proc armazenado que insere cerca de 10.000 linhas por vez (de uma tabela temporária), o que leva cerca de 90 segundos por 10 mil linhas. Isso é inaceitavelmente lento, pois faz com que outros spids expirem.

Examinei o plano de execução e vejo a tarefa INSERT CLUSTERED INDEX e todas as INDEX SEEKS das pesquisas FK, mas ainda não me diz com certeza por que demora tanto. Nenhum gatilho, mas a tabela tem um punhado de FKeys (que parecem estar indexadas corretamente).

Este é um banco de dados SQL 2000.

sql-server insert
  • 5 5 respostas
  • 68893 Views

5 respostas

  • Voted
  1. Best Answer
    mrdenny
    2011-01-11T12:56:35+08:002011-01-11T12:56:35+08:00

    Algumas coisas que você pode ver...

    Reduza o tamanho do lote de 10.000 para algo menor, como 2.000 ou 1.000 (você não disse o tamanho da linha).

    Tente ativar o IO Stats para ver a quantidade de IO que as pesquisas FK estão recebendo.

    Qual é a espera causada quando a inserção está acontecendo (master.dbo.sysprocesses)?

    Vamos começar aqui e ver para onde vamos.

    • 11
  2. SQLRockstar
    2011-01-11T14:02:57+08:002011-01-11T14:02:57+08:00

    Brad,

    Você deve examinar as estatísticas de espera para sua consulta. Com o SQL2000, você pode usar a sintaxe DBCC SQLPERF("waitstats") para obter esses detalhes.

    • 7
  3. yrushka
    2011-01-29T01:13:06+08:002011-01-29T01:13:06+08:00

    Posso dizer o que estou procurando ao analisar o desempenho de uma consulta. Talvez ajude.

    • analise o plano de execução da consulta e verifique se há varreduras de índice, varreduras de tabela, uso de funções convert_implicit para tipos de dados sql, paralelismo.
    • execute a consulta com SET STATISTICS IO ON e SET STATISTICS TIME ON para ver o tempo de execução e ler/gravar io para cada inserção.
    • confira o tempo de espera de sysprocesses para seu spid de sessão.
    • execute o criador de perfil e selecione o modelo padrão. selecione o seguinte: Estatísticas de desempenho (se repetido, seu plano será compilado muitas vezes - não é bom), RPC:completed, SQL:batchcompleted e SQL:batchstarting. Adicione a eles a contagem de linhas da coluna para ver exatamente o número de linhas no lote. Filtre os resultados para ver apenas sua consulta.
    • finalmente colete o contador de expectativa de vida da página do windows perfmon e se estiver abaixo de 300 (5 min) então o SQL tem pouca memória. Também colete contadores de disco: comprimento da fila de disco , tempo de disco (sua unidade de arquivos de dados), tempo de disco (sua unidade de arquivos de log) para ver se há pressão nos discos.
    • 6
  4. Andrew Bickerton
    2011-01-28T15:43:22+08:002011-01-28T15:43:22+08:00

    Tente usar:

    SET STATISTICS IO ON
    

    e

    SET STATISTICS PROFILE ON
    

    ESTATÍSTICAS IO

    Pode ser útil para informar quais tabelas estão fazendo a maior quantidade de varreduras de tabela, leituras lógicas e leituras físicas (eu uso esses três para focar em qual parte do plano de consulta precisa de mais ajuste)

    PERFIL DE ESTATÍSTICAS

    Retornará principalmente o plano de consulta em um formato tabular, então você pode ver as colunas de E/S e CPU para saber o que está custando mais na consulta (é a verificação da tabela em sua tabela temporária versus a classificação que ela faz para inserir em seu chave agrupada, etc...)

    • 5
  5. MShNajar
    2022-09-19T05:03:28+08:002022-09-19T05:03:28+08:00

    Sugestões:

    1. Veja possíveis bloqueios em sua consulta no Activity Monitor
    2. Veja o plano de execução e as estatísticas de IO em sua consulta
    3. Índices e restrições (especialmente para muitos deles, como índices não clusterizados ou FKs) podem afetar o desempenho da inserção.
    4. Manter, mas reconstruir os índices necessários.
    5. Inserir uma linha de cada vez é realmente uma prática ruim com impactos negativos no desempenho, especialmente em bancos de dados ACID como o SQL Server. Faça Inserções em Lote!
    • 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

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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