Avatar billede amoelle Nybegynder
10. juni 2004 - 08:56 Der er 6 kommentarer og
2 løsninger

performance af et simpelt select i en kæmpe database

Jeg har to tabeller som jeg gerne vil sammenligne med nedenstående lille select.
Problemet er, at tabellerne er meget store, og der er ikke indeks på kolonnerne.

Tabellen ELK har 75 mill records,
heraf har de 28 mill records art = 0 eller 9
Tabellen ELM har 26 mill records
Værdierne i PK kolonnen er ens for tilsvarende records i de to tabeller (ELM er en delmængde af ELK)

Jeg forventer altså et resultat af min kontrol på 2 mill records fra ELK.
Rent intuitivt laver jeg et select i ELK efter de records, der har den rigtige art, og som ikke findes i ELM:

select pk from ELK
where ELM.art not in (0,9)
and pk not in (select pk from ELM);

Det tager meeeeget lang tid....

En kollega sagde noget om, at 'not in' er dyr rent performance mæssigt, er det rigtigt, - og i så fald...
hvordan gør man det bedre ?

på forhånd tak
Avatar billede lap Nybegynder
10. juni 2004 - 09:09 #1
Du gennemfører "(select pk from ELM);" ligeså mange gange, som der er records i ELK - altså 75000000 gange - det kan kun være dårligt.

Prøv i stedet:

select elk.pk
from elk,elm
where elk.pk = elm.pk(+)
and elm.pk is not null
and elk.art not in (0,9);

Det burde være meget hurtigere
Avatar billede lap Nybegynder
10. juni 2004 - 09:11 #2
ups du vender den lige om:

and elm.pk is not null
skal være
and elm.pk is null
Avatar billede Slettet bruger
10. juni 2004 - 09:12 #3
Du kunne prøve at bruge MINUS:

select pk from ELM
where art not in (0,9)
minus
select pk from ELK
where art not in (0,9)

se også: http://download-west.oracle.com/docs/cd/A87862_01/NT817CLI/server.817/a85397/operator.htm#1029587
Avatar billede amoelle Nybegynder
10. juni 2004 - 09:55 #4
hej rahp
hvis man vender det om:

  select pk from ELK
  where art not in (0,9)
  minus
  select pk from ELM
  where art not in (0,9)

gør den det rigtige, - og lidt hurtigere end lap's forslag.
.. så kom ind med et svar, så deler I points'ene.
Avatar billede Slettet bruger
10. juni 2004 - 10:06 #5
Svar.
Avatar billede amoelle Nybegynder
10. juni 2004 - 10:20 #6
tusind tak for kvalificeret hjælp :-)
Avatar billede lap Nybegynder
10. juni 2004 - 10:39 #7
Velbekomme - takker for points :-)

Derudover vil jeg påstå, at begge metoder bør være lige hurtige ved 2 kørsler efter hinanden (sga), men skidt nu med det :-)
Avatar billede amoelle Nybegynder
10. juni 2004 - 10:46 #8
hej lap,
jeg checker hastighed igen, når jeg kommer på den store database.
Mine 'performance målinger' var på en base med 36000 records, - og jeg målte blot på sekunder, - så du har sikkert ret :-)
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