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 / 165484
Accepted
philomathic_life
philomathic_life
Asked: 2017-02-25 14:41:47 +0800 CST2017-02-25 14:41:47 +0800 CST 2017-02-25 14:41:47 +0800 CST

Tabelas temporárias com índices não clusterizados, incluindo todas as colunas

  • 772

Background : Uma vez por dia são criadas várias tabelas temporárias que calculam uma variedade de valores agregados diferentes. Todos eles contêm o mesmo identificador exclusivo (o campo no qual eu faria uma PRIMARY KEY). Cada tabela tem cerca de 100 mil linhas com apenas 2 a 8 colunas. Vários JOINs e UNION ALLs são então feitos nas tabelas temporárias. Todos os campos em todas as tabelas temporárias são usados. Além disso, na maioria das vezes, todas as linhas também são usadas - na pior das hipóteses, metade das linhas é usada em algum lugar e a outra metade é usada em outro lugar. Quando a consulta é concluída, os resultados são salvos no disco para que as pessoas possam acessar os dados pelo resto do dia.

Pergunta : Qual das seguintes abordagens deve ser a melhor e mais rápida:

• Não possuem índices nas tabelas temporárias.

• Ter um índice clusterizado em todas as tabelas temporárias (por meio da declaração PRIMARY KEY no identificador exclusivo).

• Tenha um índice não clusterizado no identificador exclusivo e inclua as colunas restantes em todas as tabelas temporárias.

• Os dois últimos marcadores juntos.

Pensamentos : Ao executar as quatro opções simultaneamente, cada uma tinha um custo de consulta de 25% (relativo ao lote); no entanto, quando o primeiro marcador é executado, o plano de execução (na consulta SELECT) indica que devo criar um índice não clusterizado no identificador exclusivo, incluindo as colunas restantes para cada uma das tabelas temporárias.

Estou um pouco perplexo com isso. Se eu efetivamente usar todos os campos e linhas em todas as tabelas temporárias, por que isso sugeriria isso? Um heap ou um índice clusterizado não seria melhor?

Para mim, um heap minimizaria a sobrecarga na criação de um índice e na classificação dos dados; e como eu basicamente preciso de cada linha, não há mal nenhum em fazer uma varredura de tabela.

Um índice clusterizado, por outro lado, deve melhorar a tabela temporária que é criada por meio de um JOIN em duas das outras tabelas temporárias, bem como melhorar a consulta SELECT final que depende de JOINs e UNION ALLs.

Nota relacionada : Em uma tabela grande com 400 colunas e 70 milhões de linhas - não me pergunte por que temos uma quantidade absurda de colunas - uma consulta que pegou apenas a PRIMARY KEY foi ≈50 vezes mais rápida ao utilizar um índice não clusterizado não relevante sobre o índice agrupado.

Se alguém tiver alguma dica, agradeço.

sql-server sql-server-2014
  • 1 1 respostas
  • 1733 Views

