CREATE TRIGGER MY_TRIG AFTER INSERT ON MY_TBL FOR EACH ROW
BEGIN
IF SOMECONDITION THEN
DELETE FROM MY_TBL WHERE PK IN (SELECT PK FROM MY_TBL WHERE SOMEOTHERCONDITION FETCH FIRST 50 ROWS ONLY);
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL;
REORG TABLE MY_TBL;
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL;
END IF;
END#
Executando isso através do centro de controle do DB2 9.4.7 (com #
o caractere de terminação), isso me dá o erro SQL0104N
:
An unexpected token "RUNSTATS" was found following "T 50 ROWS ONLY;
". Expected tokens may include: "COMMENT
Eu não entendo o porquê. Não tenho permissão para usar comandos como RUNSTATS
/ REORG
dentro das definições de gatilho? Executar o RUNSTATS
comando separadamente funciona bem.
------Editar------
Um pouco mais sobre o que estou tentando alcançar aqui: A tabela em questão contém BLOBs e muitos deles. Para limitar o espaço em disco usado por esta tabela, gostaria de definir um limite de tamanho para a tabela. Então eu uso as informações das xxx_OBJECT_P_SIZE
colunas SYSIBMADM.ADMINTABINFO
para determinar o tamanho atual da tabela e se estiver além de algum limite eu simplesmente apago os 50 registros mais antigos da tabela. Quanto mais registros eu excluo em tal ocasião, menos freqüentemente reorg/runstats teria que ser executado. Portanto, as instruções não estão sendo executadas para cada linha inserida - apenas a condição SOMECONDITION
seria avaliada todas as vezes.
Existe uma maneira melhor de conseguir isso do que usando um gatilho?
------Editar------
Você só pode usar instruções SQL em um gatilho.
RUNSTATS
eREORG
não são instruções SQL; eles são comandos CLP do DB2 e somente o processador da linha de comandos os entende. Você pode tentar usar o procedimento armazenado do sistemaADMIN_CMD()
para invocar esses utilitários, no entanto, 1) ainda pode não funcionar devido à natureza dos utilitários e 2) mesmo que funcione, não seria uma boa ideia.Existem outros problemas com seu gatilho. Você não pode usar
FETCH FIRST
em uma instrução delete, por exemplo. E qual é o sentido de atualizar as estatísticas antes de um REORG?Você pode querer usar as tabelas SYSTOOLS que acompanham o DB2 para verificar os tamanhos das tabelas.
Primeiro você precisa criar as tabelas executando o seguinte procedimento armazenado:
Isso criará as tabelas. Se achar que não precisa deles, você sempre pode descartá-los mais tarde usando
Depois que as tabelas forem criadas, execute
RUNSTATS
em todas as tabelas pelo menos uma vez. Em seguida, execute o seguinte em todo o banco de dados:Isso preencherá tudo na primeira vez. Você sempre pode cuidar apenas da tabela de seu interesse mais tarde, executando
RUNSTATS
apenas essa tabela e, em seguida, executandoAgora você pode consultar essas tabelas para obter informações de dimensionamento em sua tabela.
Eu então costumo usar o seguinte para consultar:
ou isso para os vinte principais infratores
Com o tempo, você precisa podar essas tabelas. Costumo usar o seguinte para podá-los:
Você sempre pode ajustar o que eu tenho acima para olhar para tablespaces específicos. Confira o centro de informações para obter mais informações sobre isso.