05. december 2003 - 13:35Der er
6 kommentarer og 1 løsning
Hvordan deler jeg data op i mindre bidder?
Jeg har en tabel (Oracle 8i) med ca. 4.5 mill. rækker i, og den joines med 7-8 dimensionstabeller. Selecten indeholder en group by, der får processen til at sortere på diske og ikke i memory. Nu bliver jeg nødt til at dele processen op i 4-5-6 dele og tage en del ad gangen. Men hvordan får jeg delt mine data op, når mine id'er kan være temmeligt skævt fordelt. Jeg tænkte på noget modulus, men når 2/3 af rækkerne har samme id, så dur det ikke. Rownum sjov dur heller ikke, pga. min group by.
Hmm... kan du ikke blot sætte lidt ekstra hukommelse til sortering af i din init.ora?
Ellers - hvis du kan finde det join-kriterie der skærer flest rækker af, så kan du understøtte det med indeks og via et hint tvinge optimizeren til at bruge det indeks. Måske kan du vinde noget der.
Bruger allerede ORDERED hint til at tvinge oracle til at tage tabellerne i passende rækkefølge. Kan kun allokere ca. 1 GB hukommelse til processen. Jeg tror at jeg prøver noget HASH() partitionering og PARALLEL.
Appropos hashing - Du har overvejet bitmap indexes? De burde være en smule hurtigere i opbygningen.
Umiddelbart tror jeg ikke, at parallelisme vil løse performance problemerne - i hvert fald ikke uden at introducere andre... eller kan man slå det til for en enkelt query i 8i?
PARALLEL er også et hint til optimizeren, så du kan styre hvor mange parallele processer du vil have, i.f.t. ressourcer til rådighed. Bitmapped indexes, tjah der er lidt snowflake struktur over tabellerne, problemet er bare at de i almindelig runtime bruges helt anderledes end til denne query, så jeg tror at det er overkill at ændre indexes (eller tilføje nye). Jeg må indrømme at jeg heller ikke selv har fundet løsningen.
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.