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.
32
UNIQUE
restrições.Respostas:
Atualizar
Agora isso é implementado no SQL Server Azure. Gera recomendações
e o gerenciamento de índice pode ser configurado para ser automático .
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,C
eA,B INCLUDE(C)
Alguns problemas atuais com a ideia são
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
A home page do projeto lista vários projetos intrigantes. Um é particularmente relevante para a questão aqui
Os autores declaram
O artigo apresenta um algoritmo
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.
As conclusões aqui são semelhantes às de outro artigo Sintonia de índices orientada a consultas autônoma
fonte
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.
fonte
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.
fonte
rdbms
e não acho que o BigTable se enquadre na categoria.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.
fonte
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.
fonte
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 ...
fonte