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 / 273264
Accepted
Jeremy Holovacs
Jeremy Holovacs
Asked: 2020-08-06 05:08:54 +0800 CST2020-08-06 05:08:54 +0800 CST 2020-08-06 05:08:54 +0800 CST

Faz sentido adicionar índices a uma tabela de índice columnstore clusterizado?

  • 772

A pergunta é semelhante a esta , mas a resposta não parece responder a esta pergunta.

Meu entendimento de uma tabela columnstore clusterizada (e, por favor, corrija-me se estiver errado) é que cada coluna é armazenada de alguma maneira fisicamente ordenada, o que implica que cada coluna já possui o que equivale a um índice clusterizado. Se fosse esse o caso, não faria muito sentido adicionar mais índices na tabela... ou faria? Talvez um índice composto?

Meu pensamento está correto sobre isso?

sql-server clustered-index
  • 2 2 respostas
  • 1830 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2020-08-06T05:32:53+08:002020-08-06T05:32:53+08:00

    Meu entendimento de uma tabela columnstore clusterizada (e corrija-me se estiver errado) é que cada coluna é armazenada de alguma maneira fisicamente ordenada ...

    Todas as colunas são classificadas na mesma ordem . Digo isso para distinguir de uma possível leitura de sua afirmação de que cada coluna está classificada da melhor maneira para aquela coluna, o que não é verdade.

    Cada coluna é codificada e compactada individualmente em um segmento dentro de cada grupo de linhas . A ordem das operações é:

    1. Codifique valores em todas as colunas (por exemplo, deslocamento de valor ou usando um dicionário).
    2. Determine a ordenação de linha única 'ótima'.
    3. Comprima cada coluna (por exemplo, RLE, pacote de bits).

    A ordem de classificação comum escolhida pode ser ótima para alguns segmentos, mas não para outros do ponto de vista da compactação (principalmente codificação de comprimento de execução). O SQL Server usa a tecnologia Vertipaq para escolher uma ordem de classificação que forneça um bom resultado geral de compactação.

    ...implicando que cada coluna já tem o que equivale a um índice clusterizado nela

    Esta não é a imagem mental correta porque os 'índices' de armazenamento de colunas não suportam buscas, apenas b-trees o fazem. O SQL Server pode localizar uma linha individual em um armazenamento de coluna para fins de pesquisa (como nas perguntas e respostas vinculadas), mas isso não é o mesmo que dar suporte a buscas de chave em geral.

    Demonstração de uma pesquisa em um índice columnstore clusterizado.

    Pesquisa de armazenamento de colunas em cluster

    A distinção é entre encontrar a linha #n no grupo de linhas #m versus encontrar linhas com um determinado valor 'x' para uma coluna específica. Um índice de armazenamento de colunas pode fazer o primeiro, mas não o último.

    Além disso, os índices b-tree podem retornar dados ordenados; índices de armazenamento de coluna não podem (devido à codificação) -- exceto para o caso trivial de uma pesquisa em que no máximo uma linha será retornada.

    Faz sentido adicionar índices a uma tabela de índice columnstore clusterizado?

    Índices b-tree adicionais fazem sentido quando precisamos localizar um único valor ou um pequeno intervalo de valores. A alternativa seria varrer o índice de armazenamento de colunas (embora com possível eliminação de grupo de linhas se as estrelas se alinharem corretamente - bem como eliminação de partição se a tabela for particionada).

    De forma mais geral, os índices b-tree suportam consultas do tipo OLTP; armazenamento de coluna é para análise. Fornecer ambos na mesma mesa permite uma abordagem híbrida (HTAP - Hybrid Transactional/Analytic Processing).

    Do Microsoft Research Paper Columnstore e da árvore B+ – Os designs físicos híbridos são importantes? (PDF):

    As árvores B+ superam as colunas de armazenamento quando os predicados de consulta são seletivos mesmo quando todos os dados são residentes na memória; e a troca muda ainda mais em favor das árvores B+ quando os dados não são residentes na memória. Da mesma forma, as árvores B+ podem ser uma opção melhor para fornecer dados em ordem ordenada quando a memória do servidor é restrita. Por outro lado, os columnstores geralmente são uma ordem de magnitude mais rápidos para grandes varreduras, independentemente de os dados serem ou não residentes na memória. Para atualizações, as árvores B+ são significativamente mais baratas. Os armazenamentos de colunas secundárias incorrem em um custo de atualização muito menor em comparação com os índices de armazenamentos de colunas primários, mas ainda são muito mais lentos do que as árvores B+. Este estudo empírico indica que, para determinadas cargas de trabalho, os designs físicos híbridos podem fornecer ganhos de desempenho significativos.

    • 16
  2. Joe Obbish
    2020-08-12T20:24:44+08:002020-08-12T20:24:44+08:00

    Pode fazer sentido fazê-lo, sim. Às vezes, um requisito de negócios precisará ser aplicado por meio de uma chave primária ou uma restrição exclusiva. Ambos resultam em um índice subjacente em uma tabela com um índice columnstore clusterizado.

    Um índice columnstore clusterizado não é uma boa estrutura de dados para alguns tipos de consultas. Exemplos em que um desempenho extremamente ruim é possível incluem agregação de cadeia de caracteres no SQL Server 2016 , consultas recursivas e junções sem uma condição de igualdade. De maneira mais geral, qualquer consulta que exija uma pesquisa rápida de uma pequena quantidade de dados de uma tabela pode não obter o melhor desempenho apenas de um índice columnstore clusterizado. É verdade que a eliminação de rowgroup às vezes pode levar a um desempenho semelhante em relação a um índice não clusterizado, mas isso requer o carregamento dos dados em uma determinada ordem e nem todos os tipos de dados são suportados.

    Há desvantagens na criação de índices não clusterizados em tabelas com um índice columnstore clusterizado. A inserção paralela não está mais disponível, os índices ocupam espaço de armazenamento adicional e o SQL Server terá menos opções para ordem de compactação em alguns cenários.

    Na minha experiência, descobri que é melhor definir uma barra mais alta do que o normal ao considerar adicionar um índice não clusterizado a uma tabela com um índice columnstore clusterizado. Se você realmente precisa, tente adicioná-lo, mas mantenha as desvantagens em mente.

    • 1

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