![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
FAQ/DBA Taille des enregistrements (21/04/2003) Lors de la création d'une table, une colonne number occupe plus q’une colonne de type number(4) ?
Ce n'est pas la longueur de la définition, mais le contenu qui occupe de l'espace (1 octet exponent, 1 octet si négative, floor(p/2) +1 octet (précision). L'exemple suivant montre que un number(1) de valeur -9 occupe autant d'espace que number(10) de valeur -9 ainsi que l'espace occupé par une série de 9 dans number (qui est de 38 par défaut).
SQL> SET serveroutput ON
SQL> DECLARE
2 numero NUMBER := 9;
3 longueur NUMBER;
4 longueur01 NUMBER(1) := -9;
5 longueur10 NUMBER(10) := -9;
6 BEGIN
7 DBMS_OUTPUT.enable(1000000);
8 FOR i IN 1..38 LOOP
9 SELECT VSIZE (numero)INTO longueur FROM dual;
10 DBMS_OUTPUT.put_line('Longueur ' || longueur || ' pour ' || numero);
11 numero := 10*numero+9;
12 END LOOP;
13 SELECT VSIZE(longueur01) INTO longueur FROM dual;
14 DBMS_OUTPUT.put_line('Longueur01 ' || longueur);
15 SELECT VSIZE(longueur10) INTO longueur FROM dual;
16 DBMS_OUTPUT.put_line('Longueur10 ' || longueur);
17 END;
18 /
Longueur 2 pour 9
Longueur 2 pour 99
Longueur 3 pour 999
Longueur 3 pour 9999
Longueur 4 pour 99999
Longueur 4 pour 999999
Longueur 5 pour 9999999
Longueur 5 pour 99999999
Longueur 6 pour 999999999
Longueur 6 pour 9999999999
Longueur 7 pour 99999999999
Longueur 7 pour 999999999999
Longueur 8 pour 9999999999999
Longueur 8 pour 99999999999999
Longueur 9 pour 999999999999999
Longueur 9 pour 9999999999999999
Longueur 10 pour 99999999999999999
Longueur 10 pour 999999999999999999
Longueur 11 pour 9999999999999999999
Longueur 11 pour 99999999999999999999
Longueur 12 pour 999999999999999999999
Longueur 12 pour 9999999999999999999999
Longueur 13 pour 99999999999999999999999
Longueur 13 pour 999999999999999999999999
Longueur 14 pour 9999999999999999999999999
Longueur 14 pour 99999999999999999999999999
Longueur 15 pour 999999999999999999999999999
Longueur 15 pour 9999999999999999999999999999
Longueur 16 pour 99999999999999999999999999999
Longueur 16 pour 999999999999999999999999999999
Longueur 17 pour 9999999999999999999999999999999
Longueur 17 pour 99999999999999999999999999999999
Longueur 18 pour 999999999999999999999999999999999
Longueur 18 pour 9999999999999999999999999999999999
Longueur 19 pour 99999999999999999999999999999999999
Longueur 19 pour 999999999999999999999999999999999999
Longueur 20 pour 9999999999999999999999999999999999999
Longueur 20 pour 99999999999999999999999999999999999999
Longueur01 3
Longueur10 3
PL/SQL procedure successfully completed.
ROLAP (signification) Relational online analytical processing.
MOLAP (signification)Multidimensional online analytical processing.
ORA-01410Je transfère pour les besoins de mon application des données exportées sous ORACLE 7.3.2.3.1 Server Workgroup et je les importe ensuite sous ORACLE 8i. Tout cela dans un environnement Windows NT4 ou Windows2000. Sur certaines des tables importées, lors de update j'ai le message: ORA-01410: ROWID non valide et les updates ne se font pas. Ce message, n'est pas systématique et un update sur un même champ peut marcher une fois et pas la seconde.
C'est plus que probable un problème de index foireux (corrompu). Regardez dans alert.log de l'instance réceptrice les éventuels messages d'erreur. Analysez la ou les tables (analyze table xxx validate structure) et aussi les index associés: analyze index xxx avec les bons paramètres. La solution serait de droper l'index et le recréer, non le rebuilder. Ou en 8i (cible) alter index xxx rebuild tablespace (une autre).
Si la table n’a pas d’index, c’est plus grave : il s’agit peut-être d’une corruption du dictionnaire. L’erreur indique que le rowid choisi lors de l’import ne peut pas être converti en une adresse légale de ligne de table. Pour creuser plus loin, mettre l’instance en sql_trace pour l’import, ou bien mettre l’event 10046 au niveau 4 et vérifier ce qui se passe lors de l’apparition de l’erreur.
Globalement, si validate structure de la table n’aboutit pas, il se peut que vous soyez obligé de la récréer d’un export récent.
Analyze table XXX validate structure. Si OK, analyze table XXX compute statistics. Si OK, OK Si KO, tracer Si KO, KO Chercher aussi le bug 497997 sur Metalink.
Forcer l'écriture dans la trace [12/10/2003]
On peut forcer l'écriture dans un fichier de trace avec :
Dbms_system.ksdwrt(2,'TAFORA: Message dans alert.log') Dbms_system.ksdwrt(1,'TAFORA: Message dans fichier trace.log') Dbms_system.ksdwrt(3,'TAFORA: Message dans alert.log ET dans trace') |
||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||