Por que os bancos de dados não criam seus próprios índices automaticamente?


32

Eu pensaria que os bancos de dados saberiam o suficiente sobre o que encontram com frequência e seriam capazes de responder às demandas sob as quais foram submetidos, para decidirem adicionar índices a dados altamente solicitados.


3
Seu carro conserta automaticamente seu próprio pneu furado?
Kermit

11
uma analogia mais precisa: sua ECU altera a energia fornecida à bomba de combustível para fixar as taxas de fluxo de combustível / óleo e compensar as linhas sujas? a que a resposta é sim ..
Jharwood

11
Um banco de dados já pode colocar um índice em uma tabela que atualmente exige que o comando seja feito; um carro não pode substituir fisicamente um pneu, até que construamos alguns braços para usá-lo.
precisa saber é o seguinte

1
Eles fazem - para colunas que têm UNIQUErestrições.
dan04

8
Se você pesquisar no Google "bancos de dados de autoajuste", encontrará muitas pesquisas sobre isso. Talvez no futuro seja comum ter algum elemento disso.
Martin Smith

Respostas:


25

Atualizar

Agora isso é implementado no SQL Server Azure. Gera recomendações

insira a descrição da imagem aqui

e o gerenciamento de índice pode ser configurado para ser automático .

Ativar gerenciamento automático de índice

Você pode definir o SQL Database Advisor para implementar recomendações automaticamente. À medida que as recomendações estiverem disponíveis, elas serão aplicadas automaticamente. Como em todas as operações de índice gerenciadas pelo serviço, se o impacto no desempenho for negativo, a recomendação será revertida.

Resposta original

Alguns bancos de dados já (meio que) criam índices automaticamente.

Às vezes, no SQL Server, o plano de execução pode incluir um operador Index Spool , em que o RDBMS cria dinamicamente uma cópia indexada dos dados. No entanto, esse spool não é uma parte persistente do banco de dados mantida em sincronia com os dados de origem e não pode ser compartilhado entre as execuções de consultas, o que significa que a execução desses planos pode acabar criando e descartando repetidamente índices temporários nos mesmos dados.

Talvez no futuro, os RDBMSs tenham a capacidade de eliminar dinamicamente e criar índices persistentes de acordo com a carga de trabalho.

O processo de otimização do índice é, no final, apenas uma análise de custo-benefício. Embora seja verdade que os humanos possam ter mais informações sobre a importância relativa de consultas em uma carga de trabalho, em princípio, não há razão para que essas informações não possam ser disponibilizadas ao otimizador. O SQL Server já possui um administrador de recursos que permite que as sessões sejam classificadas em diferentes grupos de carga de trabalho com diferentes alocações de recursos, de acordo com a prioridade.

As DMVs de índice ausentes mencionadas por Kenneth não devem ser implementadas às cegas, pois consideram apenas os benefícios de uma consulta específica e não tentam levar em conta o custo do índice em potencial para outras consultas. Também não consolida índices ausentes semelhantes. por exemplo, a saída deste DMV pode relatar índices ausentes A,B,CeA,B INCLUDE(C)

Alguns problemas atuais com a ideia são

  • A qualidade de qualquer análise automatizada que realmente não crie o índice dependerá muito da precisão do modelo de custo.
  • Mesmo no campo da análise automatizada, uma solução offline poderá ser mais completa do que uma solução on-line, pois é imperativo que uma solução on-line não adicione sobrecarga de manutenção de livros grandes ao servidor ativo e interfira em seu objetivo principal de executar consultas.
  • Os índices criados automaticamente em resposta à carga de trabalho serão necessariamente criados em resposta a consultas que os considerariam úteis, ficando atrás das soluções que criam os índices antecipadamente.

Provavelmente, é razoável esperar que a precisão dos modelos de custeio melhore ao longo do tempo, mas o ponto 2 parece mais difícil de resolver e o ponto 3 é inerentemente insolúvel.

No entanto, provavelmente a grande maioria das instalações não está nessa situação idealizada com uma equipe qualificada que monitora, diagnostica e antecipa continuamente (ou pelo menos reage a) mudanças nas cargas de trabalho.

O projeto AutoAdmin da Microsoft Research está em execução desde 1996

