2008-10-09 9 views
3

J'essaie d'accélérer une charge de données qui est contrôlée via une procédure stockée PL/SQL. J'ai modifié par programmation les index de la table que je veux actualiser pour être inutilisable. Je veux qu'Oracle ignore ces index inutilisables. Je peux faire la déclaration:Comment définir la variable de session skip_unusable_indexes sur true dans un package PL/SQL pour accélérer la suppression/insertion d'une table?

ALTER SESSION SET skip_unusable_indexes = TRUE 

mais je reçois ensuite l'erreur:

ORA-01502: index 'MY_INDEX_NAME' or partition of such index is in unusable state

donc est-il semble avoir ignoré ma session alter. Puis-je modifier ma session dans un package PL/SQL? Sinon, quelle est mon alternative? Sinon, comment désactiver (définir inutilisable) les index pour accélérer la charge?

Une question quelque peu liée here.

+0

Semble la réponse est ... vous ne pouvez pas. – dacracot

Répondre

4

Ecrivez-vous l'instruction ALTER SESSION dans la même session que celle utilisée par la procédure stockée? Ou est-ce ALTER SESSION exécuté dans une session séparée?

Vous pouvez intégrer la session dans votre ALTER PL/SQL avec SQL dynamique, à savoir

BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE'; 

    <<more code>> 
END; 

quelques-unes des index uniques (ou utilisés pour appliquer une contrainte unique)? Comme les États skip_unusable_indexes documentation

Note: If an index is used to enforce a UNIQUE constraint on a table, then allowing insert and update operations on the table might violate the constraint. Therefore, this setting does not disable error reporting for unusable indexes that are unique.

Si tel est le cas, vous pouvez désactiver la contrainte et/ou modifier l'indice (s) pour être non-unique?

Un exemple rapide de la différence entre les index uniques et non uniques. Notez que lorsque vous avez un index unique inutilisable, skip_unusable_indexes ne supprime pas l'erreur ORA-01502 comme c'est le cas lorsque vous avez un index non unique inutilisable.

SQL> create table a (
    2 col1 number 
    3 ); 

Table created. 

SQL> create unique index idx_a on a(col1); 

Index created. 

SQL> insert into a values(1); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> alter index idx_a unusable; 

Index altered. 

SQL> insert into a values(2); 
insert into a values(2) 
* 
ERROR at line 1: 
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state 


SQL> alter session set skip_unusable_indexes = true; 

Session altered. 

SQL> insert into a values(2); 
insert into a values(2) 
* 
ERROR at line 1: 
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state 


SQL> drop index idx_a; 

Index dropped. 

SQL> create index idx_a_nonunique on a(col1); 

Index created. 

SQL> alter index idx_a_nonunique unusable; 

Index altered. 

SQL> insert into a values(2); 

1 row created. 
+0

J'ai essayé cela à l'origine, mais il me donne toujours l'erreur ORA-01502. – dacracot

+0

L'index est-il unique? Si oui, voir la modification que je viens de faire. –

+0

Je ne pense pas que ce soit pertinent, l'erreur ORA-01502 se plaint que l'index est inutilisable (ce qui est prévu) pas qu'une contrainte unique a été violée. – dacracot