Uneori aud că Oracle este foarte complicat în configurație, "aici este sintaxa". Pentru a nu mai acorda atenție unor astfel de afirmații, cazul mi-a ajutat.
Când am citit un curs special despre Oracle, a trebuit să fac o bază de date de formare pentru studenți. Unul dintre studenți a emis o solicitare selectată * din orice cerere și a declarat că mașina clientului a început să "încetinească". L-am întrebat câte înregistrări a extras de pe masă. El a arătat și a spus "Wow!" După ce acest lucru pretinde la performanță Oracle nu a apărut. Și au fost extrase doar 20 000 de înregistrări - pentru Oracle, numărul este pur și simplu ridicol. Recent, am citit într-o sarcină tehnică obligația de a stoca 3 000 000 000 (trei miliarde) de înregistrări.
În "cele două kilograme" aș vrea să vorbesc despre problemele pe care le-am întâlnit și despre cum le-am rezolvat. Poate, unele lucruri vor fi explicate prea detaliat - să le săriți în siguranță. Poate, ceva va rămâne incomprehensibil - întrebați, voi încerca să răspund. Poate că ceva va rămâne nesocotat și decizia mea nu va fi cea mai bună - scrie, orice comentariu pe care îl voi accepta cu recunoștință.
Deci, sarcina este extrem de simplă: să copiați datele de la o masă la alta. Ce va face proprietarul norocos al unei baze de date obișnuite. Așa este, el face asta:
Desigur, în Oracle această comandă funcționează, dar atunci când copiem un număr mare de înregistrări, aș dori să accelerez într-un fel procesul. Așa că vom accelera.
Încărcare directă
Consultați conceptele Oracle. Capitolul 25 # 132; INSERT cu încărcare directă # 147;
După cum știți, spațiul de sub datele din tabel crește treptat, dar nu scade, dacă nu dați serverului o comandă explicită pentru a comprima tabelul. În mod tradițional, comanda inserare rulează prin blocurile deja alocate ale tabelului, caută un spațiu liber și încearcă să scrie datele acolo. Blocurile noi sunt alocate numai după completarea tuturor blocurilor disponibile.
Ideea inserării directe a încărcăturii este de a transmite date brute către server și blocuri deja formate deja - va trebui doar să scrie aceste blocuri în tabel. Desigur, cu această abordare, blocurile folosite nu sunt umplut - fie sunt blocate complet blocuri libere, fie sunt adăugate noi în tabel.
Pentru a efectua încărcarea directă, utilitarul SQL * Loader este capabil. care este inclus în pachetul software-ului client Oracle, dar acest lucru necesită ca clientul și serverul să funcționeze pe aceeași platformă, adică să descarce, de exemplu, datele din Windows pe Solaris nu funcționează. Pentru a utiliza această metodă în interiorul serverului, trebuie să utilizați sugestia de adăugare.
Deci, iată primul pas în rezolvarea problemei noastre:
Dacă copiați datele utilizând metoda inserării directe, nu trebuie să salvați nicio informație pentru revocare, adică răsturnarea segmentului practic nu crește.
Dar nu uitați că, împreună cu mesele, tot felul de structuri auxiliare se schimbă de asemenea, de exemplu, indici. Modificările lor sunt, de asemenea, scrise în segmentele rollback. Și dacă există 5 indexuri create pe masă, atunci dimensiunea segmentului de rollback necesar crește de trei până la patru ori. Prin urmare, dacă cantitatea de date copiate este semnificativă în comparație cu cantitatea de date din tabel. Este logic să distrugeți indicii de pe masa țintă și să le creați după copiere. Pentru a nu crea manual indexuri, vom încerca să automatizeze acest proces. Următorul script creează o secvență de comenzi care vor trebui executate după copiere pentru a recrea indici:
Începătorii mă pot blama pentru complexitatea excesivă a comenzilor - voi răspunde că nu este nimic complicat, problema nu este în complexitatea interogării, ci în traducerea limbajului uscat al tabelelor și vederilor în SQL, aproape uman. Profesioniștii, la rândul lor, mă vor reproșa că nu țin cont de diferite subtilități, de exemplu, indici partajați - voi răspunde cu un citat din partea lui Kozma Prutkov: "nimeni nu va îmbrățișa imensitatea" *.
În general, după ce rezultatul acestei interogări este salvat, puteți distruge indexurile. Interogarea care creează scriptul pentru distrugerea indexurilor este destul de simplă:
Deși, repet, nimeni nu interferează cu scrierea manuală a tuturor comenzilor necesare.
Evident, pentru a accelera copierea, este logic să dezactivați cheile primare și cele străine. A face acest lucru merită, de asemenea, numai atunci când cantitatea de date copiate este semnificativă în comparație cu cantitatea de date existente. Formal, cheile cu indexuri nu sunt conectate în nici un fel (cu excepția indexurilor create pentru a suporta cheile primare), dar de fapt, păstrarea cheilor externe fără indexuri corespunzătoare este o sarcină prea intensivă pentru resurse. Prin urmare, dacă decideți să distrugeți indexurile, trebuie să dezactivați și tastele.
Interogarea care creează scriptul care activează / dezactivează cheile este destul de simplă, dar, din motive de exhaustivitate, îl aduc aici:
paralelism
Acest lucru se realizează în mai multe moduri. Prima modalitate este de a specifica la crearea tabelului gradul de paralelism acceptabil pentru operațiile cu acest tabel.
Vedeți referința SQL Oracle8i. Capitolul 7 # 132; Declarații SQL # 147;
Un efect secundar - unele comenzi pot fi paralelizate, care ar fi mai bine executate secvențial. Și invers - echipa ta nu poate paraleli.
A doua modalitate este de a specifica indiciul paralel direct în comandă. Aici este necesar să rețineți următoarele: în primul rând, citirea datelor și scrierea acestora sunt procese diferite și trebuie să fie paralele separate; În al doilea rând, înregistrarea nu paralelizează, cu excepția cazului în care permiteți în mod explicit activarea DML paralelă. Având în vedere cele de mai sus, scriptul pentru copierea datelor are următoarea formă:
Există patru procese pentru înregistrare și patru pentru citire. Dacă înregistrarea este mult mai lentă decât citirea (de exemplu, indiciile nu sunt distruse), atunci puteți face procesele de înregistrare mai mult decât citirea.
Și încă un lucru. Înregistrarea nu paralelizează dacă este lăsată cel puțin o cheie străină, unde tabela destinație este o cheie copil. Și Oracle 8.0 nu paralelizează înregistrarea, dacă citirea are loc pe link, adică de la un alt exemplu Oracle.
Alocarea memoriei
Nu uitați că viteza de alocare a spațiului pe disc pentru date are un efect puternic asupra vitezei de înregistrare a datelor.
După cum știți, dacă se termină un loc în masă, îi este atribuită o nouă măsură - un set de blocuri consecutive. Dimensiunea acestei mărimi este determinată de parametrii următori și pctincrease. specificate în comanda de creare a tabelului. În cazul în care dimensiunea este mică, atunci se va remarca rapid, dar selecția va avea loc frecvent. Dacă amploarea este mare, atunci extensiile vor fi rareori alocate, dar lungi. Trebuie reținut faptul că dicționarul de date este blocat monopolist atunci când se schimbă, adică dacă unul din procesele paralele a cerut o extindere, iar la acea dată o cerere este procesată dintr-un alt proces, prima se va ridica și va aștepta.
Este imposibil să se facă recomandări clare cu privire la mărimea extensiilor, totul depinde de cantitatea de date, adică de "lățimea" tabelului și de numărul de înregistrări. Este totuși de dorit ca dimensiunile în toate tabelele să fie multipli - aceasta va reduce fragmentarea spațiului tabelului și va grăbi căutarea unui spațiu liber.
Retragerea segmentelor
Dacă ați analizat cu atenție imaginea care ilustrează utilizarea segmentelor de redirecționare, ați văzut că acestea sunt utilizate la rândul lor. Să avem, de exemplu, 4 segmente - R01, R02, R03 și R04. Aceasta este, dacă tranzacția folosită, de exemplu, segmentul R01, atunci următoarea tranzacție va fi atribuită segmentului R02.
Se poate întâmpla ca prima tranzacție să extindă segmentul răsturnării astfel încât să se potrivească îndeaproape cu limitele spațiului de tabelă. După confirmarea tranzacției, segmentul va fi marcat ca fiind gratuit, dar nu va scădea în dimensiune - demonul va dura puțin mai mult timp pentru a micșora dimensiunea. A doua tranzacție poate să nu fie suficientă pentru revizuirea segmentului - pur și simplu pentru că nu are unde să crească.
Soluția problemei este - este suficient ca forța celei de-a doua tranzacții să aloce aceluiași segment de retragere ca și primul:
concluzie
Câte descoperiri avem minunat.
Dacă doriți să împărtășiți cu mine dificultățile și bucuriile asociate cu Oracle - scrieți scrisori. Dacă aveți bucurie, dar scrieți lenea, puteți imprima pe o imprimantă color și lipiți un buton tradițional 88 × 31 de pe pagina web / monitor / frunte:
* Kozma Prutkov, "Fructe de meditație". "Gânduri și aforisme", numărul 3
Utilizatorii tuturor clonelor * nix au putut mult timp să scrie fișiere batch în orice limbă. Pentru a face acest lucru, trebuie doar să specificați numele interpretului în prima linie. »» »
Limba de comandă a Windows NT este încă stângace și viclean, dar este deja un instrument destul de puternic care poate și ar trebui folosit. »» »
Uneori aud că Oracle este foarte complicat în configurație, "aici este sintaxa". Pentru a nu mai acorda atenție unor astfel de afirmații, cazul mi-a ajutat. »» »