O objetivo deste projeto é tornar o auto-ajuste e a auto-administração dos bancos de dados, explorando o conhecimento da carga de trabalho

A home page do projeto lista vários projetos intrigantes. Um é particularmente relevante para a questão aqui

Outro problema interessante surge quando não há DBA disponível (por exemplo, um banco de dados incorporado ou uma pequena empresa). Nesses cenários, uma abordagem de ajuste contínuo de índice de baixo toque pode se tornar importante. Nós exploramos soluções ... [no] " Uma abordagem on-line para o ajuste do design físico " no ICDE 2007.

Os autores declaram

Com recursos DBMS cada vez mais comuns, como índices on-line, é atraente explorar soluções mais automáticas para o problema de design físico que avançam no estado da arte.

O artigo apresenta um algoritmo

Suas principais características são:

  • À medida que as consultas são otimizadas, identificamos um conjunto relevante de índices de candidatos que melhorariam o desempenho. Esse recurso permite que o processamento de consultas continue paralelamente aos índices criados em segundo plano.
  • No momento da execução, rastreamos os benefícios potenciais que perdemos por não ter esses índices candidatos e também a utilidade dos índices existentes na presença de consultas, atualizações e restrições de espaço.
  • Depois de reunirmos “evidências” suficientes de que uma alteração no projeto físico é benéfica, acionamos automaticamente criações ou exclusões de índices.
  • A natureza on-line do nosso problema implica que geralmente ficaremos atrás das soluções ideais que conhecem o futuro. No entanto, medindo cuidadosamente as evidências, asseguramos que não soframos decisões "tardias" de forma significativa, limitando assim o valor da perda incorrida.

A implementação do algoritmo permite a otimização em resposta a alterações na carga do servidor e também pode abortar a criação de índice se durante a criação a carga de trabalho mudar e o benefício esperado cair abaixo do ponto que é considerado valioso.

A conclusão dos autores sobre o tópico Online versus o ajuste físico tradicional.

Os algoritmos on-line neste trabalho são úteis quando os DBAs são incertos sobre o comportamento futuro da carga de trabalho ou não têm possibilidade de fazer uma análise ou modelagem abrangente. Se um DBA tiver informações completas sobre as características da carga de trabalho, uma análise e implantação estática das ferramentas existentes (por exemplo, [2, 3]) seria uma alternativa melhor.

As conclusões aqui são semelhantes às de outro artigo Sintonia de índices orientada a consultas autônoma

Nossa abordagem não pode superar o orientador de índice se toda a carga de trabalho for conhecida antecipadamente. No entanto, em ambientes dinâmicos com cargas de trabalho em evolução e alterações, a abordagem orientada a consultas produz melhores resultados.


4
É incrivelmente perigoso para a carreira de um DBA assumir que sua habilidade nunca pode ser automatizada. Isso está matando as carreiras dos caras da rede agora, já que a mudança é para data centers definidos por software. Como bons DBAs, devemos liderar o esforço de automação.
Gaius

20

O design do índice que você cria é algo mais artístico do que científico. O RDBMS não é inteligente o suficiente para receber cargas de trabalho comuns e projetar uma estratégia de indexação inteligente. Cabe à intervenção humana (leia-se: DBA) analisar a carga de trabalho e determinar qual é a melhor abordagem.

Se não houvesse penalidade em ter índices, seria uma abordagem de espingarda adicionar apenas um número infinito de índices. Mas como a modificação de dados (INSERTS, UPDATES e DELETES) tem impacto nos índices ativados em uma tabela, haverá uma sobrecarga variável desses índices.

É preciso um design e estratégia humanos para criar índices inteligentes que maximizem o desempenho da leitura, mantendo a menor quantidade de sobrecarga de modificação de dados.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Paul White diz GoFundMonica

13

De fato, existem alguns bancos de dados que fazem isso. Por exemplo, o BigTable do Google e o SimpleDB da Amazon criam automaticamente índices (embora os RDBMS também não sejam) . Também há pelo menos um mecanismo MySQL RDBMS que faz isso. O SQL Server também rastreia os índices que acha que você deve criar , embora não chegue ao ponto de realmente criá-los.

O problema é surpreendentemente difícil de corrigir, portanto, não é de admirar que a maioria dos bancos de dados não os crie automaticamente (o BigTable / SimpleDB se livra disso porque não permite junções arbitrárias, o que facilita significativamente as coisas) . Além disso, a criação de índices dinamicamente é um processo demorado que requer acesso exclusivo a toda a tabela - definitivamente não é algo que você deseja que aconteça enquanto a tabela estiver on-line.

No entanto, dado o número de aplicações web lâmpada para fora lá que foram escritos por amadores que nem sequer sabe o que um índice é , eu ainda acho que esse recurso seria benéfico para algumas pessoas.


4
Eu diria que comparar BigTable (e seus derivados, como Cassandra, HBase, etc.) com soluções RDBMS está comparando maçãs com laranjas - BigTable e derivados são mais como valor-chave gigantesco ou armazenamentos colunares, e a chave de linha é inerentemente um índice .
Suman

1
Exatamente. A pergunta está marcada com rdbmse não acho que o BigTable se enquadre na categoria.
precisa saber é o seguinte

2
@ ypercube: ... Sim, eu mencionei isso na minha resposta; mas ainda vale a pena conhecer, pelo menos como um ponto de interesse. Eu também vários mencionaram outros bancos de dados que são RDBMS do que fazer isso, e explicou por que não é comum. Definitivamente, isso não é merecedor de um
voto negativo

1
Eu não voto negativo. Concordo que é um problema muito difícil.
precisa saber é o seguinte

10

Embora já existam respostas abrangentes, elas parecem contornar a resposta real: os índices nem sempre são desejáveis.

Com a analogia do carro mencionada nos comentários, seria melhor dizer por que todos os carros não estão equipados com pacotes de esportes radicais? Em parte, é uma despesa, mas também se deve ao fato de muitas pessoas não precisarem ou desejarem pneus de baixo perfil e suspensão rígida; é desnecessariamente desconfortável.

Então, talvez você tenha 1.000 leituras para cada inserção, por que não ter um índice criado automaticamente? Se a tabela é ampla e as consultas são variadas, por que não ter várias? Talvez o commit seja crítico em termos de tempo e as leituras não; nas circunstâncias, pode ser inaceitável desacelerar sua inserção. Talvez você esteja trabalhando com espaço em disco limitado e não possa ter índices adicionais consumindo o espaço disponível.

O ponto é que os índices não são criados automaticamente porque não são a resposta para tudo. A criação de índices não é apenas um caso de dizer "ei, isso vai acelerar minhas leituras", há outros fatores a serem considerados.


1
+1, embora certamente seja possível e viável automatizar essas coisas, nem sempre vamos melhorar com um monte de índices mágicos implementados por um sistema que não tem informações sobre como os dados serão usados ​​amanhã, não importa sua gravação vs. limiar de troca de leitura. Eu escrevi um pouco sobre isso outro dia , mas claramente há muito mais sobre o que conversar.
Aaron Bertrand

> Talvez o commit seja crítico em termos de tempo e as leituras não; nas circunstâncias, pode ser inaceitável desacelerar sua inserção. Uma resposta tão boa, muito útil.
Siddhartha

6

Eles podem analisar consultas anteriores e sugerir / criar índices, no entanto, isso não funciona da melhor maneira possível, porque os índices atingem um equilíbrio para acelerar o que você deseja otimizar a um custo e o servidor não pode conhecer suas intenções.


-4

Eles não são inteligentes, são um pedaço de código. Toda vez que você insere novos dados em um banco de dados, ele precisa encontrar um novo local para ele e um mapa para encontrá-lo quando solicitado. A indexação parece mais fácil do que é, você apenas atribui um novo número a um novo bloco de dados? Bem, e se a próxima consulta não for sobre o último pedaço de dados, mas sobre 36271 pedaços antes? Você pode encontrá-lo facilmente com seu índice, certo? Mas e se a consulta incluir uma palavra como "pesca", encontrada no antigo pedaço 36271 fabricado em 1997? Ho? Nem uma palavra sobre pesca no artigo antigo.

Se os dados chegassem ao banco de dados um por um, eles poderiam ser indexados dessa maneira. Mas a indexação simples terá resultados errados e / ou desempenho lento mais cedo ou mais tarde ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.