Técnicas de otimização de desempenho: fusão ordenada

1. Histórico do problema e cenários aplicáveis

No artigo anterior, apresentamos que o banco de dados relacional usa a tecnologia de segmentação HASH ao realizar associações entre tabelas. Supondo que as escalas (número de registros) das duas tabelas de associação sejam N e M respectivamente, a complexidade computacional da tecnologia de segmentação HASH (o número de comparações dos campos associados) é de aproximadamente SUM (Ni * Mi), onde Ni e Mi são os valores HASH respectivamente Para o número de registros nas duas tabelas de i, satisfazendo N = SOMA (Ni) e M = SOMA (Mi), esta probabilidade será muito menor do que a complexidade da travessia completa N * M (será K vezes menor com boa sorte), K é o intervalo do valor HASH).

Se as duas tabelas estão em ordem para a chave de associação, então podemos usar o algoritmo de mesclagem para lidar com a associação, a complexidade neste momento é N + M; quando N e M são ambos grandes (geralmente muito maiores do que K), Este número será muito menor do que SUM (Ni * Mi) agora. Portanto, a velocidade de cálculo da associação de mesclagem ordenada é muito mais rápida do que a associação de segmento HASH.

Em aplicações práticas, como as tabelas de mesma dimensão e as tabelas principais e subtabelas estão sempre relacionadas à chave primária ou parte da chave primária, podemos classificar os dados dessas tabelas relacionadas de acordo com sua chave primária com antecedência, e então nós sempre pode usar o algoritmo de mesclagem para obter a associação, o que pode melhorar muito a eficiência. SPL usa tal algoritmo.

Vamos usar o esProc SPL para comparar com o banco de dados relacional Oracle para testar a eficiência da associação de mesclagem ordenada.

 

2. Ambiente de teste

1. Teste de memória cheia de pequenos dados

A máquina de teste tem duas CPUs Intel2670, com clock de 2.6G, um total de 16 núcleos, 128G de memória e drives de estado sólido SSD.

Usando os dados 50G gerados pelo padrão TPCH, a tabela principal é pedidos e a subtabela é orderdetail (gerada pela redução dos registros de dados da tabela de item de linha). Os registros nas duas tabelas são organizados em ordem crescente de O_ORDERKEY e L_ORDERKEY respectivamente.

Tanto o Oracle quanto o SPL usam testes de thread único.

2. Teste de armazenamento externo de Big Data

Usando a máquina virtual na máquina de teste mencionada, memória 16G e disco rígido de estado sólido SSD.

Usando dados 200G gerados pelo padrão TPCH, a tabela principal é os pedidos e a subtabela é o item de linha. Os registros nas duas tabelas são organizados em ordem crescente de O_ORDERKEY e L_ORDERKEY respectivamente.

Devido à quantidade relativamente grande de dados, o Oracle e o SPL usam o teste paralelo de 8 threads.

Três, teste de memória cheia de pequenos dados

1. Teste Oracle

(1 ) Sem teste de correlação

A instrução SQL testada é a seguinte:

selecionar

       l_ano,

       soma (volume) como receita,

       soma (l_quantidade) como quantidade

de

       (

              selecionar

                     extrair (ano de l_shipdate) como l_ano,

                     (l_extendedprice * (1 - l_discount)) como volume,

                     l_quantity

              de

                     detalhe do pedido

       )

agrupar por

       l_ano

união de todos

selecionar

       2019 como l_ano,

       contar (o_orderkey) como receita,

       contar (o_totalprice) como quantidade

de

       pedidos;

 

(2 ) Testes relacionados

A instrução SQL testada é a seguinte:

selecionar

       l_ano,

       soma (volume) como receita,

       soma (l_quantidade) como quantidade

de

       (

              selecionar

                     extrair (ano de l_shipdate) como l_ano,

                     (l_extendedprice * (1 - l_discount)) como volume,

                     l_quantity

              de

                     pedidos,

                     detalhe do pedido

              Onde

                     o_orderkey = l_orderkey

                     e l_quantidade> 0

       )

agrupar por

       l_year;

A condição de consulta l_quantity> 0 é sempre verdadeira e não há dados de filtragem para garantir que essa coluna de dados seja lida.

 

2. Teste SPL

(1 ) Sem teste de correlação

Escreva o script SPL da seguinte maneira:

bef4400cbc05de35bf684369d9db10ed.gif UMA
1 > pedidos = arquivo ("/ home / ctx / pedidos.ctx"). criar (). memória ()
2 > orderdetail = file ("/ home / ctx / orderdetail.ctx"). create (). memory ()
3 = agora ()
4 = detalhes do pedido.cursor (L_ORDERKEY, L_EXTENDEDPRICE, L_DISCOUNT, L_SHIPDATE, L_QUANTITY) .groups (ano (L_SHIPDATE): l_year; soma (L_EXTENDEDPRICE * (1 - L_DISCOUNT)): quantidade): quantidade)
5 = pedidos.grupos (; contagem (O_ORDERKEY), contagem (O_TOTALPRICE))
6 = intervalo @ s (A3, agora ())

 

(2 ) Testes relacionados

Escreva o script SPL da seguinte maneira:

bef4400cbc05de35bf684369d9db10ed.gif UMA
1 > pedidos = arquivo ("/ home / ctx / pedidos.ctx"). criar (). memória ()
2 > orderdetail = file ("/ home / ctx / orderdetail.ctx"). create (). memory ()
3 = agora ()
4 = pedidos.cursor (O_ORDERKEY, O_TOTALPRICE; O_TOTALPRICE> 0)
5 = detalhes do pedido.cursor (L_ORDERKEY, L_EXTENDEDPRICE, L_DISCOUNT, L_SHIPDATE, L_QUANTITY)
6 = joinx (A5: detalhe, L_ORDERKEY; A4: pedidos, O_ORDERKEY)
7

= A6.grupos (ano (detalhe.L_SHIPDATE): l_ano;

soma (detalhe.L_EXTENDEDPRICE * (1 - detalhe.L_DISCOUNT)): receita, soma (detalhe.L_QUANTITY): quantidade)

8 = intervalo @ s (A3, agora ())

O joinx em A6 é uma função de associação de mesclagem ordenada, exigindo que os campos associados sejam organizados em ordem crescente.

 

3. Resultados e análises de teste

A lista de resultados do teste é a seguinte (unidade: segundo):

categoria Não relacionado Relacionados Slowdown Multiple Tempo de associação
Oráculo 16 67 4,2 51
SPL 14 32 2,3 18

Depois que cada resultado de teste é executado várias vezes e os dados são totalmente armazenados em cache, o mais rápido é obtido.

Analise duas sentenças de SQL. No teste não relacionado, leia as colunas O_ORDERKEY e O_TOTALPRICE da tabela de pedidos e conte o número de registros e leia as cinco colunas de L_ORDERKEY, L_EXTENDEDPRICE, L_DISCOUNT, L_SHIPDATE e L_QUANTITY da tabela de detalhes do pedido, e some o preço de venda e L_QUANTITY Sum up. No teste de correlação, o volume lido dos pedidos e das tabelas de detalhes do pedido é o mesmo, e o preço de venda associado é somado e L_QUANTITY é somado. A quantidade de leitura e cálculo nos dois casos é basicamente a mesma. A operação extra é a associação entre as duas tabelas, portanto a diferença no tempo de execução entre as duas é o tempo da operação de associação. O mesmo é válido para SPL.

No mesmo equipamento de hardware e escala de dados, a associação SPL leva 18 segundos, a associação Oracle leva 51 segundos, quase três vezes a anterior, e o SPL é um programa escrito em Java, enquanto o Oracle é implementado em C ++, que verifica totalmente a ordenação Correlação de mesclagem pode melhorar muito a eficiência da correlação. A velocidade do SPL com correlação é 2,3 vezes mais lenta do que quando não há correlação, e o Oracle é 4,2 vezes mais lento, indicando que a velocidade do cálculo de mesclagem ordenada é equivalente à do cálculo comum, enquanto a correlação HASH é muito mais lenta do que o cálculo comum.

 

4. Teste de armazenamento externo de Big Data

Quando as duas tabelas a serem JOIN são muito grandes para caber na memória, o banco de dados relacional ainda usa a tecnologia de segmentação HASH. De acordo com o valor HASH do campo associado, os dados são divididos em vários segmentos, cada um dos quais é pequeno o suficiente para ser carregado na memória e então implementar o algoritmo de segmentação HASH da memória. Mas isso causará o problema de troca de memória externa. Os dados precisam ser gravados em segmentos e depois lidos. O extra é gravado e o outro é lido. A leitura da memória externa não é inerentemente rápida e a gravação é mais lenta , então o desempenho será muito pior.

A associação de mesclagem ordenada não tem esse problema. Os dados das duas tabelas só precisam ser percorridos uma vez. Não apenas a quantidade de cálculos de CPU é reduzida, mas a quantidade de E / S de memória externa também cai significativamente. Além disso, a memória necessária para executar o algoritmo de fusão é muito pequena, desde que alguns registros de cache sejam mantidos para cada tabela na memória, dificilmente afetará os requisitos de memória de outras tarefas simultâneas.

 