1 respostas

  • Voted
  1. Best Answer
    Joe Obbish
    2017-02-25T17:52:03+08:002017-02-25T17:52:03+08:00

    Para resumir (e incluir algumas informações dos comentários), você tem um processo que é executado uma vez por dia no início da manhã que preenche várias tabelas temporárias de 100 mil linhas com 2 a 8 colunas cada. Esta é uma pergunta ampla, mas minha reação inicial seria criar chaves primárias em todas as tabelas. Se o desempenho for bom o suficiente, então eu ficaria satisfeito. Se o desempenho não for bom o suficiente, eu investigaria mais para encontrar maneiras de melhorar o código. A remoção das chaves primárias seria tecnicamente uma opção, mas em geral eu esperaria encontrar ganhos de desempenho alterando as consultas que preenchem as tabelas temporárias.

    Um heap é uma tabela sem um índice clusterizado. Observe que uma chave primária não precisa ser definida da mesma forma que um índice clusterizado. Na verdade, você pode definir um heap com uma chave primária. Até onde eu sei, isso não é uma coisa muito comum de se fazer. Existem algumas vantagens em usar heaps para sua carga de trabalho:

    1. A inserção dos dados não levará a uma classificação. Se você inserir 100 mil linhas em uma tabela com um índice clusterizado, é possível que os dados precisem ser classificados de acordo com a consulta que preenche a tabela. Todas as colunas ou apenas a chave de clustering podem ser incluídas na classificação.
    2. A partir do SQL Server 2014, a inserção pode ser executada em paralelo se você usar a SELECT INTOsintaxe. Observe que o otimizador de consulta pode optar por não usar inserções paralelas, dependendo de vários motivos, incluindo o tamanho estimado dos dados e as MAXDOPconfigurações.

    Em geral, eu não me preocuparia com uma espécie de 100 mil linhas, especialmente se esse processo for executado no início da manhã sem mais nada. É improvável que as inserções paralelas sejam uma grande ajuda também para uma quantidade tão pequena de dados.

    Existem algumas desvantagens de usar heaps para essa carga de trabalho:

    1. Sem integridade de dados. Pode haver um bug em seu processo ou dados corrompidos que podem ter sido detectados anteriormente com uma chave primária nas tabelas temporárias.
    2. Os dados não são classificados, portanto, qualquer operador de plano de consulta que exija dados classificados (como um operador de junção de mesclagem ou inserção em uma tabela clusterizada) exigirá uma classificação explícita. Digamos que você faça referência a uma tabela em três consultas e todas as três vezes que o otimizador de consulta classifica os dados. Por que não classificar os dados no disco no início para evitar essas três classificações nos planos de consulta?

    Difícil dizer mais sobre esses pontos porque não sei nada sobre o seu processo. É possível que suas consultas nas tabelas temporárias possam se beneficiar de um MERGE JOIN, mas duvido que faça uma grande diferença no seu volume.

    Agora vamos falar sobre tabelas com um índice clusterizado. Como afirmado anteriormente, um índice clusterizado não precisa corresponder à chave primária, mas assumirei o padrão mais comum, que é ambos iguais. É com isso que você acaba quando define um PRIMARY KEYinline como parte da definição da tabela.

    Existem algumas vantagens das tabelas com índices clusterizados para sua carga de trabalho:

    1. Integridade de dados!
    2. Os operadores do plano de consulta que se beneficiam de uma classificação podem já ter os dados classificados na ordem correta. Por exemplo, isso torna as junções de mesclagem mais atraentes, especialmente se você estiver obtendo todos os dados das tabelas envolvidas.
    3. O otimizador de consulta pode escolher um plano mais eficiente se souber que determinadas colunas são exclusivas. Um exemplo disso é que o SQL Server pode saber que as junções não são muitas para muitas, o que pode levar a estimativas de cardinalidade e custos mais precisos dos operadores de junção.

    Existem algumas desvantagens de tabelas com índices clusterizados para sua carga de trabalho:

    1. As inserções paralelas nas tabelas temporárias não estão disponíveis em nenhuma versão do SQL Server.
    2. O preenchimento das tabelas pode exigir uma classificação explícita.

    As vantagens e desvantagens são principalmente o oposto exato de uma tabela de heap, o que não deve ser surpreendente.

    A terceira e quatro opções não valem a pena considerar. Você pode criar um índice que inclua todas as colunas, mas duplicará os dados. Basta definir sua chave primária da maneira correta e você não deve usar um índice não clusterizado adicional que inclua todas as colunas. Observe que o SQL Server Management Studio não recomendará que você crie um índice clusterizado em uma tabela.

    Uma diferença entre o índice clusterizado/chave primária e o índice não clusterizado é que o índice clusterizado/primário não permitirá valores NULL nas colunas de chave e impõe automaticamente uma restrição de exclusividade. Obviamente, é possível criar um índice não clusterizado com as mesmas restrições.

    Em última análise, tudo o que você pode fazer é testar sua carga de trabalho com as diferentes opções. Portanto, não podemos dizer definitivamente qual abordagem será mais rápida. Com um conjunto de dados e consultas, a abordagem de heap pode ser mais rápida. Com um conjunto diferente de dados e consultas, a abordagem de tabela em cluster pode ser mais rápida. Não desconte o valor da integridade dos dados, mas você pode ter outras maneiras de impor a integridade dos dados.

    • 6

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