Eu tenho um requisito de mover registros de tabela original_table
para tabela new_table
nos últimos N dias.
Abaixo está uma pequena amostra do meu script básico que faz isso.
while True:
result = INSERT INTO new_table (SELECT * FROM original_table WHERE (crdb_internal_expiration > (current_timestamp() + INTERVAL 'X days')) ORDER BY (unique_id) DESC LIMIT batch_limit OFFSET starting_point);
if result.rowcount < batch_size:
break
offset += batch_size
O problema é que temos que mover os registros entre as tabelas em tempo hábil e, no momento, mover os registros com um LIMIT de 10_000 leva cerca de 30 segundos de cada vez. Temos cerca de 2 milhões de registros nos últimos 2 dias, digamos, e queremos limitar o tempo de inatividade.
A razão pela qual estamos fazendo isso é porque precisamos usar famílias de colunas em nossa tabela, mas o cockroachdb não nos permite alterar uma tabela existente para adicionar novos famílias de colunas se ela ainda não tiver nenhuma.
Existe alguma maneira de otimizar esta consulta para que ela seja executada mais rapidamente, por favor? Talvez não usar um OFFSET
e rastrear o registro id
fosse mais rápido?
AND id > last_processed_id
ORDER BY id DESC
LIMIT 100;
a versão do cockroachdb está em 23
No CockroachDB, fazer uma
INSERT INTO <table> SELECT * FROM <other_table>;
operação geralmente é uma má ideia. Eu sugeriria usarCREATE TABLE AS
a sintaxe ( https://www.cockroachlabs.com/docs/stable/create-table-as ), que é muito mais eficiente porque pode ignorar todo o mecanismo de consistência, já que está sempre criando uma nova tabela.