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 / user-22044

Exelian's questions

Martin Hope
Exelian
Asked: 2020-07-04 02:16:03 +0800 CST

Integrando uma grande tabela PostgreSQL como partição para uma nova tabela

  • 1

Atualmente, tenho uma tabela relativamente grande contendo dados de séries temporais (mais de 628 mil linhas ao vivo). A definição da tabela (alguns nomes mudaram ligeiramente) na parte inferior da pergunta.

Desejo anexar a tabela existente como uma partição a uma nova tabela (particionada). No entanto, a tabela existente possui uma idchave primária singular (usada principalmente porque o Django a exige). Anexar a tabela exigiria que eu atualizasse a restrição de chave primária (id, timestamp)na tabela antiga.

Como idé exclusivo, isso não é um problema, mas, dado o tamanho da tabela, me pergunto se essa restrição é verificada na criação (levando a uma consulta bastante) ou se apenas as linhas recém-adicionadas/atualizadas são verificadas. É possível interromper a leitura/gravação na tabela por alguns minutos, mas não posso esperar várias horas.


Nova mesa pretendida

Como a tabela antiga, a idcoluna é exigida principalmente pelo nosso ORM, infelizmente. Um (prop_id, "timestamp", value)índice semelhante também seria usado na tabela particionada.

CREATE TABLE "newtable" (
    "id"            bigserial NOT NULL,
    "timestamp"     timestamp with time zone NOT NULL,
    "prop_id"       integer NOT NULL,
    "value"         double precision NOT NULL,
    PRIMARY KEY ("id", "timestamp")
) PARTITION BY RANGE ("timestamp")
;

Definição de tabela antiga

A "id"chave primária é um artefato do nosso ORM (Django) e é irrelevante para qualquer consulta que fazemos. Usamos o (prop_id, "timestamp", value)índice 99,9% do tempo para varreduras somente de índice.

  Column   |           Type           | Collation | Nullable |                         Default                     | Storage | Stats target | Description
-----------+--------------------------+-----------+----------+----------------------------------------------------------+---------+--------------+-------------
 id        | bigint                   |           | not null | nextval('tablename_id_seq'::regclass) | plain   |              |
 timestamp | timestamp with time zone |           | not null |                     | plain   |              |
 value     | double precision         |           | not null |                     | plain   |              |
 prop_id   | integer                  |           | not null |                     | plain   |              |
Indexes:
    "tablename_pkey" PRIMARY KEY, btree (id)
    "tablename_prop_id_timestamp_value_b9bc8326_idx" btree (prop_id, "timestamp", value)
Foreign-key constraints:
    "tablename_prop_id_67f339b0_fk_othertable" FOREIGN KEY (prop_id) REFERENCES othertable(id) DEFERRABLE INITIALLY DEFERRED
postgresql partitioning
  • 1 respostas
  • 611 Views
Martin Hope
Exelian
Asked: 2019-05-09 00:40:53 +0800 CST

Duração da recuperação de espaço em disco em tabelas muito grandes (mais de 2,5 bilhões de linhas)

  • 0

Estou usando o PostgreSQL 9.4.20 e tenho 1 tabela que em 1 ponto continha 2,5 bilhões de linhas. Começamos a migrar dados e reduzimos o tamanho da tabela para cerca de 280 milhões de linhas.

Se possível, gostaríamos de recuperar o espaço em disco usado. Eu li sobre VACUUM FULL e sei que isso resultará em um bloqueio de tabela completo durante a operação. Minha pergunta aqui é: dado que um VACUUM da tabela levará cerca de 12.000 - 13.000 segundos, existe alguma maneira de estimar quanto tempo um VACUUM FULL levará para o tamanho atual e anterior da tabela?

Está incluída uma das saídas VACUUM VERBOSE durante o processo de exclusão:

INFO:  vacuuming "public.redacted"
INFO:  scanned index "redacted_prop_id_3df0d554fdfe92ee_idx" to remove 85063130 row versions
DETAIL:  CPU 105.78s/340.93u sec elapsed 3633.81 sec.
INFO:  scanned index "redacted_pkey" to remove 85063130 row versions
DETAIL:  CPU 35.37s/269.95u sec elapsed 1147.31 sec.
INFO:  "redacted": removed 85063130 row versions in 811189 pages
DETAIL:  CPU 12.00s/17.68u sec elapsed 342.43 sec.
INFO:  scanned index "redacted_prop_id_3df0d554fdfe92ee_idx" to remove 39116682 row versions
DETAIL:  CPU 101.30s/346.25u sec elapsed 3576.71 sec.
INFO:  scanned index "redacted_pkey" to remove 39116682 row versions
DETAIL:  CPU 40.21s/237.76u sec elapsed 1219.00 sec.
INFO:  "redacted": removed 39116682 row versions in 879306 pages
DETAIL:  CPU 22.85s/40.58u sec elapsed 817.57 sec.
INFO:  index "redacted_prop_id_3df0d554fdfe92ee_idx" now contains 1597286875 row versions in 1
DETAIL:  121144639 index row versions were removed.
4169907 index pages have been deleted, 3055311 are currently reusable.
CPU 0.03s/0.00u sec elapsed 0.30 sec.
INFO:  index "redacted_pkey" now contains 1597377401 row versions in 5999520 pages
DETAIL:  124175137 index row versions were removed.
1209655 index pages have been deleted, 894966 are currently reusable.
CPU 0.01s/0.00u sec elapsed 0.17 sec.
INFO:  "redacted": found 107389052 removable, 820955017 nonremovable row versions in 7045430 oes
DETAIL:  0 dead row versions cannot be removed yet.
There were 13483069 unused item pointers.
0 pages are entirely empty.
CPU 382.60s/1408.62u sec elapsed 12543.69 sec.
INFO:  analyzing "public.redacted"
INFO:  "redacted": scanned 30000 of 15055610 pages, containing 3170455 live rows and 0 dead rosample, 1591104467 estimated total rows
postgresql
  • 1 respostas
  • 62 Views
Martin Hope
Exelian
Asked: 2016-06-30 06:08:41 +0800 CST

Estimar a quantidade de tempo de inatividade do backup do RDS

  • 3

Eu tenho uma instância Multi-AZ RDS. Devido a alguma manutenção, quero criar um instantâneo consistente do banco de dados durante o dia, mas isso significa desligar todos os nossos serviços. Percebi no console da AWS que o tempo entre o início e o término de um backup do banco de dados é de cerca de 30 minutos.

O que eu queria saber é se isso afeta o desempenho e, em caso afirmativo, por quanto tempo e quando? É como o EBS, onde posso começar tudo de novo quando o instantâneo passa de "criação" para "progresso" ou preciso esperar até que esteja totalmente concluído?

Porque, se possível, gostaria de minimizar o tempo de inatividade de nossos serviços, o que significa que não ter que esperar pelo backup inteiro nos pouparia muito tempo.

aws amazon-rds
  • 1 respostas
  • 2123 Views
Martin Hope
Exelian
Asked: 2015-03-06 00:58:48 +0800 CST

Armazenando dados históricos no banco de dados versus no disco

  • 1

Tenho pensado em soluções alternativas para acelerar a recuperação de dados do meu banco de dados. Atualmente, tenho um banco de dados relativamente grande, cerca de 1 bilhão de linhas e crescendo. Esperamos que o banco de dados cresça linearmente com cerca de 1,5 bilhão de linhas (300 GB) por ano. Meu banco de dados é PostGreSQL no FreeBSD.

O banco de dados contém dados do sensor de histórico que consistem simplesmente em um registro de data e hora, um valor numérico e 1 chave estrangeira para um sensor. Os dados nunca serão atualizados, apenas gravados e não são acessados ​​com muita frequência.

