Este artigo é compartilhado da comunidade Huawei Cloud " GaussDB (DWS) Temporary Table Series - Local Temporary Table ", autor: acydy.
GaussDB (DWS) suporta três formas de tabelas temporárias da versão 8.2.1: tabelas temporárias locais, tabelas temporárias voláteis e tabelas temporárias globais. Este artigo apresenta primeiro a função de tabela temporária local do DWS.
Recursos de tabelas temporárias locais: as definições e os dados da tabela estão relacionados à sessão e outras sessões não podem ver as tabelas temporárias locais criadas por esta sessão. Os metadados serão persistidos na tabela do sistema e RETRY poderá ser suportado se o nó do cluster falhar de forma anormal .
Gramática e uso
CRIAR [LOCAL] {TEMPORÁRIO | TEMP } TABLE [ SE NÃO EXISTE ] nome_da_tabela ({ nome_da_coluna tipo_de_dados [ modo de compressão ] [ agrupamento COLLATE ] [ restrição_coluna [ ... ] ] | restrição_tabela | LIKE tabela_fonte [ like_option [...] ] } [, ... ]) [ COM ({parâmetro_de_armazenamento = valor} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | EXCLUIR LINHAS } ]
Ao criar uma tabela, você precisa especificar TEMP ou TEMPORARY, o que significa criar uma tabela temporária local.
- ON COMMIT { PRESERVAR LINHAS | EXCLUIR LINHAS }
A opção ON COMMIT determina se deve ser criada uma tabela temporária em uma transação.Quando a transação for confirmada, as operações subsequentes desta tabela temporária serão executadas.
- PRESERVE ROWS (valor padrão): Nenhuma operação é executada na tabela temporária durante o envio, e a tabela temporária e seus dados da tabela permanecem inalterados. Este tipo é recomendado.
- DELETE ROWS: Exclua os dados da tabela temporária ao enviar.
Outras partes são iguais às tabelas comuns.
gaussdb=# cria tabela temporária tmp1(a int,b int); AVISO: A cláusula 'DISTRIBUTE BY' não foi especificada. Usando round-robin como modo de distribuição por padrão. DICA: Use a cláusula 'DISTRIBUTE BY' para especificar a coluna de distribuição de dados adequada. CRIAR A TABELA
As tabelas temporárias podem ter o mesmo nome das tabelas não temporárias. Se tiverem o mesmo nome, a prioridade das tabelas temporárias é maior que a das tabelas não temporárias.
gaussdb=# cria tabela temporária tmp1(a int,b int); AVISO: A cláusula 'DISTRIBUTE BY' não foi especificada. Usando round-robin como modo de distribuição por padrão. DICA: Use a cláusula 'DISTRIBUTE BY' para especificar a coluna de distribuição de dados adequada. CREATE TABLE gaussdb=# inserir em valores tmp1 (1,1); INSERT 0 1 gaussdb=# cria tabela tmp1(a int,b int); AVISO: A cláusula 'DISTRIBUTE BY' não foi especificada. Usando round-robin como modo de distribuição por padrão. DICA: Use a cláusula 'DISTRIBUTE BY' para especificar a coluna de distribuição de dados adequada. CREATE TABLE gaussdb=# selecione *de tmp1; um | b ---+--- 1 | 1 (1 linha) gaussdb=# selecione *de public.tmp1; um | b ---+--- (0 linhas)
Visualizações: as visualizações criadas com base em tabelas temporárias são visualizações temporárias.
postgres=# cria a visualização tmp_v1 como select *from tmp1; AVISO: a visualização "tmp_v1" será uma visualização temporária CREATE VIEW
cenas a serem usadas
-
A lógica de negócios complexa é dividida usando tabelas temporárias locais
Se a instrução SQL comercial for muito complexa, você poderá usar uma tabela temporária local para armazenar em cache os resultados intermediários da execução, dividindo assim a lógica comercial complexa em várias instruções mais simples. A informação estatística das demonstrações simples é mais preparada e o negócio dividido é mais fácil de manter.
-
Suporta exceções em nós CN.
GaussDB (DWS) é um banco de dados de arquitetura distribuída. Existem vários Coordenadores (CN) e os relacionamentos são iguais. O cliente pode se conectar a qualquer CN. O CN armazena as informações de metadados da tabela. Ao executar DDL, os metadados serão sincronizados em todos os DNs para garantir a consistência dos dados. Se ocorrer uma anormalidade em um CN, operações como criar uma tabela e excluir uma tabela falharão, causando falha em todo o trabalho.Neste cenário, tabelas temporárias locais podem ser usadas. As tabelas temporárias locais só são visíveis na sessão atual. Ao realizar operações como criação, ALTER e exclusão de tabelas temporárias locais, apenas os metadados serão modificados no CN atual. Isto não será afetado por anormalidades em outros nós CN e garantirá a continuidade dos negócios.
princípio
A diferença de metadados entre tabelas temporárias e tabelas comuns é que as tabelas temporárias não são visíveis em outras sessões, portanto, são construídas em um esquema que pertence apenas à sessão atual. Quando esta sessão criar uma tabela temporária pela primeira vez, o esquema da sessão será criado ao mesmo tempo. O esquema temporário é diferente para cada sessão.
Sessão 1:
gaussdb=# cria tabela temporária tmp1(a int,b int); AVISO: A cláusula 'DISTRIBUTE BY' não foi especificada. Usando round-robin como modo de distribuição por padrão. DICA: Use a cláusula 'DISTRIBUTE BY' para especificar a coluna de distribuição de dados adequada. CREATE TABLE gaussdb=# \d+ tmp1 Tabela "pg_temp_coordinator1_65_3_140257888512760.tmp1" Coluna | Tipo | Modificadores | Armazenamento | Meta de estatísticas | Descrição --------+---------+-----------+---------+-------- ------+------------- um | inteiro | | simples | | b | inteiro | | simples | | Possui OIDs: não Distribuído por: ROUND ROBIN Nós de localização: ALL DATANODES Opções: orientação=linha, compressão=não:
Sessão 2, a tabela tmp1 não pode ser consultada.
gaussdb=# selecione * de tmp1; ERRO: relação "tmp1" não existe LINHA 1: selecione * de tmp1; ^
Regras de nomenclatura para esquema temporário: pg_temp_Coordinator name_timelineID_global auto-increment ID_threadID
Nome do coordenador: nome do CN, que isola esquemas criados por diferentes CNs.
timelineID: aumentará após o nó ser reiniciado e é usado para determinar se este esquema é inválido.
ID de incremento automático global: ID de incremento automático em um único CN. O mesmo CN não precisa ter IDs de incremento automático de sessão diferentes.
Metadados: O sinalizador de persistência da tabela temporária local é 't'.
gaussdb=# selecione relname, relpersistence de pg_class onde relname = 'tmp1'; nome do rel | repersistência ---------+---------------- tmp1 | t
Limpeza de dados:
-
A sessão termina normalmente.
Quando a sessão termina normalmente, a definição da tabela e os dados da tabela temporária local serão excluídos. Os dados originais não estão mais acessíveis. -
Quando a sessão termina de forma anormal ou o CN atual ou um determinado nó DN está anormal.
Quando ocorre uma exceção, os metadados e dados do nó não serão excluídos imediatamente. GaussDB (DWS) depende da ferramenta gs_clean do componente para limpar automática e regularmente tabelas temporárias locais. Certifique-se de que os dados sejam limpos após um período de tempo para evitar a expansão contínua do espaço.
CN Tentar novamente
Quando a função CN Retry estiver ativada, os dados da tabela temporária serão registrados. Para garantir a consistência dos dados, não é recomendado alternar o estado da chave CN Retry ao usar a tabela temporária. Mantenha a chave CN Retry sempre ativada ou desativada no sessão usando a tabela temporária.
Quando CN Retry está ativado, o nó DN é reiniciado de forma anormal e é garantido que os dados na tabela temporária não serão perdidos. Depois que o DN for reiniciado, as sessões anteriores ainda poderão ser acessadas.
Se você deseja que a tabela temporária não seja registrada:
definir max_query_retry_times = 0;
Usar restrições
- Se o aplicativo da camada superior usar o mecanismo de pool de conexões para se conectar ao GaussDB (DWS), ao usar uma tabela temporária, é altamente recomendável excluir ativamente a tabela temporária antes de retornar a conexão ao pool de conexões para evitar anomalias de dados causadas pelo conexão não está sendo desconectada. Ou use o comando
DISCARD TEMP
para limpar as informações da tabela temporária da sessão. - As tabelas temporárias locais são ignoradas durante a expansão.
- As tabelas temporárias locais gs_dump não são suportadas.
Clique para acompanhar e conhecer as novas tecnologias da Huawei Cloud o mais rápido possível
Lei Jun: A versão oficial do novo sistema operacional da Xiaomi, ThePaper OS, foi empacotada. A janela pop-up na página de loteria do Gome App insulta seu fundador. O Ubuntu 23.10 foi lançado oficialmente. Você também pode aproveitar a sexta-feira para atualizar! Episódio de lançamento do Ubuntu 23.10: A imagem ISO foi "recuperada" com urgência devido a conter discurso de ódio. Um estudante de doutorado de 23 anos corrigiu o "bug fantasma" de 22 anos no Firefox. O desktop remoto RustDesk 1.2.3 foi lançado, Wayland aprimorado para suportar a versão TiDB 7.4: Oficial compatível com MySQL 8.0. Depois de desconectar o receptor USB da Logitech, o kernel do Linux travou. O mestre usou o Scratch para esfregar o simulador RISC-V e executou com sucesso o kernel do Linux. JetBrains lançou o Writerside, uma ferramenta para criação de documentos técnicos.