Join über mehrer Tabellen

Hallo,
ich hab folgendes SQL Statement das auf Oracle läuft.
Leider ist es wegen der Subselects zu langsam.

Wie kann man das optimieren ? Schön wäre es wenn man Webobjects, metadainst und metadatamemb irgend wie join’en könnte.
Nur weiss ich leider nicht wie …

Uwe

SELECT ID FROM WEBOBJECTS WHERE Subtype=7 AND Type=2 AND Name not like ‚sub_%‘ and id in (select parentobject_id from metadatainst left outer join metadatamemb on metadatamemb.instance=metadatainst.id where parentobject_id=webobjects.id and ClassName=‚Events.Event‘ and MemberName=‚ort‘ and Value=’„2701:46“’ )

and id in (select parentobject_id from metadatainst left outer join metadatamemb on metadatamemb.instance=metadatainst.id where parentobject_id=webobjects.id and ClassName=‚Events.Event‘ and MemberName=‚ort_zusatz‘ and Value=’""’ )

and id in (select parentobject_id from metadatainst left outer join metadatamemb on metadatamemb.instance=metadatainst.id where parentobject_id=webobjects.id and ClassName=‚Events.Event‘ and MemberName=‚vonmsec‘ and IntValue=‚1151272800‘) ORDER BY WEBOBJECTS.name

Hallo,
ich hab folgendes SQL Statement das auf Oracle läuft.
Leider ist es wegen der Subselects zu langsam.

Wie kann man das optimieren ? Schön wäre es wenn man
Webobjects, metadainst und metadatamemb irgend wie join’en
könnte.
Nur weiss ich leider nicht wie …

Uwe

Hallo,

du solltest versuchen, ohne das LIKE auszukommen: SUBSTR(name,4) != ‚sub_‘. Sonnst macht die DB einen FUll Table Scan.
Damit das aber etwas bringt, musst du noch einen Function Based Index erstellen:
CREATE INDEX xxx ON webobjects (substr(name,4));
und du musst dem Benutzer das Recht QUERY REWRITE geben und den Server mit QUERY_REWRITE_ENABLED = true und QUERY_REWRITE_INTEGRITY = trusted wieder neu hichfahren (init.ora) Jetzt wird der neue Index benutzt.

SELECT ID FROM WEBOBJECTS WHERE Subtype=7 AND Type=2 AND Name
not like ‚sub_%‘ and id in (select parentobject_id from
metadatainst left outer join metadatamemb on
metadatamemb.instance=metadatainst.id where
parentobject_id=webobjects.id and ClassName=‚Events.Event‘ and
MemberName=‚ort‘ and Value=’„2701:46“’ )

Hier würde ich auch schauen, welche der Attribute bereits in einem Index stenen und die fehlenden ergänzen:
Mach einen Index für ClassName, MemberName, Value. Und über parentobject_id. Der Rest sollte eh im Primärschlüssel sein.

and id in (select parentobject_id from metadatainst left outer
join metadatamemb on metadatamemb.instance=metadatainst.id
where parentobject_id=webobjects.id and
ClassName=‚Events.Event‘ and MemberName=‚ort_zusatz‘ and
Value=’""’ )

Hier genauso

and id in (select parentobject_id from metadatainst left outer
join metadatamemb on metadatamemb.instance=metadatainst.id
where parentobject_id=webobjects.id and
ClassName=‚Events.Event‘ and MemberName=‚vonmsec‘ and
IntValue=‚1151272800‘) ORDER BY WEBOBJECTS.name

Gruß

Peter