Freitag, 1. September 2017

Laufzeiten umrechnen, Sekundenangaben lesbar darstellen

Hintergrund:
Laufzeiten von diversen Prozessen werden (Tool-)intern in Sekunden gemessen und meist auch so dargestellt.

Für Weiterberechnungen und Auswertungen ist das Ideal. Der Lesbarkeit für den geneigten Nutzer nur bedingt dienlich. Wer erkennt schon auf den ersten Blick, wie lange 14.738sec sind? Lang halt.

Lösungsansätze:
Für die Lesbarkeit, kann man diese Werte natürlich entsprechend umrechnen.
Aber wie?
14.738sec vermutlich am Besten in Stunden: 14.738/60/60 = 4,0939 Stunden -> Aha.

Aber was ist mit 249sec? 249/60/60 = 0,069 Stunden - Wie lang bitte sind 0,069Std?
249sec also besser in Minuten umrechnen: 249/60 = 4,15 Min -> schon besser

Also per CASE-Statement die unterschiedliche großen Sekundenangaben passend umrechnen? Nicht schön und umständlich.

Netterweise bietet Oracle mit der to_date()-Funktion auch den Formatstring 'sssss' (5x kleines 's').
Per to_char(to_date(14768,'sssss'),'HH24:MI:SS') werden aus den Sekunden ein "Datum", dass dann wie bekannt formatiert werden kann.

Als SQL:
select 
14738 Dauer1, 
to_char(to_date(14768,'sssss'),'HH24:MI:SS') Dauer1_lesbar,
249 Dauer2, 
to_char(to_date(249,'sssss'),'HH24:MI:SS') Dauer2_lesbar
from dual;

    DAUER1 DAUER1_LESBAR     DAUER2 DAUER2_LESBAR
---------- ------------- ---------- -------------

     14738 04:06:08             249 00:04:09     


Ein eleganter Weg für kurze und lange Laufzeiten.

Einschränkung: Dies klappt bei Laufzeiten von unter 24 Stunden. Bei Sekundenangaben über 86399 (= 24h) gibt es ORA-01853.

Dienstag, 22. August 2017

Index-Nutzung prüfen

Um zu prüfen, ob ein Index benutzt worden ist, kann mit folgendem Script ein Monitoring an geschaltet werden:

select 'alter index usr.'||index_name||' monitoring usage;' Txt from ALL_INDEXES where table_owner = 'ABC' and table_name like 'T_%';

ausschalter per ... nomonitoring usage


Die eigentliche Prüfung erfolgt per:

bis Oracle 12: select * from v$object_usage;
ab Oracle 12: select * from user_object_usage;


Bis einschl. Oracle 12.1 wird hierfür der Ausführungsplan vom SQL-Parsing genutzt. Ab Oracle 12.2 wird die Laufzeit hierfür genutzt, d.h. die Auswertung wird wesentlich genauer.

Generell gilt: "Use index monitoring as a guide line, not an absolute."



weitere Infos z.B. https://oracle-base.com/articles/10g/index-monitoring

Mittwoch, 21. Juni 2017

drop column und ORA-39726 bei komprimierten Tabellen

Problem:


DROP COLUMN scheitert mit ORA-39726
"Nicht unterstützter Vorgang ... bei komprimierten Tabellen"
-> Blöd, wer hat eigentlich die Komprimierung eingeschaltet? Und warum?


Lösung:

Wenn die Tabelle nicht per DROP und CREATE komplett neu erstellt werden kann (oder soll) wirds etwas aufwändiger:

1) Spalte auf unused setzen:
alter table D_TBL set unused column X_FLAG ;

select * from all_unused_col_tabs;
-> hier sollten nun je Tabelle die Anzahl der nicht benutzten Spalten stehen.

2) Unbenutzte Spalten löschen:
alter table D_TBL drop unused columns;


Falls das nicht hilft (wg. Partitionierung???):

1) Kompression ausschalten (mit MOVE und ggfs parallel X!):
alter table D_TBL move nocompress;
bzw.
alter table D_TBL move partition P_XYZ nocompress;

2) dann unbenutzte Spalten löschen:
alter table D_TBL drop unused columns;

3) Kompression wieder einschalten (mit MOVE und ggfs parallel X!):
alter table D_TBL move compress;
bzw.
alter table D_TBL move partition P_XYZ compress;



Falls das eleganter geht, bin ich für Hinweise dankbar!

Dienstag, 17. März 2015

BI Publisher - Bursting

...ziemlich versteckt sind die Optionen zum Aktivieren des Bursting von Reports:

... dann klappts auch mit dem Bursting! :-)
(OBIEE 11.1.1.7)