14. februar 2002 - 12:54Der er
23 kommentarer og 2 løsninger
Performance..
Jeg har en tabel med 8,3 millioner rækker... på denne køres disse tre update statements.. Det tager ialt 4 timer og 40 minutter at køre disse tre hvilket virker som utrolig lang tid...(det er vist den første og sidste statement der tager det meste af tiden) Virker det fornuftigt at det skal tage så lang tid eller er der noget helt galt??? (det tager 7 minutter at loade alle rækkerne ind hvilket svarer til 1,6 GB data)
update trafic set time = to_date('2001-01-01')+timecode/(60*60*24);
update trafic set week = to_char(time,'WW');
update trafic set session_id = to_char(time,'ddmmyy')||session_id;
Findes der derudover nogle gode steder hvor jeg kan læse noget om performance vedrørende Oracle og (PL/)SQL? Eller evt. en god bog om emnet...
Efter at data er loadet ind bliver der lagt 3 index på de kolonner som anvendes i SQL statements senere.. dvs. der er lagt index på time og session_id som bliver anvendt i det ovenstående.
update trafic set time = to_date('2001-01-01')+timecode/(60*60*24), week = to_char(time,'WW'), session_id = to_char(time,'ddmmyy')||session_id ; og JA det kan godt ta' lang tid at lave en update, der skrives i tabellen, rollback, redolog og index
du skriver at første og sidste tager lang tid det er sikkert fordi der er index på disse felter og det skal også opdateres.
Prøv evt. at droppe dine index for du laver update og lav dem igen når du er færdig.
Til degn Vedr. index, Der kan IKKE anvendes index da der ikke er nogen where....
Nej - jeg tænkte også mest på om der blev brugt meget tid på at vedligeholde indexes, og det kan det jo tyde på da der er index på de 2 updates der tager længst tid men ikke på den hurtige update.
Prøv at fjerne de 2 index på time og session_id.....
Jeg er interesseret i at updaten går så hurtigt som overhovedet muligt, og det er ikke nødvendigt at kunne foretage f.eks rollback... (data kan jo loades ind igen på 7 min hvis der skulle gå noget galt)
Er det muligt at slå rollback, redolog osv fra inden dette køres??
Dette vil ikke skrive ret meget i redo og rollback og mit gæt er at det vil ta' 20 min. Men kan du ikke sætte time, week og session_id når/før du loader ?
drop eller set unusable alle index op trafic
create table tmp_trafic as select * from trafic where 1=0;
insert /*+ APPEND */ into tmp_trafic (time,week,session_id,felt4,felt5..) select to_date('2001-01-01')+timecode/(60*60*24), to_char(time,'WW'), to_char(time,'ddmmyy')||session_id, felt4,felt5..... from trafic; commit; truncate table trafic;
insert /*+ APPEND */ into trafic select * from tmp_trafic; commit;
Rolback er ikke slået fra, men redo-log benyttes ikke til temporære tabeller. Sådan er det bare. Men det kan altså ikke betale sig at flytte data over i en temporær tabel for at opdatere og flytte dem tilbage igen. Sæt indexes unusable, skriv at du vil ignorere unusable indexes, kør opdatering, og rebuild indexes. Det må være måden. Det er i hvert fald sådan man gør ved Data Mart opdateringer.
coily => men din metode kræver at man har dobbelt så meget plads som man egentligt skal bruge, idet at tablespacet udviddes med tabel#2 (faktisk er det filen der udviddes)
coily => ja, men du arbejder med et tablespace der efter opdatering STADIG fylder det dobbelte splatter => nogen ide om den procentlige udvidelse ved en updatering?
Jeg fik et lille tip fra en kollega. Når man trunkerer tabellen så tilføj reuse storage, så den ikke først deallokerer blokkene for derefter at skulle allokere dem igen.
splatter => jeg spurgte om den procentlige udvidelse fordi det kan være at blokkene er for fyldte til at updaten kan indeholdes i de samme blokke og dermed skal flytte rækker til andre blokke. Dette tager 100 år. Så check at din PCTFREE på tabellen er større en den procentlige udvidelse i rækkerne. Husk lige at ledig plads ikke helt det samme som tilladt udvidelsesprocent, idet at 10% ledig betyder at der kan udvides med ((100/100-10)-1)*100=11,1% i rækkerne
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.