Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sp66d_rac6r

Partition_Name em uma Procedure

Recommended Posts

Olá Pessoal.

 

Tenho uma procedure. Nela uso um cursor que acessa uma tabela particionada por data.

 

Atualmente faço o filtro da data na cláusula WHERE, passando a data desejada como parâmetro da minha procedure.

 

Como trabalho com registros na casa dos milhoes, preciso otimizar ao máximo esta query.

 

Por isto quero restringir minha tabela à partição da data que estou processando.

 

Para isto preciso passar para o cursor o nome de partição que desejo usar "P_"<data> .

 

Vi no OTN, AskTom, exemplos de EXECUTE IMMEDIATE que retornam o nome da partição, mas isto p/ mim ñ serve, pq eu teria que definir o meu cursor como um bloco de texto, e ñ posso fazer isto aqui.

 

Poderiam em ajudar?

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tu está precisando acessar uma partição determinada, pq não especificar no próprio SELECT, exemplo:

 

SELECT coluna1, colua2 FROM tabela PARTITION (nome_da_particao) WHERE coluna1 = '1';

E veja o plano de execução, deverá ocorrer um RANGE PARTITION sobre a sua partição, com isso, o seu result set deverá ser menor e mais performático.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tu está precisando acessar uma partição determinada, pq não especificar no próprio SELECT, exemplo:

 

SELECT coluna1, colua2 FROM tabela PARTITION (nome_da_particao) WHERE coluna1 = '1';

E veja o plano de execução, deverá ocorrer um RANGE PARTITION sobre a sua partição, com isso, o seu result set deverá ser menor e mais performático.

 

Abraços,

 

Preciso algo dinâmico, pois tenho partições por data, conforme a data de execução, p.e.: para a data de execução 27/11/2007, a partição se chama "P_20071127".

 

Não posso colocar fixa no cursor, pq muda a cada execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então pega o nome na view dba_tab_partitions a coluna partition_name.

 

Abraços,

Preciso de alguma solução que resolva a situação que tenh, que é a partição por data de referência, que éo meu parâmetro de execução da procedure.

 

Qdo processo dia 28/11/2007, devo acessar a partição "p_20071128" da minha tabela.

SELECT coluna1, colua2 FROM tabela PARTITION (p_20071128) WHERE coluna1 = '1';

 

Qdo processo dia 29/11/2007, devo acessar a partição "p_20071129" da minha tabela.

SELECT coluna1, colua2 FROM tabela PARTITION (p_20071129) WHERE coluna1 = '1';

 

Qdo processo dia 30/11/2007, devo acessar a partição "p_20071130" da minha tabela.

SELECT coluna1, colua2 FROM tabela PARTITION (p_20071130) WHERE coluna1 = '1';

 

E assim por diante.

 

Já tentei colocar o nome da partição como variável e setar esta variavel contatenado "P" + a data no formato que preciso "yyyymmdd".

 

Mas o Oracle entende o nome da minha variável como sendo o nome da partição. E isto dá erro.

 

Não sei se deu p/ entender melhor. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi o seu problema e ja tive um bem parecido... achei 2 solucoes....

 

até a versao 9i, acredito que nao é possivel utilizar uma variavel para definicao de uma particao (no 10g acho q tambem nao). 2 solucoes que achei com amigos:

 

- usando execute immediate, assim é possivel concatenar comandos sql com variaveis criado os tais dos sql dinamicos... ficaria algo como:

EXECUTE IMMEDIATE ' SELECT * FROM TABELA PARTITION(' + VARIAVEL +')';
o ruim de usar essa forma é que o parse é feito em toda a execuçao da query e em um bloco, somente na hora de execucao

 

- usando o criterio de particao na própria query. algo como:

SELECT * FROM TABELA WHERE data = to_date('2007-10-01', 'YYYY-MM-DD');
dessa forma, na teoria, o oracle procuraria seus dados em todas as particoes da tabela pois vocë naum solicitou na query uma particao específica (PARTITION(NOME_PARTICAO)). Na prática, ele vai usar somente 1 unica particao pois no momento que o oragle gerar o plano de execucao ele identificará que aquela data está somente em uma particao gerando o mesmo resultado do que se voce explicitamente indicasse a particao. Se nao me engano voce tera uma perda muito pequena (coisa de milisegundos) no parse da query mas em 99% dos casos é irrisório.

 

mas sempre acompanhe o plano de execucao antes de implantar para ver se realmente ele está usando a partiçao adequadamente, ok ?

 

abs,

ska!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.