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)?
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.
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:
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á.
O tempo de estatísticas e o perfil io são assim:
Se eu adicionar um índice não clusterizado adicional em apenas Id
Agora tenho um índice muito menor que satisfaz minha consulta.
O perfil aqui:
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.
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.