Com essa quantidade de dados, não é possível manter tudo na memória, mas ainda quero uma recuperação rápida de dados, se possível. Atualmente, estamos pesquisando em quase 6ms por tempo de pesquisa de linha da tabela porque está tão espalhado pelo disco rígido que cada pesquisa tem tempo máximo de busca.

Tenho feito alguns testes em pequena escala com o armazenamento de dados em disco e isso parece MUITO mais rápido. Estamos analisando 1,8 s por dia do banco de dados versus 0,2 ms recuperando-o do disco (incluindo conversões de valor). Isso é quase 10.000x mais rápido.


O que leva à minha pergunta: existe algum motivo específico para não armazenar os dados do histórico como arquivos simples no disco se eu não me importar com a consistência da chave estrangeira?

postgresql
  • 1 respostas
  • 543 Views
Martin Hope
Exelian
Asked: 2014-10-31 01:28:02 +0800 CST

Varreduras de índice lentas em uma tabela grande

  • 22

Atualização 2020-08-04:

Como essa resposta aparentemente ainda está sendo vista regularmente, gostaria de fornecer uma atualização sobre a situação. No momento, estamos usando o PG 11 com particionamento de tabela ativado timestampe estamos lidando facilmente com alguns bilhões de linhas na(s) tabela(s). As varreduras somente de índice são um salva-vidas e não seria possível sem.


Usando o PostgreSQL 9.2, tenho problemas com consultas lentas em uma tabela relativamente grande (mais de 200 milhões de linhas). Não estou tentando nada maluco, apenas adicionando valores históricos. Abaixo está a consulta e a saída do plano de consulta.

Meu layout de mesa:

                                   Table "public.energy_energyentry"
  Column   |           Type           |                            Modifiers
-----------+--------------------------+-----------------------------------------------------------------
 id        | integer                  | not null default nextval('energy_energyentry_id_seq'::regclass)
 prop_id   | integer                  | not null
 timestamp | timestamp with time zone | not null
 value     | double precision         | not null
Indexes:
    "energy_energyentry_pkey" PRIMARY KEY, btree (id)
    "energy_energyentry_prop_id" btree (prop_id)
    "energy_energyentry_prop_id_timestamp_idx" btree (prop_id, "timestamp")
Foreign-key constraints:
    "energy_energyentry_prop_id_fkey" FOREIGN KEY (prop_id) REFERENCES gateway_peripheralproperty(id) DEFERRABLE INITIALLY DEFERRED

Os dados variam de 2012-01-01 até agora, com novos dados sendo adicionados constantemente. Existem cerca de 2,2k valores distintos na prop_idchave estrangeira, distribuídos uniformemente.

Percebo que as estimativas de linha não estão muito distantes, mas as estimativas de custo parecem maiores por fator 4x. Isso provavelmente não é um problema, mas há algo que eu possa fazer sobre isso?

Espero que o acesso ao disco possa ser o problema, já que a tabela não está na memória o tempo todo.

EXPLAIN ANALYZE 
SELECT SUM("value") 
FROM "energy_energyentry" 
WHERE 
  "prop_id"=82411 
  AND "timestamp">'2014-06-11' 
  AND "timestamp"<'2014-11-11'
;
 Aggregate  (cost=214481.45..214481.46 rows=1 width=8) (actual time=51504.814..51504.814 rows=1 loops=1)
   ->  Index Scan using energy_energyentry_prop_id_timestamp_idx on  energy_energyentry (cost=0.00..214434.08 rows=18947 width=8) (actual time=136.030..51488.321 rows=13578 loops=1)
         Index Cond: ((prop_id = 82411) AND ("timestamp" > '2014-06-11 00:00:00+00'::timestamp with time zone) AND ("timestamp" < '2014-11-11 00:00:00+00'::timestamp with time zone))
 Total runtime: 51504.841 ms

Alguma sugestão de como tornar isso mais rápido?
Também estou bem em apenas ouvir que não fiz nada de estranho.

postgresql index
  • 2 respostas
  • 28204 Views

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