Perigos e Armadilhas do Particionamento - Etapa 2 – Parte 02
Dando continuidade, veremos estatísticas de subpartições.
Perigos e
Armadilhas do Particionamento - Etapa 2 – Parte 02
por Arup Nanda
Estatísticas de Subpartições
Esta
é uma parte enganadora do subparticionamento que não é bem e claramente documentada
nos manuais. O pacote DBMS_ESTATÍSTICAS
já deve ter sido usado por tempo suficiente para ter coletado estatísticas.
Para coletar estatísticas para as tabelas e para seus sub-objetos (por exemplo,
partições e sub-partições), deveríamos usar a função contida no pacote GATHER_TABLE_ESTATÍSTICAS. A função tem
dois parâmetros pouco conhecidos que devem ser designados para coletar as
estatísticas.
PARTNAME
Este parâmetro é supostamente designado para coletar estatísticas só para
a partição nomeada dentro da tabela e não para a tabela inteira. Porém, este é
um engano. PARTNAME pode ser usado para
coletar estatísticas também para uma sub-partição específica. Para assim
faze-lo, o nome da sub-partição é passado neste parâmetro.
GRANULARITY
Este parâmetro instrui o pacote para coletar estatísticas em níveis
diferentes e aplica-los em cascata a outros sub-objetos. Aceita vários valores.
O padrão, chamado DEFAULT, instrui o
pacote para coletar estatísticas globais e somente nas partições. O valor de PARTITION instrui o pacote para coletar estatísticas
a nível de partição. Porém, atribuindo estes valores não serão coletadas
estatísticas a nível de sub-partição; estes podem ser coletadas designando o valor
do parâmetro para ALL ou SUBPARTITON.
Consideremos
a tabela criada como segue:
create table spart1( col1 number, col2 number, col3 varchar2(20))partition by range (col1)subpartition by hash (col2)sub-partições 4( partition p1 values less than (101), partition p2 values less than (201), partition p3 values less than (301), partition p4 values less than (401), partition pm values less than (maxvalue)
)
Analisemos a tabela que usa o valor padrão de granularidade como segue:
exec
dbms_estatísticas.gather_table_estatísticas (tabname=>'SPART1')
Note-se
que não informamos a granularidade. Desde que o valor padrão é para coletar
estatísticas para as partições e não para qualquer sub-partição, as estatísticas
não serão coletadas para as sub-partições. Isto pode ser verificado rodando:
select partition_name
from user_tab_subpartitions
where last_analyzed is not null;
Este
comando não retornará nenhuma linha. Mas analisemos as outras opções aqui. Uma tabela
pode ter estatísticas a nível de tabela somente, chamadas estatísticas GLOBAIS
(GLOBAL statistics). Se forem analisadas
as partições da tabela e o otimizador consegue derivar as estatísticas globais
das partições individuais, então se supõe que as estatísticas para a tabela serão
derivadas globalmente. Examinemos cada opção em detalhes:
exec dbms_stats.gather_table_stats (tabname=>'SPART1', granularity=>'GLOBAL')
Este
comando coleta estatísticas somente a nível global. A consulta a seguir confirma
isto.
Select last_analyzed, global_stats
From user_tables where table_name = 'SPART1';
Isto retorna
GLO LAST_ANAL
--- ---------
YES 10-MAR-03
A
presença de estatísticas globais indica que a tabela foi analisada como um
todo, mas o otimizador não terá conhecimento das estatísticas de partições individuais.
Estas estatísticas podem ser coletadas utilizando o seguinte comando:
exec dbms_stats.gather_table_stats (tabname=>'SPART1', granularity=>'PARTITION')
Este
comando coleta as estatísticas apenas a nível de partição. Neste caso, as estatísticas
globais não são coletadas na tabela e a consulta retornará um NO debaixo de GLOBAL_STATS. Porém, a consulta.
select partition_name, last_analyzed
from user_tab_partitions
where last_analyzed is not null;
recuperará todas as partições. Outra variação do pacote é mostrada abaixo.
exec dbms_stats.gather_table_stats (tabname=>'SPART1', granularity=>'SUBPARTITION')
Isto coleta estatísticas somente a nível de sub-partição e deduz as estatísticas ao nível de partição; porém, não coleta estatísticas globais nas partições.
O
último valor da opção, ALL, executa todos
estes – tanto coleta estatísticas a nível de partição e sub-partição, como
também estatísticas globais na sub-partição, partição e tabela.
Assim,
o valor padrão para o parâmetro GRANULARITY
na função de coleta de estatísticas, não coleta estatísticas em sub-partições; é
preciso configura-lo para SUBPARTITION
ou ALL para coletar estatísticas.
Em
resumo, estes são os detalhes sobre atribuir granularidade e coletar estatísticas:
Outro conceito interessante que não é documentado claramente é a opção para só analisar sub-partições. Isto pode ser feito usando-se:
exec dbms_stats.gather_table_stats (tabname=>'SPART1', PART_NAME=>'P1_SYS123')
Este comando só colecionará estatísticas a nível de sub-partition somente na sub-partição P1_SYS123.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo