SQL-Abfrage optimieren

  • Themenstarter Themenstarter Tobias Köhler
  • Beginndatum Beginndatum
T

Tobias Köhler

Hallo:)
Ich habe 5 Tabellen, die über PK und FK miteinander verknüpft sind. Momentan dauert mein SQL sehr lange, wie kann ich diese optimieren? Es handelt sich speziell um ein Insert(Oracle XE) Wahrscheinlich fehlt mir noch ein Begriff aus SQL, der mir dies wesentlich erleichtert. Am liebsten hätte ich auch alles in einer Abfrage, aber das ist wohl nicht möglich;)

Bisher meine SQLs:
1.
Code:
INSERT INTO ERP_ARTICLE(CLASS_ID, ORDER_NR, NOTATION, ARTICLE_TYPE) VALUES (1, 0000, 'bla', 'DG')
Die soll allerdings nur eingefügt werden, wenn es nicht bereits schon vorhanden ist

2.
Code:
INSERT INTO ERP_DG_LOT (ARTICLE_ID, DG_LOT_NAME) VALUES ((SELECT ARTICLE_ID FROM ERP_ARTICLE WHERE NOTATION='bla'), 'K070608DF')

3.
Code:
INSERT INTO ERP_DG_PRODUCTION (DG_LOT_ID, DG_FORMAT_ID, DG_PROD_DATE, DG_COUNT, DG_RELEASE, DG_AREA) VALUES ((SELECT MAX(DG_LOT_ID) FROM ERP_DG_LOT), (SELECT DG_FORMAT_ID FROM ERP_DG_FORMAT WHERE X=100 AND Y=40), 'K070608', 523, 'f', 186458)

Ich denke mal, die inneren Selects sind sehr zeitraubend, aber wie soll ich sonst an die Foreign Keys kommen?;) So geht es zwar, aber es dauert eben, und das ist nicht so gut:(
 
Hallo:)
Ich habe 5 Tabellen, die über PK und FK miteinander verknüpft sind. Momentan dauert mein SQL sehr lange, wie kann ich diese optimieren? Es handelt sich speziell um ein Insert(Oracle XE) Wahrscheinlich fehlt mir noch ein Begriff aus SQL, der mir dies wesentlich erleichtert. Am liebsten hätte ich auch alles in einer Abfrage, aber das ist wohl nicht möglich;)

Bisher meine SQLs:
1.
Code:
INSERT INTO ERP_ARTICLE(CLASS_ID, ORDER_NR, NOTATION, ARTICLE_TYPE) VALUES (1, 0000, 'bla', 'DG')
Die soll allerdings nur eingefügt werden, wenn es nicht bereits schon vorhanden ist

2.
Code:
INSERT INTO ERP_DG_LOT (ARTICLE_ID, DG_LOT_NAME) VALUES ((SELECT ARTICLE_ID FROM ERP_ARTICLE WHERE NOTATION='bla'), 'K070608DF')

3.
Code:
INSERT INTO ERP_DG_PRODUCTION (DG_LOT_ID, DG_FORMAT_ID, DG_PROD_DATE, DG_COUNT, DG_RELEASE, DG_AREA) VALUES ((SELECT MAX(DG_LOT_ID) FROM ERP_DG_LOT), (SELECT DG_FORMAT_ID FROM ERP_DG_FORMAT WHERE X=100 AND Y=40), 'K070608', 523, 'f', 186458)

Ich denke mal, die inneren Selects sind sehr zeitraubend, aber wie soll ich sonst an die Foreign Keys kommen?;) So geht es zwar, aber es dauert eben, und das ist nicht so gut:(

- Kannst du mal einen Trace der Statements erstellen und diesen hier posten ? So ohne weitere Info's wird es sonst schwierig resp. eher ein Ratespiel


Gruss
 
Achtung, doofe Frage: Wie erstellt man denn einen Trace:-(

- Ok, ein kleines Beispiel :


SQL*Plus: Release 9.2.0.8.0 - Production on Thu Nov 8 08:54:50 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL> ALTER SESSION SET SQL_TRACE=TRUE;

Session altered.

SQL> ALTER SESSION SET TIMED_STATISTICS=TRUE;

Session altered.

SQL> select count (*) from app_xml_event where eventtime > sysdate -10;

COUNT(*)
----------
1

SQL> exit


--> Jetzt sollte dein Trace-File (hier thldev9_ora_17036.trc) auf em Server liegen, bei der Enterprise Edition ist dies im Verzeichnis ...../udump...weiss nicht, wo es bei der Express liegt :-)

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Producti
on
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

--> Mit dem TKPRO Utillity kannst du das File noch in eine etwas lesbare Form bringen (Ich habe es noch etwas gekürzt)

oracle@CHTHL-TUX-ORACLE2:/usr/data/oracle/scripting/dba> tkprof /opt/oracle/adm
in/THLDEV9/udump/thldev9_ora_17036.trc trace.txt explain=m_ruma/m_ruma sys=no

TKPROF: Release 9.2.0.8.0 - Production on Thu Nov 8 09:02:35 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


oracle@CHTHL-TUX-ORACLE2:/usr/data/oracle/scripting/dba>

--und das Ergebnis (trace.txt) sieht nun folgendermassen aus :

--->>>


TKPROF: Release 9.2.0.8.0 - Production on Thu Nov 8 09:02:35 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Trace file: /opt/oracle/admin/THLDEV9/udump/thldev9_ora_17036.trc
Sort options: default


select count (*)
from
app_xml_event where eventtime > sysdate -10


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.02 4 66 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.15 32 49 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.02 0.18 36 115 0 1

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 75 (M_RUMA)

Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE
1 PARTITION RANGE ITERATOR PARTITION: KEY 61
1 INDEX FAST FULL SCAN EVENTTIME_IDX PARTITION: KEY 61 (object id 34028)


Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT GOAL: CHOOSE
1 SORT (AGGREGATE)
1 PARTITION RANGE (ITERATOR) PARTITION:KEY STOP=61
1 INDEX GOAL: ANALYZED (FAST FULL SCAN) OF 'EVENTTIME_IDX'
(NON-UNIQUE) PARTITION:KEY STOP=61




********************************************************************************

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.01 0.02 4 66 0 0
Execute 3 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.15 32 49 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 7 0.02 0.18 36 115 0 1


Gruss
 
Zuletzt bearbeitet:
Ok, bevor ich das prüfen kann^^: Ich kann ja noch gar nix hinzufügen, weil in der einen Tabelle Erp_Article irgendwann alle Möglichkeiten drin stehen. Gibt es für Oracle sowas wie "IF NOT EXISTS -> Insert"?
 
Bei Oracle/SQL gibt es sowas wie LAST_INSERT_ID().
Vielleicht hilft dir das, weil du dann im INSERT nicht noch die SELECT haben müsstest.
 
Hm, gut zu wissen, aber hilft mir hier leider nicht weiter. Da bleibt mir wohl nix anderes, also noch ne Abfrage zu machen und die Notations zu durchsuchen, ob das bereits vorhanden ist.
 
Ok, hab das jetzt mit einem boolean gelöst... Nun habe ich aber dieses SQL hier, was angeblich nicht in Ordnung ist:
Code:
String sqlLot = "INSERT INTO ERP_DG_LOT (ARTICLE_ID, DG_LOT_NAME) VALUES ((SELECT ARTICLE_ID FROM ERP_ARTICLE WHERE NOTATION = '" + notation + "'), '" + lotName + "')";

Leider finde ich da nix. Mir wird gesagt, dass die Rechte Klammer fehlt....?
 

Neue Beiträge

Zurück