1. Teste Oracle

(1 ) Sem teste de correlação

A instrução SQL testada é a mesma que o teste de dados pequenos, basta alterar a tabela orderdetail para a tabela de itens de linha e adicionar "/ * + parallel (8) * /" após a primeira seleção para usar 8 threads em paralelo.

(2 ) Testes relacionados

A instrução SQL testada é a mesma que o teste de dados pequenos, basta alterar a tabela orderdetail para a tabela de itens de linha e adicionar "/ * + parallel (8) * /" após a primeira seleção para usar 8 threads em paralelo.

 

2. Teste SPL

(1 ) Sem teste de correlação

Escreva o script SPL da seguinte maneira:

bef4400cbc05de35bf684369d9db10ed.gif UMA
1 = agora ()
2 = arquivo ("/ home / ctx / lineitem.ctx"). create (). cursor @ m (L_ORDERKEY, L_EXTENDEDPRICE, L_DISCOUNT, L_SHIPDATE, L_QUANTITY ;; 8)
3 = A2.grupos (ano (L_SHIPDATE): l_ano; soma (L_EXTENDEDPRICE * (1 - L_DISCOUNT)): receita, soma (L_QUANTITY): quantidade)
4 = arquivo ("/ home / ctx / orders.ctx"). create (). cursor @ m (O_ORDERKEY, O_TOTALPRICE ;; 8)
5 = A4.total (contagem (O_ORDERKEY), contagem (O_TOTALPRICE))
6 = intervalo @ s (A1, agora ())

A quantidade de dados é grande. Ambos A2 e A4 usam leituras de cursor paralelo de 8 canais.

 

(2 ) Testes relacionados

Escreva o script SPL da seguinte maneira:

bef4400cbc05de35bf684369d9db10ed.gif UMA
1 = agora ()
2 = arquivo ("/ home / ctx / orders.ctx"). create (). cursor @ m (O_ORDERKEY, O_TOTALPRICE; O_TOTALPRICE> 0; 8)
3 = arquivo ("/ home / ctx / lineitem.ctx"). create (). cursor (L_ORDERKEY, L_EXTENDEDPRICE, L_DISCOUNT, L_SHIPDATE, L_QUANTITY ;; A2)
4 = joinx (A3: detalhe, L_ORDERKEY; A2: pedidos, O_ORDERKEY)
5 = A4.grupos (ano (detalhe.L_SHIPDATE): l_ano; soma (detalhe.L_EXTENDEDPRICE * (1 - detalhe.L_DISCOUNT)): receita, soma (detalhe.L_QUANTITY): quantidade)
6 = intervalo @ s (A1, agora ())

A2 é usado como um parâmetro ao gerar o cursor em A3, o que significa que ele é lido em segmentos de forma síncrona com a chave primária das ordens da tabela principal.

O joinx em A4 é uma função de associação de mesclagem ordenada, exigindo que os campos associados sejam organizados em ordem crescente.

 

3. Resultados e análises de teste

A lista de resultados do teste é a seguinte (unidade: segundo):

categoria Não relacionado Relacionados Slowdown Multiple Tempo de associação
Oráculo 265 863 3,3 598
SPL 70 101 1,4 31

A análise de cálculo e o cálculo do tempo de correlação são iguais a pequenos testes de dados.

Sob o mesmo equipamento de hardware e escala de dados, a associação SPL leva 31 segundos e a associação Oracle leva 598 segundos, o que é 19 vezes o anterior, verificando se a associação de mesclagem ordenada pode melhorar muito a eficiência da associação. Em comparação com o teste de dados pequenos, o múltiplo é bastante aumentado, indicando que quanto maior a quantidade de dados, mais óbvia a vantagem de melhoria de desempenho da associação de mesclagem ordenada sobre a associação de HASH.

Os múltiplos mais lentos de correlação do que nenhuma correlação também podem chegar à mesma conclusão do teste de dados pequenos, mas há mais tempo para ler os dados do que no teste de dados pequenos (os dados são todos armazenados em cache na memória quando os dados pequenos são pequeno), portanto não. A base de tempo do teste de correlação tornou-se maior e o múltiplo de desaceleração parece estar reduzido em comparação com o teste de dados pequenos.


Acho que você gosta

Origin blog.51cto.com/12749034/2602017
Recomendado
Clasificación