Estou criando algumas dezenas de tabelas como CREATE TABLE AS SELECT (CTAS). A única diferença nas instruções SELECT é especificar um valor diferente na cláusula WHERE para TEAM_ID. Sou um novato em Oracle e pensei que poderia usar variáveis de ligação para acelerar o processo, mas elas não são permitidas em instruções DDL.
Meus dados são muito grandes - mais de 500 milhões de linhas.
Qual é a minha melhor opção para velocidade? Atualmente estamos usando nologging
a instrução CREATE TABLE. Seria melhor criar explicitamente a tabela e INSERT com as /*+ append */
variáveis de dica e ligação? Ou os ganhos de nologging
superam os ganhos de variáveis de ligação?
(Tenho certeza que este é um cenário "depende", mas nem sei do que depende...)
Use
execute immediate
para facilitar a criação de muitas tabelas muito semelhantes.Uma pequena demonstração de PL/SQL:
A instrução create table pode conter qualquer coisa que você quiser - o exemplo acima mostra apenas que a instrução pode ser dinâmica. Portanto, no seu caso, você teria uma lógica simples para alterar o
TEAM_ID
nome da tabela e para cada instrução.As variáveis de ligação não oferecerão ganho, a menos que você esteja executando a mesma consulta única várias vezes (extremamente simplificada para esta resposta) - neste caso, você está executando muitas consultas diferentes que estão realizando grandes inserções em massa.
Criar tabelas com
NOLOGGING
não é aconselhável se este for um sistema de produção. Esteja ciente também de que não registrar e/*+APPEND*/
pode ter implicações de backup/restauração. Este tópico do Ask Tom pode ser de particular interesse.Para esclarecer, usar o CTAS é o caminho a seguir. Você só precisa analisar a instrução CTAS uma vez para inserir seus milhões de linhas. Se você usar instruções INSERT individuais, terá que analisar cada instrução repetidamente, o que adiciona uma sobrecarga enorme!