Category Archives: Oracle

Discoverer 9i unter Windows 7 (32 Bit) installieren

Eine Installation von Oracle Discoverer 9i (End-User) unter Windows 7 (32 Bit) ist wie folgt möglich:

1.) Kopieren der Installationsdateien in einen Lokalen Ordner. (Kein Netzlaufwerk!!!)

2.) Kompatibilitätsmodul (Eigenschaften) der setup.exe (…\install\win32\…) auf “XP – Service Pack 3″ setzten und übernehmen.

3.) setup.exe ausführen und Installation wie gewohnt durchführen.

Bei mir hat die Installation funktioniert. Leider kommt beim starten ein Hinweis das die Registry nicht aktualisiert werden kann. Das ist aber kein Problem.

Notwendige Patchs können nach dem oben beschriebenen Verfahren ebenfalls installiert werden.

Forms 6i unter Windows 7 (32 oder 64 Bit)

Forms 6i unter Windows 7 (64 Bit) zu installieren ist möglich. Mann muss nur beachten, dass bei der Installation kein Registry-Baum “Oracle” aufgebaut wird. Diesen kann man aber aus einer bestehenden Installation importieren. Am besten man installiert Forms6i & Reports erst auf einem 32-Bit System (am besten auch Windows 7) und exportiert den Oracle-Baum aus der Registry und sichert diesen als Default. Anschließend den Oracle-Baum auf dem 64-Bit System importieren.

Die eigentliche Installation läuft Problemlos durch.

Was ich noch nicht getestet habe ist das nachträgliche einspielen von Patches unter Windows 7 (64 Bit). Evtl. hat das jemand schon gemacht und kann berichten.

Viel Erfolg allen die eine Client-Server Umgebung schätzen.

WITH-Klausel

In der Praxis trifft man von Zeit zu Zeit auf aufgeblaehte SQL-Queries, die ausserordentlich kostenintensiven und langwierigen Ausfuehrungsplaenen folgen.
Zeigt eine weitergehende Analyse, dass die komplexe Abfrage eine oder mehrere Subqueries enthaelt, die mehrfach ausgefuehrt werden, dann besteht eine sehr
gute Chance durch Verwendung der sogenannten WITH-Klausel, die Performance der Abfrageausfuehrung erheblich zu steigern.

Im Kern wird die schnellere Ausfuehrung der Query dadurch realisiert, dass mittels der WITH-Klausel die Ergebnismenge der Subquery vorab materialisiert, mit einem Namen versehen und schliesslich in der Hauptquery abgegriffen wird.
Hier lohnt sich auch ein Vergleich und Gebrauch von "global temporary tables", die in Ihrer Funktions- und Wirkungsweise durchaus ähnlich sind:
Durch Entkopplung geeigneter Subqueries, die urspruenglich als Bestandteile einer komplexen Abfrage fungierten, wird dieses SQL-Statement vereinfacht.

WITH   SQ1 AS (SELECT...FROM...WHERE...),
       SQ2 AS (SELECT...FROM...WHERE...)
SELECT...
  FROM Q1, SQ1, SQ2 WHERE…

Interessanter Nebeneffekt:

Durch die Verwendung der WITH-Klausel wird anscheinend in einer Systemumgebung mit voreingestelltem CURSOR_SHARING=FORCE offensichtlich fuer die Query-Ausfuehrung diese systemweit gueltige Einstellung auf CURSOR_SHARING=EXACT zurueckgenommen (vergleichbar dem Einsatz des Hint /*+ cursor_sharing_exact */).

Zeigen die QEPs vorher noch eine allgemeine Ersetzung von Konstanten durch Parameter, so weisen die QEPs nachher die direkte Verwendung der Konstanten auf.

Somit orientiert sich der Optimizer auch grundsaetzlich an anderen Zugriffsstrategien.

Was in einer Umgebung mit problematischem Parseverhalten per Bindvariablen-Peeking einen "flüssigen" Anwendungsbetrieb ermöglichen kann, wird im Einzelfall einer komplexen Query unter Verwendung von Attributen mit stark ungleicher Werteverteilung zu relativ kostenintensiven QEPs führen.

Es empfiehlt sich dann für alle entsprechenden Konstanten/Parameter einen separaten und speziellen QEP zu erzwingen.

Vorraussetzung:

SQL-99 Standard bzw. Oracle9i Release 2

Links:

SQLStandards.html

to be continued….

MIN, MAX innerhalb eines SELECT-Statement

Manchmal benötigten man sowohl den kleinsten (min) als auch den größten (max) Wert einer indizierten Spalte gleichzeitig.


SELECT MIN(id) 
     , MAX(id) 
  FROM big_table

Bei diesem SELECT kommt zwar das richtige Ergebnis, dennoch kann die Antwortzeit sehr lange dauern. Der Grund liegt in einem FAST FULL INDEX SCAN.

Besser ist folgendes:

SELECT MIN(id) min_value 
  FROM big_table 
 UNION ALL 
SELECT MAX(id) max_value 
  FROM big_table

oder

SELECT (SELECT MIN(id) from big_table) min_value
      ,(SELECT MAX(id) from big_table) max_value 
  FROM dual

Bei beiden alternativen wird ein FULL INDEX SCAN durchgeführt und liefert das Ergebnis (fast) sofort zurück.
Den Umweg sollte man bei großen Tabellen und wo es auf Geschwindigkeit ankommt wählen.

Blockierende SQL-Session

Folgendes SQL-Statement kann man verwenden wenn man prüfen möchte ob es blockierende Sitzungen gibt.


SELECT
     , b.username blocking_username
     , b.osuser blocking_osuser
     , b.machine blocking_machine
     , b.program blocking_program
     , w.sid waiting_sid
     , w.username waiting_username
     , w.osuser waiting_osuser
     , w.machine waiting_machine
     , w.seconds_in_wait
  FROM v$SESSION w
     , v$SESSION b
 WHERE w.blocking_session is not NULL
   AND b.sid = w.blocking_session
 ORDER BY w.sid

Das Statement kann jederzeit um weitere Spalten erweitert werden.