- Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por
jspaulonci.
-
AutorPosts
-
8 de janeiro de 2010 às 3:25 pm #91951
jspaulonci
ParticipanteBom dia pessoal, estou começando a brincar com particionamento e quero fazer uma pergunta.
Eu sempre devo deixar uma partição na tabela com o MAX VALUE, para que o usuário não tenha erros do tipo
SQL> Insert Into numbers (qty,name) Values (2300,’ll’);
Insert Into numbers (qty,name) Values (2300,’ll’)
*
ERRO na linha 1:
ORA-01438: value larger than specified precision allowed for this columnEsse erro eu simulei pois a tabela tabela não deixou eu inserir o valor 2300 para coluna qty, pois ela possui só uma partição e ela preve um valor abaixo de 101.
SQL> Insert Into numbers (qty,name) Values (23,’ll’);
1 linha criada.
SQL> commit;
Commit concluído.
Obrigado
João Paulo8 de janeiro de 2010 às 7:31 pm #91972Marcio68Almeida
ParticipanteSe você não criar partições que comportem os dados a ser inseridos, certamente terá esse tipo de erro.
O normal é que se crie partições para range de valores conhecidos.
Por exemplo, se você particionar por ano, e não criar uma partição 2010, certamente terá problemas…8 de janeiro de 2010 às 7:44 pm #91973jspaulonci
ParticipantePrimeiramente, muito obrigado Marcio, gostaria de postar mais algumas dúvidas.
E possível utilizar dois métodos de particionamento na mesma tabela ?
Só o compose partition faz isso ?É possível transformar uma partição de MAXVALUE para um outro valor no RANGE PARTITION ?
No list partition é possível aumentar uma nova tablespace sem dropar a tabela e recria-la novamente ?
Obrigado
11 de janeiro de 2010 às 5:23 pm #91989VitorLeandro
ParticipanteBom dia Amigo, vamos ver se consigo te ajudar.
Primeiramente é possível sim utilizar dois tipos de partição numa mesma tabela como você informou, mas seria uma partição tipo x e uma subpartição tipo x ou y.
Você pode por exemplo criar uma tabela particionada por Range e subparticionada por list..
EX:
CREATE TABLE TESTE
( CODIGO INTEGER
STATUS VARCHAR(1 BYTE)
)PARTITION BY RANGE (CODIGO)
SUBPARTITION BY LIST(STATUS)(
PARTITION PART_1 VALUES LESS THAN(‘2000’)
(SUBPARTITION SUBP1_STATS VALUES (‘S’),
SUBPARTITION SUBP1_STATN VALUES (‘N’)),
PARTITION PART_2 VALUES LESS THAN(‘3000’)
(SUBPARTITION SUBP2_STATS VALUES (‘S’),
SUBPARTITION SUBP2_STATN VALUES (‘N’)),
PARTITION PART_3 VALUES LESS THAN(‘4000’)
(SUBPARTITION SUBP3_STATS VALUES (‘S’),
SUBPARTITION SUBP3_STATN VALUES (‘N’)),
PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’)
(SUBPARTITION SUBP4_STATS VALUES (‘S’),
SUBPARTITION SUBP4_STATN VALUES (‘N’))
)Existem N tipos de particionamento, principalmente no 11G. Seria muito interessante você verificar o manual da sua versão e verificar todas as opções existentes.
Sobre alterar uma partição, você pode fazer um alter table e adicionar partições intermediárias, antes do MAXVALUE. Deixando essa partição como está. Será mais rápido!
ALTER TABLE TESTE
ADD PARTITION PART_5 VALUES LESS THAN(‘5000’)
(ADD SUBPARTITION SUBP4_STATS VALUES (‘S’),
ADD SUBPARTITION SUBP4_STATN VALUES (‘N’)),Sobre o Listpartition aumentar uma tablespace eu não intendi! Mas se você quizer mudar uma partição de tablespace você faz um alter table, move partition..
EX: alter table TESTE
move subpartition PART_4 tablespace TBS11 de janeiro de 2010 às 5:30 pm #91990jspaulonci
ParticipanteVito, obrigado pela explicações, foram de muita valia.
Quanto a pergunta que fiz e você não entendeu eu quis dizer o seguinte.
Eu começo um projeto, preciso particionar uma tabela pelo tipo HASH , e disponibilizo 4 tablespaces para essa tabela. depois de um ano eu descubro que se eu colocar mais 2 tablespaces para o particionamento dessa tabela, terei ganho de performance , como eu faria para adicionar essas duas novas tablespaces ?
Obrigado
Spaulonci11 de janeiro de 2010 às 6:01 pm #91991VitorLeandro
ParticipanteOk, só fazendo uma correção.
Você pode criar partições de múltiplas colunas (Multiple Column Partition), porem deve ser do mesmo tipo.
EX:
CREATE TABLE TESTE
( CODIGO INTEGER
TIPO INTEGER
)PARTITION BY RANGE (CODIGO, TIPO)
(
PARTITION PART_1 VALUES LESS THAN(‘2000’,’1’)
PARTITION PART_1 VALUES LESS THAN(‘2000’,’2’)
PARTITION PART_2 VALUES LESS THAN(‘3000’,’1’)
PARTITION PART_2 VALUES LESS THAN(‘3000’,’2’)
PARTITION PART_3 VALUES LESS THAN(‘4000’,’1’)
PARTITION PART_3 VALUES LESS THAN(‘4000’,’2’)
PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’,’1’)
PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’,’2’)
)Essa funcionalidade eu já testei no 11G R2, não sei se funciona em outras versões.
Vamos lá, é mais ou menos o que eu expliquei. Uma partição só pode ficar em uma única tablespace! Então você precisará escolher as partições que você deseja e então movê-las para as novas tablespaces, comando como eu expliquei acima.
Alter table xxx
move partition partXX tablespace tbs…
Lembrando que o move, efetua um lock na partição, então sugiro que você faça isso numa manutenção programada!
Outro detalhe, se você começar espalhar de mais os seus dados e partições em múltiplas tablespaces esperando performance, você provavelmente terá se utilizar estorages antigas em modo filesystem. Daí, você deverá ter tempo de sobre pra ficar alterando objetos de tablespace para outra… Uma solução simples seria migrar seu ambiente parar ASM, que efetua o balanceamente de carga e performance em um nível mais baixo da aplicação. Se você utiliza as novas teconologias de storages virtualizadas (EVA, EXADATA e outras) a própria storage faz esse papel, sem a sua interferência!!
11 de janeiro de 2010 às 7:30 pm #91992jspaulonci
ParticipanteCerto, Vitor, eu uso ASM , estou em RAC 10.2.0.3.0, você acha que não precisa ficar espalhando em vários tablespaces ?
11 de janeiro de 2010 às 8:32 pm #91994VitorLeandro
ParticipanteIsso depende de o ASM está configurado. Os datafiles destas tablespaces estão em um mesmo diskgroup? Mesma LUN? Se estiverem, acho que não vale a pena!
Primeiramente, veja quantos diskgroups existem…
SELECT INST_ID, GROUP_NUMBER, NAME, BLOCK_SIZE, STATE, TYPE, TOTAL_MB, FREE_MB, USABLE_FILE_MB
FROM GV$ASM_DISKGROUPEm seguida, veja onde seus datafiles estão:
SELECT tablespace_name, status,file_name FROM DBA_DATA_FILESNo nome do datafile, você tem em qual diskgoup ele está!
Isso é só pra se ter uma idéia, pois é preciso checar tambem na storage quantos diskgroups existem, se cada disk group da storage é um diskgroup no ASM…
Já estive em uma empresa onde foi colocado 10 discos formando um diskgroup e apenas uma LUN (volume lógico) na storage e apenas um diskgroup no ASM… Nesse caso, a storage quem faria o balanceamento pois o ASM enxergará tudo como se fosse apenas um disco.
As storages atuais fazem isso por padrão, onde você informa o tamanho do volume para determinado host e ela se encarrega de gravar isso em um grupo de discos interno, balanceando automaticamente a carga. A cada disco que você insere na storage, ela realiza o balanceamento dos dados entre os discos e a capacidade de I/O da storage vai aumentando a medida que são colocados mais discos.
Isso é muita informação e o ADDM pode te dar uma Luz. Dê uma olhada no ADDM e verifique se existe algum alerta tipo ” I/O Throughput”…
SELECT b.owner, b.task_id, b.task_name, b.execution_name, b.finding_id,
b.finding_name, b.TYPE, b.type_id, b.PARENT, b.object_id,
b.impact_type, b.impact, b.MESSAGE, b.more_info, b.filtered, b.flags,
a.database_time, a.active_sessions, a.perc_active_sess,
a.is_aggregate AS is_aggregate, a.meter_level
FROM SYS.wri$_adv_addm_fdg a, dba_advisor_findings b
WHERE b.task_id = a.task_id
AND b.finding_id = a.finding_id
AND b.finding_name LIKE ‘%Throughput de E/S%’
ORDER BY task_id DESCAtravés do select acima, pegue o TASK_NAME e pesquise através do DB Control/ADDM os eventuais alertas e problemas informados sobre Throughput.
Isso pode revelar um pouco sobre diferenças de Throughput que estão denegrindo a performance em alguns objetos.
11 de janeiro de 2010 às 9:40 pm #91997jspaulonci
ParticipanteMuito Obrigado Vitor….valeu mesmo
-
AutorPosts
- Você deve fazer login para responder a este tópico.