[Oracle 8.1] Snel alternatief voor left join

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Toink
  • Registratie: Januari 2000
  • Niet online
Voor een klus zit ik op een Oracle 8.1 db te werken en hierop wil ik een aantal analyses doen. Normaal maak ik gebruik van left joins (mede omdat die snel werken).

Echter, Oracle 8.1 kent blijkbaar geen left joins dus moet ik terug vallen op andere statements zoals een select in een select statement.

Ik bedoel dus iets als:
select *
from (select * from table1 where voorwaarde)a, (select * from table2 where voorwaarde)b
where a.field = b.field

Nadeel is dat deze statement tergend traag is ivm het aantal records in de tabellen. Als ik me niet vergis wordt query 2 voor elke waarde van query 1 uitgevoerd.

Heeft iemand een idee voor een sneller alternatief?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Toink schreef op maandag 08 december 2008 @ 10:46:
Voor een klus zit ik op een Oracle 8.1 db te werken en hierop wil ik een aantal analyses doen. Normaal maak ik gebruik van left joins (mede omdat die snel werken).
Whuh :?
Ik mag hopen dat je left joins gebruikt als de situatie dat vereist, inner joins wanneer die weer nodig zijn enz. Of gebruik je ook altijd een hamer als je een schroef in de muur wilt hebben?

Ik ben overigens niet zo bekend met Oracle, maar het lijkt me stug dat ze geen left joins zouden begrijpen: http://www.dba-oracle.com/tips_oracle_left_outer_join.htm

[ Voor 23% gewijzigd door RobIII op 08-12-2008 10:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Probeer eens 'left outer join' ipv 'left join'. De laatste is slechts een verkochte schijf wijze, net zoals 'join' wordt omgezet naar 'inner join'.

Beide 'subqueries' zullen elk eenmalig worden uitgevoerd, B heeft namelijk geen directe relatie met A en is er dus geen noodzaak om 'B' meerdere keren uit te voeren. Maar omdat je twee subqueries aan elkaar joined vermoed ik dat Oracle geen gebruik kan maken van zijn indexen bij het samenvoegen van de resultaten..

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Toink
  • Registratie: Januari 2000
  • Niet online
RobIII schreef op maandag 08 december 2008 @ 10:50:
[...]

Whuh :?
Ik mag hopen dat je left joins gebruikt als de situatie dat vereist, inner joins wanneer die weer nodig zijn enz. Of gebruik je ook altijd een hamer als je een schroef in de muur wilt hebben?

Ik ben overigens niet zo bekend met Oracle, maar het lijkt me stug dat ze geen left joins zouden begrijpen: http://www.dba-oracle.com/tips_oracle_left_outer_join.htm
Uiteraard maak ik gebruik van het juiste type join voor een bep. situatie :), dit is alleen een geschetst voorbeeld. Zoeken op Google levert in elk geval op dat ik niet de enige ben die hiermee worstelt.

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Toink schreef op maandag 08 december 2008 @ 10:46:

Ik bedoel dus iets als:
select *
from (select * from table1 where voorwaarde)a, (select * from table2 where voorwaarde)b
where a.field = b.field
Wat wil je precies. Dit voorbeeld is namelijk al uit te schrijven als

select *
from table1 a, b
where a.field = b.field
and a.voorwaarde
and b.voorwaarde


OF.. bedoeld je
and the outer join returns these missing columns as NULL values.
of met een outer join: (truuk die werkt, maar niet standaard sql is:)


select *
from table1 a, b
where a.field = b.field(+)
and a.voorwaarde
and NVL(b.veld,'OK')='OK')

of...
http://www.adp-gmbh.ch/ora/sql/outer_join.html

