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 / 291775
Accepted
sev
sev
Asked: 2021-05-19 04:11:08 +0800 CST2021-05-19 04:11:08 +0800 CST 2021-05-19 04:11:08 +0800 CST

Convertendo a tabela PostgreSQL para a hipertabela TimescaleDB

  • 772

Eu tenho uma tabela PostgreSQL que estou tentando converter em uma hipertabela TimescaleDB.

A tabela tem a seguinte aparência:

CREATE TABLE public.data
(
    event_time timestamp with time zone NOT NULL,
    pair_id integer NOT NULL,
    entry_id bigint NOT NULL,
    event_data int NOT NULL,
    CONSTRAINT con1 UNIQUE (pair_id, entry_id ),
    CONSTRAINT pair_id_fkey FOREIGN KEY (pair_id)
        REFERENCES public.pairs (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

Quando tento converter esta tabela em uma hipertabela TimescaleDB usando o seguinte comando:

SELECT create_hypertable(
        'data',
        'event_time',
        chunk_time_interval => INTERVAL '1 hour',
        migrate_data => TRUE
);

Recebo o Erro:ERROR: cannot create a unique index without the column "event_time" (used in partitioning)

Pergunta 1: A partir desta postagem https://stackoverflow.com/questions/55312365/how-to-convert-a-simple-postgresql-table-to-hypertable-or-timescale-db-table-usi meu entendimento é que isso é porque eu especifiquei uma restrição exclusiva (con1) que não contém a coluna pela qual estou particionando - event_time. Isso é correto?

Pergunta 2: Como devo alterar minha tabela ou hipertabela para poder converter isso? Adicionei alguns dados sobre como pretendo usar os dados e a estrutura dos dados abaixo.

Propriedades de dados e uso:

  • Pode haver várias entradas com o mesmo event_time - essas entradas teriam entry_id's que estão em sequência
    • Isso significa que, se eu tiver 2 entradas (event_time 2021-05-18::10:16, id 105, <some_data>) e (event_time 2021-05-18::10:16, id 107, <some_data>), então a entrada com id 106 também teria event_time 2021-05-18::10:16
  • O entry_id não é gerado por mim e uso a restrição exclusiva con1 para garantir que não estou inserindo dados duplicados
  • Vou consultar os dados principalmente em event_time, por exemplo, para criar gráficos e realizar outras análises
  • Neste ponto, o banco de dados contém cerca de 4,6 bilhões de linhas, mas deve conter muito mais em breve
  • Gostaria de aproveitar a velocidade e a boa compactação do TimescaleDB
  • Eu não me importo muito com o desempenho da inserção

Soluções que tenho considerado:

  • Empacote todos os eventos que têm o mesmo timestamp em uma matriz de alguma forma e mantenha-os em uma linha. Acho que isso teria desvantagens na compactação e forneceria menos flexibilidade na consulta dos dados. Além disso, eu provavelmente acabaria tendo que descompactar os dados em cada consulta.
  • Remova a restrição exclusiva con1 - como faço para garantir que não adicionei a mesma linha duas vezes?
  • Expanda a restrição exclusiva con1 para incluir event_time - isso não diminuiria de alguma forma o desempenho e, ao mesmo tempo, abriria para o erro em que insiro acidentalmente 2 linhas com entry_id e pair_id, mas event_time diferente? (Eu duvido que isso seja uma coisa provável de acontecer embora)
postgresql timescaledb
  • 2 2 respostas
  • 1028 Views

2 respostas

  • Voted
  1. Best Answer
    davidk
    2021-05-19T06:22:42+08:002021-05-19T06:22:42+08:00

    Algumas perguntas e respostas aqui:

    1. é a restrição exclusiva (con1) que é o problema, não a restrição de chave estrangeira, mas provavelmente foi um erro de digitação.
    2. Sim, é um problema porque a coluna de particionamento de tempo não está incluída, a primeira pergunta que tenho é, o entry_id parece que pode ser um proxy para o tempo do outro sistema, você pode usar pair_id, time como sua restrição exclusiva? Haverá vários registros com diferentes entry_ids, os mesmos pair_ids e os mesmos horários? Você provavelmente poderia executar uma consulta com um count(*) agrupado por pair_id, hora de descobrir isso ... Observe que uma restrição exclusiva de três colunas pode funcionar, é uma questão de como o tempo é atribuído, é atribuído por você em tempo de gravação ou pelo sistema upstream? Se for o sistema upstream, não me preocuparia muito com duplicatas.
    3. a coisa da matriz é um pouco semelhante à compactação, mas a compactação faz algoritmos diferentes e mais eficientes do que o simples empacotamento de matriz.
    4. descobrir uma restrição exclusiva que funcione, seja em pair_id, time ou pair_id, entry_id, time provavelmente será muito mais eficiente do que tentar reduzir seus dados ao conjunto exclusivo no momento da consulta. E uma restrição exclusiva de três colunas não terá um grande impacto no desempenho. A ordenação dessas colunas deve ser escolhida com base nos padrões de consulta, que tipos de cláusulas where você costuma ter? ou seja, no id do par ou algo assim, bem como o tempo? ou apenas pelo tempo?
    5. finalmente, dado o tamanho da sua tabela, eu recomendo criar a hipertabela sem migrar dados, então crie uma tabela separada, transforme-a em uma hipertabela e faça um pequeno trabalho para migrar os dados. O migrate_data = true é realmente destinado a tabelas muito menores, ter um trabalho externo para fazer isso significa que você também pode introduzir algum paralelismo que fará com que seja muito mais rápido.
    • 3
  2. jonatasdp
    2021-05-19T04:51:09+08:002021-05-19T04:51:09+08:00

    meu entendimento é que isso ocorre porque eu especifiquei uma restrição exclusiva (pair_id_fkey) que não contém a coluna pela qual estou particionando - event_time. Isso é correto?

    Sim.

    Pergunta 2: Como devo alterar minha tabela ou hipertabela para poder converter isso? Adicionei alguns dados sobre como pretendo usar os dados e a estrutura dos dados abaixo.

    Acho que você pode manter a estrutura removendo as restrições. Você pode usar avg, lastou firstcombinado com algum time_bucket .

    Empacote todos os eventos que têm o mesmo timestamp em uma matriz de alguma forma e mantenha-os em uma linha.

    É o que a compressão de escala de tempo está fazendo nos bastidores, verifique isso .

    Remova a restrição exclusiva con1 - como faço para garantir que não adicionei a mesma linha duas vezes?

    Você provavelmente pode usar lastou firstpara evitar duplicatas como mencionei antes.

    Expanda a restrição exclusiva con1 para incluir event_time - isso não diminuiria de alguma forma o desempenho e, ao mesmo tempo, abriria para o erro em que insiro acidentalmente 2 linhas com entry_id e pair_id, mas event_time diferente? (Eu duvido que isso seja uma coisa provável de acontecer embora)

    É mais rápido manter o firstou lastda sua consulta e evitar a restrição. Mas se o desempenho não for um problema, acho que funcionará. Você também pode combinar time, entry_id, and pair_id, pois as restrições aceitam várias colunas.

    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • 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