Oracle
Nächste Beiträge »Oracle: Kalenderwoche (KW) in Datum umrechnen
Mittwoch, 01.07.2009In Oracle kann aus einer Kalenderwoche (KW) einfach das Startdatum und Enddatum berechnet werden:
SELECT
TRUNC(TO_DATE('25112009', 'DDMMYYYY'), 'IYYY') + (26 - 1) * 7 AS date_from,
TRUNC(TO_DATE('25112009', 'DDMMYYYY'), 'IYYY') + (26 - 1) * 7 + 6 AS date_to
FROM sys.dual;
Das Beispiel gilt für die Woche 26/2009. Für andere Kalenderwochen ändern Sie bitte beide Werte “26″ im SQL Statement in Ihre gewünschte Woche um. Das Jahr (im Beispiel “2009″) ggf. ebenfalls angepasst werden.
Das folgende Beispiel zeigt Ihnen den Aufbau der Query:
SELECT
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;
Dabei ist das Datum im SQL Befehl (hier der 25.11.) unwichtig.
Oracle: Stored Procedures auflisten
Mittwoch, 27.05.2009Mit dem folgenden SQL Script können Sie alle in der Datenbank gespeicherten Stored Procedures (SP) auflisten:
select * from user_procedures
Oracle: Beschreibung (Aufbau) einer Tabelle per SQL Befehl
Montag, 25.05.2009Mit dem Befehl
desc Muster
wird Ihnen der Aufbau der Tabelle “Muster” angezeigt.
Folgende Daten werden als Liste angezeigt:
- Table
- Column
- Datentyp
- Länge
- Gesamtstellenzahl
- Anzahl Nachkommastellen
- Primärschlüssel
- Auf Null setzbar
- Standard
- Kommentar
Oracle: Zahl mit führenden Nullen
Freitag, 10.04.2009Wenn Sie eine Zahl mit führenden Nullen auffüllen möchten, nutzen Sie folgenden Befehl:
select to_char(zahlfeld, '000000')
Würde als Beispiel im Feld “Zahlfeld” eine 2 stehen, erhalten Sie 000002.
Oracle: sqlplus mit Benutzernamen & Passwort starten
Sonntag, 05.04.2009Wenn Sie unter Oracle das SqlPlus Programm als sysdba (Datenbank-Administrator) starten möchten, dann nutzen Sie folgende Befehle:
Bei Oracle 8.0 (Clientversion): sqlplus 'sys/oracle@datenbank as sysdba'
Bei Oracle 8i: (Meist geht auch die Eingabe wie unter Oracle 8.0) sqlplus \"sys/oracle@datenbank as sysdba\"
Bei Oracle 9i: sqlplus "sys/oracle@datenbank as sysdba"
Oracle: Performance von Sortierungen messen (In-Memory Sort Ratio)
Donnerstag, 02.04.2009Mit dem folgenden SQL Befehl können Sie auf Ihrer Oracle Datenbank prüfen, wie der “In-Memory Sort Ratio” auf Ihrem Datenbankserver ist:
SELECT a.value/(b.value + a.value) "Sort Ratio" FROM v$sysstat a, v$sysstat b WHERE a.name = 'sorts (memory)' AND b.name = 'sorts (disk)'
Ihnen wird als Ergebnis eine Zahl angezeigt.
Bei gut optimierten Datenbanken liegt der “In-Memory Sort Ratio” über 0,95 (also 95%).
Im Beispiel würde es bedeuten, dass mehr als 95 % sämtlicher Sortieraktionen im Hauptspeicher stattfinden.
Oracle: MERGE Beispiel
Mittwoch, 01.04.2009Um Daten automatisch entweder in die Tabelle einzufügen oder upzudaten, können Sie den MERGE Befehl von Oracle nutzen. Im folgenden PHP-Beispiel wird die Nutzung verdeutlicht. Dabei ist zusätzlich eine automatische Löschung des Datensatzes eingebaut, wenn kein Benutzername übergeben wurde (Erklärung s.u.):
foreach ($users as $id => $username) {
if (empty($username))
$sql = "DELETE FROM users WHERE id = $id";
else {
$sql = "MERGE INTO users U
USING dual ON (dual.dummy is not null and U.id = $id)
WHEN MATCHED
THEN UPDATE SET name = $username
WHEN NOT MATCHED
THEN INSERT (id, name) VALUES ($id, $username)";
}
}
Als SQL Beispiel:
MERGE INTO users U USING dual ON (dual.dummy is not null and U.id = 10) WHEN MATCHED THEN UPDATE SET name = 'Max Muster' WHEN NOT MATCHED THEN INSERT (id, name) VALUES (10, 'Max Muster')
Das Script sucht nach dem Benutzer mit der ID “10″. Wird er gefunden, dann wird der Name per UPDATE geändert. Wird der Eintrag nicht gefunden, dann wird per INSERT ein entsprechender Datensatz angelegt.
Bei Fragen oder Anmerkung schreiben Sie uns gerne einen Kommentar.
Wir freuen uns auch über Einträge, wenn Ihnen dieser Artikel half.
Oracle: Optimierung von SQL Befehlen durch entfallende Sortierungen
Dienstag, 31.03.2009Die folgenden Oracle Befehle lösen (je nach Umfang aufwändigere) Sortierungen aus:
- ORDER BY
- GROUP BY
- SELECT DISTINCT
- CREATE INDEX
- ANALYZE
- UNION
- INTERSECT
- MINUS
- JOIN
Nur Joins von Tabellen mit nicht indexierten Spalten
Bei großen Datenmengen können diese Befehle / Optionen so aufwändig werden, dass Sie mehrere Sekunden bis Minuten nur wegen der Sortierung warten. Kombinieren oder kapseln Sie diese Befehle noch, vervielfacht sich der Rechenaufwand für den Datenbankserver und die performance sinkt dementsprechent stark.
Um die Performance zu verbessern, können Sie folgende Maßnahmen umsetzen:
- Sortiervorgänge vermeiden
Das Vermeiden der Sortiervorgänge ist die erste (und beste !) Maßnahme.
Die folgenden Punkte geben einige Hinweise, wie Sie Sortiervorgänge vermeiden können:- Benutzen Sie UNION ALL anstelle von UNION (nicht immer möglich)
- Indizieren Sie alle Tabellen (Felder), die Sie in einer Join-Operation verwenden
- Spalten, die Sie in ORDER BY und GROUP BY Funktionen verwenden, sollten mit einem Index versehen werden
- Benutzen Sie den COMPUTE Befehl für die Analyse von Tabellen und Indizes
- Vergrößerung der Sort Area
Seit Oracle9i ist der Initialisierungsparameter “PGA_AGGREGATE_TARGET” verfügbar. Dieser legt fest, wie viel Hauptspeicher in der PGA für alle Serverprozesse der Instanz zur Verfügung gestellt wird. Oracle versucht dabei, dass die Größe des Private Memorys nicht über diese Größe hinaus anwachsen zu lassen.
Um diesen Parameter festzulegen bestimmen Sie bitte, wieviel Hauptspeicher der Oracleinstanz zur Verfügung steht. Subtrahieren Sie davon die Größe der SGA. Den Rest können Sie im Parameter PGA_AGGREGATE_TARGET festlegen.
Hinweis:
Seien Sie bei der Definition der Sort Area Größe vorsichtig !
Beachten Sie, dass eine Sort Area pro Benutzer angelegt wird. Bei 1000 Benutzern und einer Sort Area Größe von einem MB wird ca. ein GB Hauptspeicher belegt – wenn alle Benutzer gleichzeitig sortieren sollten.
Beachten Sie auch unseren Artikel zur Messerung der Sortierperformance.
Oracle: Monat aus einem Datum extrahieren
Donnerstag, 26.03.2009Um aus einem Datum den Monat zu erhalten, hilft der folgende Oracel SQL-Befehl:
to_number(to_char(Datumfeld, 'n'))
Beispiel:
Möchte man wissen, ob das Datum im Feld “Startdatum” im August liegt:
to_number(to_char(Startdatum, 'n')) = 8
Oracle: Create Tablespace
Donnerstag, 19.03.2009Um Tablespace auf einem Oracle System anzulegen, nutzen Sie folgenden Befehl:
CREATE TABLESPACE user_ts DATAFILE 'c:\oracle\oradata\ora\userts.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M
Dieses Beispiel erzeugt Tablespace …
- mit dem Namen “user_ts”
- in der Datei “c:\oracle\oradata\ora\userts.dbf”
- mit einer Anfangsgröße von 100 Megabyte (MB)
- einer automatischen Vergrößerung bei Bedarf um jeweils 50 MB