(als je de voorwaarde uit de "from" kunt tillen altijd doen.

[ Voor 32% gewijzigd door leuk_he op 08-12-2008 13:43 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Toink
  • Registratie: Januari 2000
  • Niet online
Wat ik wil bereiken is dat deze tergend trage query sneller wordt. Oracle 8.1 herkent geen left join, left outer join, enz. De variant met de (+) werkt trouwens wel zie ik net.

Kortom: hoe maak ik deze query sneller?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Toink schreef op dinsdag 09 december 2008 @ 08:00:
De variant met de (+) werkt trouwens wel zie ik net.

Kortom: hoe maak ik deze query sneller?
Je zegt net dat de (+) variant wel werkt :? Heb je ook naar de link gekeken die ik gaf? En als de query traag is, heb je dan ook eens gekeken naar je indexen e.d.?

[ Voor 11% gewijzigd door RobIII op 09-12-2008 08:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 25-09 22:16

The Eagle

I wear my sunglasses at night

^^^ Met stom. Trage queries zijn iha vrij snel op te lossen met indexen :) En dan moet ik ook meteen toegeven dat Oracle 8i best wel een bitch kan zijn t.a.v indexen icm de optimizer ;)

Waar je ook even naar kunt kijken is het meegeven van de zgn hints. Dan forceer je de uitvoering van een query op een bepaalde wijze.

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Toink
  • Registratie: Januari 2000
  • Niet online
Bedankt voor de tips. De variant met (+) werkt inderdaad als een left/right join maar snelheid levert dat niet op. Dat heb ik ook uit de link gehaald die je doorstuurde.

Men werkt hier niet voor niets met Oracle 8.1. Er hangt een systeem aan dat niet met een nieuwere versie overweg kan en dan valt alles om, vandaar dat men 8.1 blijft gebruiken.

Om technische redenen heeft men ook geen indexen op de tabellen zitten maar dat gaat wat ver om hier te bespreken, laten we het erop houden dat ik hier totaal geen invloed op uit kan oefenen dus ik moet het er mee doen.

[ Voor 33% gewijzigd door Toink op 09-12-2008 13:22 ]


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Toink schreef op dinsdag 09 december 2008 @ 13:19:
Om technische redenen heeft men ook geen indexen op de tabellen zitten maar dat gaat wat ver om hier uit te kauwen.
Dan moet hij hoe dan ook full table scans doen en als je die joint wordt dat een hele grote set die langzaam wordt. heeft niks met left join te maken.

(non -unique?) Indexen op de foreign keys toevoegen gaat werken. (Een tip die verder ook onafhankelijk van oracle versie is, en zelfs toepasbaar is voor andere databases zoals mysql)


ik vind "Om technische redenen " op positie 12 van de dooddoeners terug... :9 :P :'(

Als je toch vind daar geen invloed op te kunnen uitoefenen is het wellicht nuttig de data te copeiren naar een tabel waar je wel invloed op hebt en daar je queries op draaien. Of eens te zoeken op een materialized view die de querie resultaten opslaat in een tussen opslag.

[ Voor 17% gewijzigd door leuk_he op 09-12-2008 13:31 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 25-09 22:16

The Eagle

I wear my sunglasses at night

Toink schreef op dinsdag 09 december 2008 @ 13:19:
Bedankt voor de tips. De variant met (+) werkt inderdaad als een left/right join maar snelheid levert dat niet op. Dat heb ik ook uit de link gehaald die je doorstuurde.

Men werkt hier niet voor niets met Oracle 8.1. Er hangt een systeem aan dat niet met een nieuwere versie overweg kan en dan valt alles om, vandaar dat men 8.1 blijft gebruiken.

Om technische redenen heeft men ook geen indexen op de tabellen zitten maar dat gaat wat ver om hier te bespreken, laten we het erop houden dat ik hier totaal geen invloed op uit kan oefenen dus ik moet het er mee doen.
Het systeem dat je noemt klinkt eerder als incompetent management / databasebeheerders die een andere versie niet snappen dan als een technische reden. Oracle 9 kan prima in een 8i modus werken, zelfs bij 10g kan dat nog - al heb je in dat laatste geval idd wel een leuke uitdaging te pakken in het performerend werkend krijgen van je systeem ;)

Geen invloed op uitoefenen herken ik wel, maar een goede oplossing bieden voor een structureel probleem zal zeker gewaardeerd worden :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • Toink
  • Registratie: Januari 2000
  • Niet online
Neem maar van mij aan dat ik exact dezelfde ideeen deel :) . Database van het type veel te groot, dus lokaal kopieren is niet te doen. Upgraden is ivm grootte organisatie een project van minimaal een jaar en ga zo maar door.

Kortom: Soms dan zit je gewoon in een situatie waar je duidelijk een mening over hebt (en die ook geeft waar nodig) maar waar je op korte termijn even niks aan kan veranderen en je toch behoefte hebt aan informatie/antwoorden. Maar bedankt voor het meedenken!
Pagina: 1