Announcement

Collapse
No announcement yet.

Perfomance / Tuning in Select Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Perfomance / Tuning in Select Abfrage

    Hi,
    <br>
    <br>Betreff:
    <br>Select Abfrage mit vielen Tabellen (ca. 7) und zwei Views untereinander mit outer Joins verknüpft. Die Select Abfrage wird im Programm dynamisch erstellt und die Bedingungen in der Where Klausel dynamisch spezifiziert. Aus dem Grund sollte die Abfrage nicht von der folgenden Form abweichen:
    <br>Select ... From ... Where... Group By...
    <br>
    <br>Diese Abfrage dauert viel zu lange.
    Festmachen kann man das ganze an einer Tabelle und einer View.
    <br>Bsp.:
    <br>So soll es sein, dauert jedoch sehr lange.
    <br>Select T.ID1 From
    <br>T, V
    <br>Where
    <br>T.ID1 = V.ID1 (+)
    <br>and T.ID2 = V.ID2 (+)
    <br>and V.ID1 = 4711
    <br>
    <br>So geht es sehr schnell.
    <br>Select T.ID1 From
    <br>T, V
    <br>Where
    <br>T.ID1 = V.ID1
    <br>and T.ID2 = V.ID2
    <br>and V.ID1 = 4711
    <br>
    <br>In der View wird über ein Union auch auf die Tabelle T zugegriffen (wenn man das erste Select verwendet wird dann immer ein Access Full Tabel gemacht).
    <br>Die Tabelle T und und eine andere Tabelle in der View bestitzen ca. 100000 Datensätze, was aber für einen richtigen Server ja keine Hürde darstellen sollte.
    <br>
    <br>Was mich ein wenig stört, ist das Oracle bei dem ersten Select Statement anscheinend zu erst den Join über alle Daten macht, und erst dann die Filter einsetzt. Es wäre viel intelegenter, zu erst mal alle Kriterien zu berücksichtigen und danach den outer join zu machen.
    <br>Wie kann ich z.B. Oracle dazu bringen zu nächst mal die einzelnen Datenmengen zu filtern und das die Ergebnisse, die nur noch sehr gering sind (100 datensätze, wenn es doch mehr sind, kann man immer noch die schlechtere Perfomance mit der zu berücksichtigen Datenmenge argumentieren werden, aber nicht wenn die Rückgabe nur zwei drei Datensätze sind), zu joinen?
    <br>Gibt es gute Bücher zu diesem Thema?
    <br>Wer kann mir direkt weiterhelfen?
    <br>
    <br>Danke!
    <br>
    <br>mfg
    <br>PS

  • #2
    Hallo Patrick,

    Oracle-SQL-Tuning ist ein weites Feld und es viele "Schräubchen" an denen man drehen kann.
    In deinem Fall verwendet der Oracle-Server bei den Outer-Joins sicherlich die Primary-Key-Indizes nicht mehr und macht einen Full-Table-Scan. Evtl. helfen dabei ein paar Hints an den Otimizer weiter. <I>select /*+ RULE */ T.ID1 from ...</I> zwingt den Optimizer z.B. das Regelbasierte Model zu verwenden - dabei werden eher Indizes verwendet. Meist hilft auch ein Blick in den ExecutionPath des Statements, um zu sehen wo der Hase im Pfeffer (bzw. der Full-Table-Scan ;-) liegt.

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Patrick,

      hab mir dein Bsp. nochmal angesehen. Der Ausdruck: <br>
      T.ID1 = V.ID1 (+) <br>
      and T.ID2 = V.ID2 (+) <br>
      and V.ID1 = 4711 <br>
      macht keinen Sinn, da er sich auf
      T.ID1 = 4711 <br>
      and T.ID2 = V.ID2 (+) <br>
      reduzieren läßt, mit dem Nachteil das das (+) dafür sorgt das für T.ID1 = 4711 kein Index verwendet, sondern ein Full-Table-Scan gemacht wird.
      Ich habe die Erfahrung gemacht, das es die besten Ergebnisse bringt die Bedingungen soweit wie möglich zusammenzufassen und dann die zuerst anzusetzen, die die Datenmenge am weitesten einschräncken.

      Gruß Fal
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Patrick,

        was dir evtl. helfen könnte sind in-line views:

        Du baust das statement folgendermassen auf...
        select alle_relevanten_spalten
        from (select * from t where und_hier_die_relevaten_einschränkungen_für_tabelle _t) tt,
        (select * from v where dito_für_v) vv
        where und_hier_die_outer_joins

        Die Oracle Engine wird zunächst die inline-views aufbauen, so das die zu joinende Menge an Daten deutlich geringer ausfällt.

        Wenn die View Dich dann immer noch ausbremst, könntest Du Sie in Dein Statement integrieren. Macht zwar mehr arbeit, aber die evtl. Probleme sind dann offensichtlich und behebbar.

        Grüße

        Michae

        Comment


        • #5
          Hi,
          <br>
          <br>Danke für die Antworten.
          <br>
          <br>Lang ist's her aber ich glaube auch das hatte ich getestet. Nachteilig war, das auch in den in-line views wieder um in-line views enthalten waren. Beim nächsten mal werde ich das mit den in-line views nochmal genauer kontrollieren.
          <br>
          <br>Danke!
          <br>
          <br>mfg
          <br>P

          Comment

          Working...
          X