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 / 237846
Accepted
dw8547
dw8547
Asked: 2019-05-11 07:01:55 +0800 CST2019-05-11 07:01:55 +0800 CST 2019-05-11 07:01:55 +0800 CST

A adição de índices JSONB inchou o banco de dados?

  • 772

Nós estamos correndo:

user@host:~$ psql -d database -c "SELECT version();"                                                                   
version
---------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 10.7 (Ubuntu 10.7-1.pgdg16.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609, 64-bit
(1 row)

sobre:

user@host:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:    16.04
Codename:   xenial

e ter a seguinte configuração:

database=# \d+ schema.table
                                                                  Table "schema.table"
           Column            |            Type             | Collation | Nullable |                     Default                     | Storage  | Stats target | Description
-----------------------------+-----------------------------+-----------+----------+-------------------------------------------------+----------+--------------+-------------
 column_1                    | bigint                      |           | not null | nextval('table_id_seq'::regclass)               | plain    |              |
 column_2                    | character varying           |           | not null |                                                 | extended |              |
 column_3                    | character varying           |           | not null |                                                 | extended |              |
 column_4                    | character varying           |           | not null |                                                 | extended |              |
 column_5                    | timestamp without time zone |           | not null |                                                 | plain    |              |
 column_6                    | timestamp without time zone |           |          |                                                 | plain    |              |
 column_7                    | character varying           |           | not null |                                                 | extended |              |
 column_8                    | jsonb                       |           | not null |                                                 | extended |              |
 column_9                    | jsonb                       |           |          |                                                 | extended |              |
 column_10                   | character varying           |           | not null |                                                 | extended |              |
 column_11                   | character varying           |           | not null |                                                 | extended |              |
 column_12                   | character varying           |           |          |                                                 | extended |              |
 column_13                   | character varying           |           |          |                                                 | extended |              |
 column_14                   | timestamp with time zone    |           | not null |                                                 | plain    |              |
 column_15                   | timestamp with time zone    |           | not null |                                                 | plain    |              |
Indexes:
    "table_pkey" PRIMARY KEY, btree ( column_1 )
    "table_idx_1" btree ( column_11)
    "table_idx_2" btree ( column_4, column_2, column_7, column_5, column_6 )
    "table_idx_3" btree ( column_7, column_11, column_15 )
    "table_idx_4" btree ( column_7, column_11, column_14 )
    "table_idx_5" btree ( column_7, column_11, column_5 )
    "table_idx_6" btree ( column_7, ( ( column_8 ->> 'string_1'::TEXT )::INTEGER ), column_5 )
    "table_idx_7" btree ( column_15 )
    "table_idx_8" btree ( column_4, column_2, column_7, column_5, ( ( column_8 ->> 'string_1'::TEXT )::INTEGER ) )
    "table_idx_9" btree ( column_4, column_2, column_7, ( ( column_8 ->> 'string_1'::TEXT )::INTEGER) )
    "table_idx_a" btree ( column_7, column_4, column_2, ( ( column_8 ->> 'string_1'::TEXT )::INTEGER), ( ( column_8 ->> 'string_2'::TEXT )::INTEGER ) ) WHERE column_7::TEXT = 'string_3'::TEXT
Check constraints:
    "table_check_constraints" CHECK ( lower( column_10::TEXT ) <> 'string_4'::TEXT OR column_9 IS NOT NULL AND column_6 IS NOT NULL )

Autovacuum está ligado e configurado com:

user@host:~$ psql -d database -c "SELECT name, setting, pending_restart FROM pg_settings WHERE NAME ILIKE '%autovacuum%' ORDER BY name;"
                name                 |  setting              | pending_restart
-------------------------------------+-----------------------+-----------------
 autovacuum                          | on                    | f
 autovacuum_analyze_scale_factor     | 0.002                 | f
 autovacuum_analyze_threshold        | 10                    | f
 autovacuum_freeze_max_age           | 200000000             | f
 autovacuum_max_workers              | 5                     | f
 autovacuum_multixact_freeze_max_age | 400000000             | f
 autovacuum_naptime                  | 30                    | f
 autovacuum_vacuum_cost_delay        | 10                    | f
 autovacuum_vacuum_cost_limit        | 1000                  | f
 autovacuum_vacuum_scale_factor      | 0.001                 | f
 autovacuum_vacuum_threshold         | 25                    | f
 autovacuum_work_mem                 | -1                    | f
 log_autovacuum_min_duration         | 0 (env 1) /-1 (env 2) | f
(13 rows)

A seguinte sequência de eventos ocorreu no ambiente 1 , durante o qual autovacuumestava ligado e configurado como acima:

  1. Todas as noites VACUUM (VERBOSE, ANALYZE)do banco de dados adicionado.
  2. Algum tempo passa durante o qual o inchaço está no nível operacional normal.
  3. Nightly VACUUM (VERBOSE, ANALYZE)do banco de dados é removido.
  4. O índice table_idx_8que inclui uma coluna de tipo de dados JSONB é adicionado.
  5. O índice table_idx_9que inclui uma coluna de tipo de dados JSONB é adicionado.
  6. O surto de crescimento do inchaço começa e continua por 2 dias até atingir o pico.
  7. VACUUM (VERBOSE, FULL)de mesa.
  8. Bloat retorna aos níveis operacionais normais e permanece lá.

O tamanho do banco de dados (GB) ficou assim no ambiente 1 durante esta sequência de eventos:

ambiente 1 tamanho do banco de dados (GB)

E é assim que o bloat (GB) se parecia em ambiente 1 :

ambiente 1 DB bloat (GB)

O número de linhas ativas no ambiente 1 :

ambiente 1 número de linhas ativas

O número de linhas mortas no ambiente 1 :

ambiente 1 número de linhas mortas

A seguinte sequência de eventos ocorreu em ambiente 2 , durante todo o qual autovacuumestava ligado e configurado como acima:

  1. Todas as noites VACUUM (VERBOSE, ANALYZE)do banco de dados adicionado.
  2. Algum tempo passa durante o qual o inchaço está no nível operacional normal.
  3. Todas as noitesVACUUM (VERBOSE, ANALYZE)do banco de dados é removido.
  4. Índicetable_idx_8que inclui uma coluna de tipo de dados JSONB é adicionado.
  5. Índicetable_idx_9que inclui uma coluna de tipo de dados JSONB é adicionado.
  6. O surto de crescimento do inchaço começa e continua por 2 dias até atingir o pico e derrubar o DB (disco cheio).
  7. TRUNCATE TABLE schema.table.
  8. A tabela schema.table é preenchida novamente.
  9. O inchaço não se estabiliza e cresce até atingir o pico novamente.
  10. TRUNCATE TABLE schema.tableantes que o disco encha novamente.
  11. VACUUM (VERBOSE, FULL) do banco de dados.
  12. A tabela schema.table é preenchida novamente.
  13. Bloat continua a crescer!

O tamanho do banco de dados (GB) no ambiente 2 ficou assim durante esta sequência de eventos:

insira a descrição da imagem aqui

E esta é a aparência do bloat (GB) no ambiente 2 :

insira a descrição da imagem aqui

A única diferença entre esses dois ambientes é que eles são especificados de forma ligeiramente diferente (sendo 2 menos poderosos). Durante essas sequências de eventos, os volumes de gravação/leitura permaneceram inalterados em cada ambiente. Estamos usando essa consulta para medir o inchaço em bytes.

Eu verifiquei os logs do PostgreSQL, os logs de monitoramento e os logs de confirmação (Git) e identifiquei a adição dos dois índices como o gatilho para o inchaço, mas:

  1. Isso está certo? A adição de um índice pode desencadear um surto de crescimento tão inchado?
  2. Por que adicionar os índices acionou o inchaço, se foi?
  3. Por que o ambiente 1 se estabilizou e o ambiente 2 não?
  4. Como podemos estabilizar o ambiente 2?

Qualquer ajuda para responder a essas perguntas seria muito apreciada e escusado será dizer que estou feliz em fornecer qualquer outra informação que eu tenha perdido que possa ser útil.

postgresql index
  • 1 1 respostas
  • 355 Views

1 respostas

  • Voted
  1. Best Answer
    jjanes
    2019-05-13T07:10:03+08:002019-05-13T07:10:03+08:00

    Eu não acho que a abordagem arqueológica será muito útil aqui. Há muitas informações ausentes e variáveis ​​de confusão. Por exemplo, as pessoas geralmente não adicionam índices sem motivo. Se uma mudança na carga de trabalho motivou a criação do índice, pode ser a mudança na carga de trabalho, independente do índice, que está causando o inchaço.

    Existem muitas teorias que explicam o que você vê, mas realmente não há como distinguir entre elas com base na história dada. Cada índice dá mais trabalho ao vácuo, então seus novos índices podem ter apenas empurrado para o ponto de inflexão apenas porque já estava próximo, sem levar em consideração qual é o conteúdo dos índices. Ou talvez muito trabalho acumulado enquanto a tabela estava bloqueada para a criação do índice, e então o frenesi de atividade uma vez que a trava foi liberada a levou ao limite. Não são apenas mais índices que criam mais trabalho para o vácuo – o inchaço também. Isso pode levar a um ciclo vicioso em que mais inchaço diminui o vácuo, levando a mais inchaço ainda. Essa pode ser a razão pela qual o ambiente 1 se estabilizou após o VACUUM FULL, quebrou o ciclo vicioso a ponto de aspiradores regulares agora poderem acompanhar.

     autovacuum_analyze_scale_factor     | 0.002                 | f
     autovacuum_analyze_threshold        | 10                    | f
     autovacuum_vacuum_scale_factor      | 0.001                 | f
     autovacuum_vacuum_threshold         | 25                    | f
    

    Essas configurações parecem bastante ridículas à primeira vista. Existe uma razão para eles? Pode estar gastando tanto tempo limpando e analisando tabelas que realmente não precisam delas, que não consegue acompanhar a mesa que precisa ser limpa (mas se você tiver apenas uma mesa grande, isso pode não ser muito interesse). A redução dos fatores de escala pode fazer sentido, mas geralmente apenas em conjunto com um aumento dos limites.

    Eu rotineiramente defino "vacuum_cost_page_hit" para zero "vacuum_cost_page_miss" para zero. Na minha experiência, os problemas de desempenho simultâneos causados ​​pelo autovac geralmente são causados ​​pela escrita, não pela leitura, portanto, não faz sentido limitar o lado da leitura. Isso pode ser especialmente importante quando você tem tabelas e índices que já estão inchados, pois assim você pode ter muito mais leitura do que escrita.

    A saída da configuração log_autovacuum_min_duration=0 pode ajudar a distinguir entre as várias teorias. Além disso, usar o pg_freespacemap para ver quanta soma (avail) o PostgreSQL acha que a tabela tem, enquanto está em um estado de inchaço, pode ser informativo.

    • 3

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Sequências Biológicas do UniProt no PostgreSQL

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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