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 / 203877
Accepted
Racer SQL
Racer SQL
Asked: 2018-04-14 06:18:07 +0800 CST2018-04-14 06:18:07 +0800 CST 2018-04-14 06:18:07 +0800 CST

Por que o SQL Server retorna algumas linhas enquanto ainda executa a consulta e às vezes não?

  • 772

Existem consultas em que quando clicamos em "executar", ele mostra algumas linhas e continua crescendo, mas a consulta ainda não terminou. No entanto, às vezes, ele espera até o final da consulta.

Por que isso acontece? Existe uma maneira de controlar isso?

sql-server ssms
  • 4 4 respostas
  • 9366 Views

4 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2018-04-14T06:34:13+08:002018-04-14T06:34:13+08:00

    A resposta, como sempre (tudo bem, na maioria das vezes), está no plano de execução.

    Existem certos operadores que exigem que todas as linhas cheguem a eles antes que possam começar a processá-las e transmiti-las downstream, por exemplo:

    • Hash Join (na construção da tabela de hash)
    • Correspondência de hash
    • Classificar (exceto fluxo de hash distinto)

    Eles são chamados de bloqueio ou operadores de parada e partida por causa disso, e geralmente são escolhidos quando o otimizador acha que terá que processar muitos dados para encontrar seus dados.

    Existem outros operadores que podem começar a transmitir ou transmitir imediatamente quaisquer linhas encontradas

    • Loops aninhados
    • Junções de mesclagem compatíveis com índice
    • Agregados de fluxo

    Quando as consultas começam a retornar dados imediatamente, mas não terminam imediatamente, geralmente é um sinal de que o otimizador escolheu um plano para localizar e retornar algumas linhas rapidamente usando operadores que têm um custo inicial menor.

    Isso pode acontecer devido a metas de linha introduzidas por você ou pelo otimizador.

    Isso também pode acontecer se um plano ruim for escolhido por algum motivo (falta de SARGability, sniffing de parâmetros, estatísticas insuficientes, etc.), mas isso exige mais pesquisas para descobrir.

    Para mais informações, confira o blog de Rob Farley aqui

    E a série de Paul White sobre gols de linha aqui , aqui , aqui e aqui .

    Deve-se notar também que, se você estiver falando sobre SSMS, as linhas só aparecem quando um buffer inteiro é preenchido, não apenas à toa.

    • 46
  2. Aaron Bertrand
    2018-04-14T06:35:35+08:002018-04-14T06:35:35+08:00

    Se eu entendi o que você está observando, é assim que o Management Studio renderiza linhas e tem pouco a ver com como o SQL Server retorna linhas. Na verdade, muitas vezes, quando você está retornando grandes resultados ao SSMS e tentando renderizá-los em uma grade, o SSMS não consegue acompanhar e o SQL Server acaba esperando que o aplicativo processe mais linhas. Nesse caso, você verá o SQL Server acumulando ASYNC_NETWORK_IOesperas.

    Você pode controlá-lo um pouco usando Resultados para Texto em vez de Resultados para Grade, pois o SSMS pode desenhar texto mais rápido do que grades, mas você provavelmente descobrirá que isso pode afetar a legibilidade dependendo do número de colunas e dos tipos de dados envolvidos. Ambos são afetados quando o SSMS decide realmente gravar os resultados nesse painel, o que depende de quão cheio está o buffer de saída.

    Quando você tem várias instruções e deseja forçar o buffer a renderizar os resultados de saída no painel de mensagens, você pode usar um pequeno truque de impressão entre as instruções:

    RAISERROR('', 0, 1) WITH NOWAIT;
    

    Mas isso não ajudará quando você estiver tentando fazer com que o SSMS renderize linhas mais rapidamente quando toda a saída for proveniente de uma única instrução.

    Mais diretamente, você pode controlá-lo limitando quantos resultados você está renderizando no SSMS. Muitas vezes vejo pessoas reclamando sobre quanto tempo leva para retornar um milhão de linhas à grade. O que diabos alguém vai fazer com um milhão de linhas em uma grade SSMS, eu não tenho ideia.

    Existem alguns hacks como OPTION (FAST 100), que otimizarão a recuperação das primeiras 100 linhas (ou quaisquer 100 linhas se não houver nenhuma externa ORDER BY), mas isso pode custar uma recuperação muito mais lenta para o restante das linhas e um plano que é mais ineficiente em geral, então não é realmente uma opção IMHO.

    • 14
  3. Alex Yu
    2018-04-15T05:24:08+08:002018-04-15T05:24:08+08:00

    Sua pergunta não é sobre o SQLServer em si, mas:

    • Servidor SQL
    • rede
    • SSMS como aplicativo cliente

    Existe uma maneira de controlar isso?

    Resposta curta :

    1. Tente sqlcmdem vez de ssmsou sqlcmd-mode dessms
    2. Verifique suas configurações de conexão e sessão

    Resposta longa :

    É claro! Mas não um - prob

    1. Execute sua consulta com sqlcmdou em sqlcmd-mode em ssms.
    2. Se você deseja excluir a função da rede - execute sua consulta no servidor com conexão de memória compartilhada.
    3. Se o desempenho da consulta for insatisfatório mesmo com a conexão de memória compartilhada - analise seus planos de execução. Se a consulta tiver um desempenho ruim na rede - ligue para o administrador de rede da rede para obter ajuda. Se sua consulta tiver um desempenho ruim apenas no SSMS - leia mais.
    4. Agora temos certeza de que os problemas estão no lado do cliente (ssms neste caso). Observe as configurações de conexão e sessão no SSMS. Não acredite na interface ssms e verifique com o SQL Profiler: encontre sua conexão spide obterá uma lista completa de configurações de sessão. Compare com as configurações da sqlcmdsessão. Se nada clicar - copie todas as configurações de sessão do criador de perfil em seu script de consulta, execute em sqlcmd-mode e alternando gradualmente as configurações, você encontrará o culpado.

    Boa sorte!

    • 1
  4. JimmyJames
    2018-04-14T08:19:48+08:002018-04-14T08:19:48+08:00

    Para adicionar à resposta de sp_BlitzErik, pegue o exemplo usando a NOT IN ()com uma sub-seleção. Para determinar se um item está no resultado da consulta aninhada, é (geralmente) necessário recuperar o resultado inteiro.

    Então, uma maneira fácil que encontrei para melhorar o desempenho de tais consultas é reescrevê-las como uma LEFT OUTER JOINcondição onde para o RIGHTlado é nulo (você pode inverter, é claro, mas quem usa RIGHT OUTER JOINS?). Isso permite que os resultados comecem a retornar imediatamente.

    • -2

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