Avatar billede mach3 Nybegynder
21. juni 2008 - 14:46 Der er 14 kommentarer og
1 løsning

For mange UNIONS i sql

Hej,

Jeg har mange forskellige sql statements hvis resultat jeg gerne vil have ud samlet.

Derfor har jeg lavet UNION ALL mellem all sql statements (de returnerer alle de samme kolonnner), men sagen er den at oracle løber tør for memory og giver en fejl.

Der er ca 2000 sql statements, hver især med en del joins.

Pt kører jeg alt sql inde i et sql vindue og klikker eksekver.

Er der nogen som har et forslag til, hvordan dette kan optimeres?

Jeg tænker på om det er muligt at sætte oracle i gang med at køre sql'en (evt i mindre dele) og så løbende smide resultaterne ind i en tabel som jeg så til sidst kan læse fra. Det gør ikke noget at det tager lang tid, bare den bliver færdig..

Takker.
Avatar billede Slettet bruger
21. juni 2008 - 15:19 #1
Måske kan du bruge pipelined functions?

Der er et eksempel i http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#LNPLS01210

Ideen er, at du laver en funktion, som kan trække dine rækker ud fra eet statement ad gangen, returnere een række ad gangen. Og så gå videre til næste statement. Du lavede jo en UNION ALL, så du har ikke behov for at vente på at alle statements evaluerer, før du kan tage resultatet.

Med pipelined functions kan du også nemmere organisere din kode. Du kan lave en generel funktion, som du kan tilsende de forskellige statements, en efter en.

Men måske har du andre behov? Hvordan bruger du data - skal de bare spooles ud i en fil, eller skal du arbejde videre med dem?

/Jørn
Avatar billede mach3 Nybegynder
21. juni 2008 - 15:38 #2
joern_h >> Tak for svaret.

Jeg kigger nærmere på dit link og melder tilbage.

Mit behov er at jeg blot skal læse resultatet. Jeg kopierer indholdet over i et regnearket, så det er rart hvis det kommer ud i en tabel.
Avatar billede mach3 Nybegynder
21. juni 2008 - 15:45 #3
Lige for at illustrere konceptet med union all, så kunne det sådan her ud:

SELECT 'test1', 'hej' FROM dual;

UNION ALL

SELECT 'test2', 'hej2' FROM dual;

UNION ALL

SELECT 'test3', 'hej3' FROM dual;

Og sådan fortsætter det ca 2000 gange...
Avatar billede Slettet bruger
22. juni 2008 - 14:16 #4
Du 'kopierer' over i et regneark?

Nu kender jeg ikke dit værktøj. Hvis det var mig ville jeg lave et script til SQL*Plus, hvor jeg ville lave 2000 separate statements. Pipelined functions kan efterligne dette ved at fyre dine statements af separat
Avatar billede _darkstar_ Nybegynder
22. juni 2008 - 18:25 #5
Hvordan i alverden er du endt med at have 2000 statements, der skal køres på en gang?
Det lyder ikke som om at du er ved at løse det rigtige problem.
Avatar billede steber Nybegynder
22. juni 2008 - 20:23 #6
Overser jeg noget eller skriver du ikke næsten løsningen selv: Udføre hver af dine 2000 SELECT's som en INSERT INTO i en tabel og så til sidst læse det hele fra denne tabel.
Hvis dette skal udføres af én bruger/session en gang i mellem er det ligefrem. Hvis det skal kunne køres af flere evt. samtidige brugere/sessioner, så kan du enten bruge en TEMPORARY table eller en normal tabel med en ekstra kolonne som skal indeholde en form for sessions-id for at flere sessioner ikke skriver og læser hinandens data. (Jeg selv foretrækker en normal tabel.)
Avatar billede arne_v Ekspert
22. juni 2008 - 20:30 #7
Og hvorfor skal det overhovedet hentes fra databasen ?

Dit eksempel henter udelukkende konstante værdier som er givet ved selve
SQL sætningen og er helt uafhængig af data i databasen.
Avatar billede mach3 Nybegynder
25. juni 2008 - 14:36 #8
Tak for svarene :-)

arne_v >>
[select from dual] er blot for eksemplets skyld. der hentes rent faktisk data fra databasen, men for at holde det relevant har jeg ikke postet det her.

darkstar og joern h>>
der er 2000 sql statements fordi de er blevet lavet gennem tiden, og alle resultater skal samles sammen for at kunne blive læst. derfor også regnearket.

spørg ind hvis der er mere.
Avatar billede Slettet bruger
25. juni 2008 - 15:41 #9
skal du have hjælp til at bruge SQL*Plus - Eller er du mere til grafiske brugergrænseflader?
Avatar billede mach3 Nybegynder
25. juni 2008 - 16:21 #10
joern h >>

jeg kender sql plus på brugerniveau.

er dit forslag, at jeg laver et langt script (hvor alle selects er udskiftet med insert into) og så kopierer det ind i sql plus og så eksekverer?
Avatar billede Slettet bruger
25. juni 2008 - 21:16 #11
0. Se manual for SQL*Plus: http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/toc.htm
1. lav en script-fil. du kan fx kalde den
  script.sql.
2. fra kommandolinie kører du scriptet med fx
  sqlplus joern_h/kodeord@mindatabase @script.sql
3. Den dannede fil 'result.csv' kan læses 'direkte' fra Excel.

Her er et eksempel på indhold i script.sql:

  spool result.csv
  set pagesize 0
  set heading off
  set feedback off
  set trimspool on
  set echo off
  set linesize 255
  set long 200
  set showmode off
  -- set sqlcontinue ''
  -- set sqlprompt ''
  set termout on
  set verify off
  prompt feltnavn1; feltnavn2
  select 'værdi' || ';' || 'værdi2'
  from dual;
  select 'værdi' || ';' || 'værdi3'
  from user_objects;
  ... osv ...
  exit
Avatar billede pnielsen Nybegynder
04. juli 2008 - 10:09 #12
>>men sagen er den at oracle løber tør for memory og giver en fejl.
Det forstår jeg så ikke helt ? Hvad fejl får du helt præcist? Hvad version af Oracle kører i ? Bruger i  PGA_AGGREGATE_TARGET eller SORT_AREA_SIZE til hver enkel session?
Din session burde ikke få mere end du har sat af til den - resten burde kunne klares via dit temporary tablespace. Så det undre mig du får mem errors...

Det store spørgsmål er om det skal være read consistent - altså alt sammen køre på samme tid? SqlPlus spool som beskrevet ovenfor med enkelte statements, kan kun bruges hvis du mener at det IKKE gør noget der evt sker ændringer i data mens dit job kører.

En lille note - vent med at spoole til efter alle set commands - så slipper du for dem i dit output.
Avatar billede mach3 Nybegynder
12. september 2008 - 00:23 #13
joern_h og steber >>

jep det var løsningen: at lave en insert into og så derefter læse fra tabellen.

beklager forsinkelsen. lukker nu. kom med svar.
Avatar billede Slettet bruger
12. september 2008 - 13:10 #14
svar :-)
Avatar billede mach3 Nybegynder
25. september 2008 - 21:59 #15
Tak! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester