[oracle_br] Re: Duvida Partição
Bom, primeiro de tudo : Não Existe no RDBMS Oracle (e nem na maioria esmagadora dos RDBMSs) o conceito de se limitar o número de linhas numa tabela (ou partição, ou índice, enfim) - por definição, enquanto o número de linhas estiver abaixo dos limites máximos do RDBMS ** e ** houver espaço de armazenamento, vc Sempre Pode inserir mais linhas, yep ??? Confira no manual e no paper http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-partitioning-11gr2-2010-10-189137.pdf os detalhes mas basicamente é isso aí... Assim, para atender a essa algo inusitada necessidade, vc tem as seguintes opções : a) se vc já tem uma chave artificial numérica e sequencial/single-increment, vc simplesmente particiona por RANGE, ie : os valores de 1 a 1999 ficam na partição P1, de 2000 a 3900 na partição 2, assim por diante... O ponto aqui é que se essa chave é mantida por SEQUENCE (normalmente é, por causa da performance) vc FACILMENTE pode ter (e mesmo VAI ter) GAPs, então talvez vc possa terminar com uns poucos registros a menos que 20 milhões numa partição - se isso não te incomoda, blz OU b) se vc não tem a situação a), aí VOCÊ vai ter que criar algum tipo de contador de registros , via trigger ou via views materializada : https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:42304816945767 lista algumas possibilidades, mas fique CIENTE que necessariamente isso PODE INTERFERIR SERIAMENTE na performance, pois vc está colocando um Overhead para cada INSERT, é inescapável... E Óbvio, vc vai ter que ter algum código extra (talvez na Aplicação, talvez no banco via trigger) para validar antes de cada insert através do contador se chegou nos 20 milhões ou não, isso é MAIS manutenção, MAIS partes móveis, MAIS overhead... OU c) se o limite puder ser por tamanho E não for necessário ser tão precisamente especificado, vc poderia calcular mais ou menos quanto espaço em disco os 20 milhões ocupam e ter a tablespace da partição pré-criada Exatamente com esse tamanho : aí vc somente terá que ter algum código (na Aplicação, talvez) que, quando o banco der erro no INSERT por espaço esgotado, re-execute o INSERT na próxima partição... == No caso, o HASH *** Não Vai ** te atender, de forma alguma : o que ele faz é simplesmente tentar espalhar os registros em quantidades mais ou menos similares enter as partições, mas Não Há como vc limitar (em qtdade de linhas ou tamanho ou seja o que for) cada partição Sem código extra, yep ?? []s Chiappa
Re: [oracle_br] Re: Duvida Partição
Chiappa, bom dia! Muito obrigado pela resposta. Vou estudar o melhor caso. Att, Bruno N. Barboza Em 1 de agosto de 2014 11:23, jlchia...@yahoo.com.br [oracle_br] oracle_br@yahoogrupos.com.br escreveu: Bom, primeiro de tudo : Não Existe no RDBMS Oracle (e nem na maioria esmagadora dos RDBMSs) o conceito de se limitar o número de linhas numa tabela (ou partição, ou índice, enfim) - por definição, enquanto o número de linhas estiver abaixo dos limites máximos do RDBMS ** e ** houver espaço de armazenamento, vc Sempre Pode inserir mais linhas, yep ??? Confira no manual e no paper http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-partitioning-11gr2-2010-10-189137.pdf os detalhes mas basicamente é isso aí... Assim, para atender a essa algo inusitada necessidade, vc tem as seguintes opções : a) se vc já tem uma chave artificial numérica e sequencial/single-increment, vc simplesmente particiona por RANGE, ie : os valores de 1 a 1999 ficam na partição P1, de 2000 a 3900 na partição 2, assim por diante... O ponto aqui é que se essa chave é mantida por SEQUENCE (normalmente é, por causa da performance) vc FACILMENTE pode ter (e mesmo VAI ter) GAPs, então talvez vc possa terminar com uns poucos registros a menos que 20 milhões numa partição - se isso não te incomoda, blz OU b) se vc não tem a situação a), aí VOCÊ vai ter que criar algum tipo de contador de registros , via trigger ou via views materializada : https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:42304816945767 lista algumas possibilidades, mas fique CIENTE que necessariamente isso PODE INTERFERIR SERIAMENTE na performance, pois vc está colocando um Overhead para cada INSERT, é inescapável... E Óbvio, vc vai ter que ter algum código extra (talvez na Aplicação, talvez no banco via trigger) para validar antes de cada insert através do contador se chegou nos 20 milhões ou não, isso é MAIS manutenção, MAIS partes móveis, MAIS overhead... OU c) se o limite puder ser por tamanho E não for necessário ser tão precisamente especificado, vc poderia calcular mais ou menos quanto espaço em disco os 20 milhões ocupam e ter a tablespace da partição pré-criada Exatamente com esse tamanho : aí vc somente terá que ter algum código (na Aplicação, talvez) que, quando o banco der erro no INSERT por espaço esgotado, re-execute o INSERT na próxima partição... == No caso, o HASH *** Não Vai ** te atender, de forma alguma : o que ele faz é simplesmente tentar espalhar os registros em quantidades mais ou menos similares enter as partições, mas Não Há como vc limitar (em qtdade de linhas ou tamanho ou seja o que for) cada partição Sem código extra, yep ?? []s Chiappa
[oracle_br] Re: Duvida Partição
Bruno, Com 6 partições e 35 milhões de registros/mês, vc distribuirá 5,8 milhões de registros em cada partição e atingirá 20 milhões de registros em cada partição, em 3.4 meses e ao fim de 1 ano, haverá cerca de 70 milhões de registros em cada partição. Para dar o efeito de limitar quantidade de registros por partição, a dica é aumentar nova partição a cada 3.4 meses. Lembre-se que o processo de adicionar partição, faz um reball das atuais, redistribuindo os registros existentes, na nova partição para que todas fiquem balanceadas (número semelhante de registros) e isto demanda um certo tempo, apesar de poder ser feito com os usuários conectados e usando (apesar de não recomendado em termos de performance, a versão Enterpri$e permite isto). Leia o documento http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm na sessão de Adding Partitions, especificamente em Adding a Partition to a Hash-Partitioned Table; Ederson Elias DBA Oracle - http://br.linkedin.com/pub/ederson-elias/24/8b/8b0 Labor improbus omnia vincit
Re: [oracle_br] Re: Duvida Partição
Faça particionamento por data, e mande criar uma partição nova a cada 15 dias. Att, Em 1 de agosto de 2014 11:30, ederson200...@yahoo.com.br [oracle_br] oracle_br@yahoogrupos.com.br escreveu: Bruno, Com 6 partições e 35 milhões de registros/mês, vc distribuirá 5,8 milhões de registros em cada partição e atingirá 20 milhões de registros em cada partição, em 3.4 meses e ao fim de 1 ano, haverá cerca de 70 milhões de registros em cada partição. Para dar o efeito de limitar quantidade de registros por partição, a dica é aumentar nova partição a cada 3.4 meses. Lembre-se que o processo de adicionar partição, faz um reball das atuais, redistribuindo os registros existentes, na nova partição para que todas fiquem balanceadas (número semelhante de registros) e isto demanda um certo tempo, apesar de poder ser feito com os usuários conectados e usando (apesar de não recomendado em termos de performance, a versão Enterpri$e permite isto). Leia o documento http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm na sessão de Adding Partitions, especificamente em Adding a Partition to a Hash-Partitioned Table; Ederson Elias DBA Oracle - http://br.linkedin.com/pub/ederson-elias/24/8b/8b0 Labor improbus omnia vincit