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 / 187807
Accepted
user45867
user45867
Asked: 2017-10-06 13:57:06 +0800 CST2017-10-06 13:57:06 +0800 CST 2017-10-06 13:57:06 +0800 CST

As colunas não relevantes afetam o tempo de consulta de instruções select?

  • 772

Eu só estou curioso.

Digamos que você tenha uma tabela de 1 milhão de registros/linhas.

select order_value from store.orders

Faz diferença se essa tabela tem 1 campo, 2 campos ou 100 campos, em tempo real de consulta? Quero dizer todos os campos diferentes de "order_value".

Agora estou enviando dados para um data warehouse. Às vezes eu despejo campos na tabela que "podem ser usados ​​no futuro, algum dia" - mas eles não estão sendo consultados agora, por nada. Esses campos 'estranhos' afetariam as instruções select que não as incluem, direta ou indiretamente (não * quero dizer)?

sql-server performance
  • 2 2 respostas
  • 1110 Views

2 respostas

  • Voted
  1. ypercubeᵀᴹ
    2017-10-06T14:14:03+08:002017-10-06T14:14:03+08:00

    Depende, da estrutura da tabela e dos índices disponíveis.

    • Caso A: Tabela comum (rowstore), sem índice no (order_value).

      O único plano de execução possível é ler a tabela inteira (o que obviamente é muito diferente quando são 2 versus 200 colunas, portanto, alguns versus alguns milhares de bytes de largura).

    • Caso B: Tabela comum, há um índice (order_value)ou alguns outros índices que incluem essa coluna.

      Existe um plano melhor agora, escanear todo o índice (um deles) - que é obviamente muito mais estreito do que a tabela inteira, apenas alguns bytes. O que torna irrelevante se a tabela tiver 2 ou 200 colunas. Apenas o índice é verificado.

    • Caso C: É uma tabela columnstore.

      Como o nome indica, a estrutura dessas tabelas é orientada por colunas, não por linhas. Não há necessidade de nenhum índice, o próprio design da tabela é adequado para ler colunas inteiras.

    • 12
  2. Best Answer
    Erik Darling
    2017-10-06T14:14:57+08:002017-10-06T14:14:57+08:00

    Isso realmente depende de índices e tipos de dados.

    Usando o banco de dados Stack Overflow como exemplo, é assim que a tabela Users se parece:

    NOZES

    Tem um PK/CX na coluna Id. Portanto, é a totalidade dos dados da tabela classificados por Id.

    Com isso como o único índice, o SQL precisa ler tudo (sem as colunas LOB) na memória, se ainda não estiver lá.

    DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
    
    SET STATISTICS TIME, IO ON 
    
    SELECT u.Id
    INTO  #crap1
    FROM dbo.Users AS u
    

    O tempo de estatísticas e o perfil io são assim:

    Table 'Users'. Scan count 7, logical reads 80846, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
     SQL Server Execution Times:
       CPU time = 2406 ms,  elapsed time = 446 ms.
    

    Se eu adicionar um índice não clusterizado adicional em apenas Id

    CREATE INDEX ix_whatever ON dbo.Users (Id)
    

    Agora tenho um índice muito menor que satisfaz minha consulta.

    DBCC DROPCLEANBUFFERS-- Don't run this anywhere near prod.
    
    SELECT u.Id
    INTO  #crap2
    FROM dbo.Users AS u
    

    O perfil aqui:

    Table 'Users'. Scan count 7, logical reads 6587, physical reads 0, read-ahead reads 6549, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
     SQL Server Execution Times:
       CPU time = 2344 ms,  elapsed time = 384 ms.
    

    Podemos fazer muito menos leituras e economizar um pouco de tempo de CPU.

    Sem mais informações sobre sua definição de tabela, não posso tentar reproduzir melhor o que você está tentando medir.

    Mas você está dizendo que, a menos que haja um índice específico nessa coluna solitária, as outras colunas/campos também serão verificadas? Isso é apenas uma desvantagem inerente ao design de tabelas rowstore? Por que campos irrelevantes seriam verificados?

    Sim, isso é específico para tabelas rowstore. Os dados são armazenados pela linha nas páginas de dados. Mesmo que outros dados na página sejam irrelevantes para sua consulta, toda a linha > página > índice precisa ser lida na memória. Eu não diria que as outras colunas são "digitalizadas" tanto quanto as páginas em que existem são verificadas para recuperar o valor único relevante para a consulta.

    Usando o velho exemplo da lista telefônica: mesmo que você esteja apenas lendo números de telefone, quando você vira a página, você está virando sobrenome, nome, endereço etc. junto com o número de telefone.

    • 10

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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