Tenho uma tabela de cerca de 100 milhões de linhas que vou copiar para alterar, adicionando um índice. Não estou tão preocupado com o tempo que leva para criar a nova tabela, mas o índice criado será mais eficiente se eu alterar a tabela antes de inserir quaisquer dados ou inserir os dados primeiro e depois adicionar o índice?
sql
database
postgresql
indexing
Drew Stephens
fonte
fonte
Provavelmente, é melhor criar o índice depois que as linhas forem adicionadas. Não só será mais rápido, mas o equilíbrio da árvore provavelmente será melhor.
Editar "balanceamento" provavelmente não é a melhor escolha de termos aqui. No caso de uma árvore b, ela é balanceada por definição. Mas isso não significa que a árvore b tenha o layout ideal. A distribuição do nó filho dentro dos pais pode ser desigual (levando a mais custos em atualizações futuras) e a profundidade da árvore pode acabar sendo mais profunda do que o necessário se o balanceamento não for executado com cuidado durante as atualizações. Se o índice for criado após a adição das linhas, é mais provável que tenha uma distribuição melhor. Além disso, as páginas de índice no disco podem ter menos fragmentação após a criação do índice. Um pouco mais de informação aqui
fonte
Isso não importa neste problema porque:
O(n*log(N))
maior (onden
são adicionadas linhas). Porque o tempo de geração da árvore éO(N*log(N))
então, se você dividir isso em dados antigos e novos dados, vocêO((X+n)*log(N))
pode simplesmente converter paraO(X*log(N) + n*log(N))
e neste formato, você pode simplesmente ver o que você vai esperar adicional.n
novas linhas) você obtém mais tempoO(log(N))
para inserir o tempo adicional necessário para regenerar a estrutura da árvore após adicionar um novo elemento nela (coluna de índice da nova linha, porque o índice já existe e uma nova linha foi adicionada, então o índice deve ser regenerado para balanceado estrutura, este custoO(log(P))
ondeP
é uma potência de índice [elementos no índice] ). Você temn
novas linhas, em seguida, finalmente, você temn * O(log(N))
entãoO(n*log(N))
resumo tempo adicional.fonte
Os índices criados depois são muito mais rápidos na maioria dos casos. Caso em questão: 20 milhões de linhas com texto completo em varchar (255) - (Nome da empresa) Índice em vigor durante a importação de linhas - uma correspondência contra levar até 20 segundos nos piores casos. Abandone o índice e recrie - compara levando menos de 1 segundo a cada vez
fonte
Não tenho certeza se isso realmente importará para a eficiência do índice, pois em ambos os casos você está inserindo novos dados no índice. O servidor não saberia o quão desequilibrado um índice estaria até depois de sua construção, basicamente. Em termos de velocidade, obviamente, faça as inserções sem o índice.
fonte