Avatar billede larsomania Nybegynder
29. februar 2008 - 16:00 Der er 7 kommentarer

Dårlig performance - index på tomt felt

Hej,

Jeg har et lidt specielt problem med en database - hvor vi ønsker at slette cirka 40.000 records fra en tabel. Disse records er normaltvis relateret via et ID tekst-felt til andre tabeller i databasen. Disse andre tabeller er store (en af dem har 8,5 mio records) og i dette specielle tilfælde er der INGEN referencer til nogen steder til min tabel med de 40.000 records - det felt der anvendes til reference til 40.000 recordstabllen er ganske enkelt tomt overalt i alle de andre tabeller.

Sletningen foregår via en applikation der validerer at der ikke findes nogen referencer for at sikre at recorden i 40.000 tabellen kan slettes. Derfor er det IKKE en løsning blot at slette direkte i 40.000 records tabellen.

Jeg har luret i v$sql og indexeret de tabeller der slås op i af applikationen når der slettes records i 40.000 tabellen. En almindelig "create index .. on ...;" kommando. Herefter er diskio faktisk væsentlig nedbragt og hastigheden er noget forbedret, men det går stadig meget langsomt at slette mine records i 40.000 tabellen. Før tog det 2,5 minutter - nu cirka 1,5 minut per record der slettes.

Oracle versionen er Release 10.2.0.3.0

Er der nogen der har et bud på om index kunne oprettes "bedre" eller andet der kan gøre for at få det til at performe ordentligt?

Jeg har også forsøgt at Optimizer Mode til RULE based i stedet for ALL_ROWS mode uden succes.
Avatar billede larsomania Nybegynder
29. februar 2008 - 16:05 #1
Opslagene der foretages er i stil med:

select invoiceline.* from invoiceline where number='171436_22';

Hvor der altså ikke findes nogen matches, men udførelsestiden på query'en er lang. Index er selvsagt lagt på "number" feltet.
Avatar billede arne_v Ekspert
29. februar 2008 - 18:28 #2
Er der index på de felter som refererer til den tabel du sletter i ?

(selvom du ved at der ikke er nogle referencer, så ved Oracle det jo ikke og skal
derfor ud og checke)
Avatar billede larsomania Nybegynder
29. februar 2008 - 18:30 #3
Ja, jeg har sat index på felterne.. Fx på ovenstående ved

create index invoiceline1000 on invoiceline(number);

Det hjalp en del, men kører stadig ganske langsomt.
Avatar billede larsomania Nybegynder
29. februar 2008 - 18:32 #4
jeg tænkte på, om man måske kunne lave index "smartere" så det tager højde for at der fatisk aldrig vil være en match?
Avatar billede larsomania Nybegynder
29. februar 2008 - 20:16 #5
Jeg har fundet noget her - må prøves mandag:

http://richardfoote.files.wordpress.com/2008/01/indexing-nulls.txt
Avatar billede larsomania Nybegynder
03. marts 2008 - 09:02 #6
Det hjalp desværre ikke... :( Nøjagtig samme execution plan...
Avatar billede GooFY79 Nybegynder
26. november 2010 - 17:29 #7
Kan du prøve at smide et dump af din SQL og Explain plan her?
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