Sunt interesat de modul de a reutiliza spațiu în tabel, organizat pe un index (Index Tabel organizate - IOT) după eliminarea unui număr substanțial de rânduri.
În timp ce utilizați tabelul normal după îndepărtarea unui număr de linii, am recrea indicii în blocuri de index nu există spații goale, după cum știm, este un spațiu gol în indexurile nu vor fi reutilizate (spre deosebire de blocuri de mese, în cazul în care postul vacant este reutilizat după cum PCTUSED prag în bloc) este depășită.
Deci, ce se poate face cu o masă organizată de index, pentru a preveni creșterea constantă, chiar și după eliminarea unui număr de linii?
Răspunde de Tom Kyte
Răspunsul la această întrebare este de fapt destul de interesant - Oracle8i Release 8.1 vă permite să efectuați două noi acțiuni, care fac un răspuns interesant:
- indici de reconstrucție rapidă;
- transfer de masă.
Deoarece tabelul organizat de index - este doar un index. De fapt, putem recrea indexul prin transferarea „în deplasare“ masa (de exemplu, până când nu se recrearea utilizatorilor să își schimbe datele din tabel.)
Acum vom elimina doar aproximativ jumătate din rândurile din tabel. Vom elimina „printr-o“ linie.
Deci, în indexul nostru o mulțime de linii șterse (nici unul dintre unități nu a complet gol). Cum este „curat“?
Iată ce avem - toate „curățat“. Ca un test, puteți lăsa alte sesiuni deschise, atâta timp cât mișcarea de masă alter - doar pentru a vă asigura că masa este disponibil pentru interogări și toți operatorii LMD.
Ați menționat două metode. Unul dintre ei - operative refacerea indicelui.
Am încercat să-l aplice, dar nimic nu sa întâmplat.
Răspunde de Tom Kyte
Acest lucru se face de către operator:
Tabel de schimbare a cheii primare organizate de indicele
Dacă, să zicem, am organizat indicele de masă T cu coloane a. b. c. d. în care coloanele a, b formează cheia primară.
De asemenea, am nevoie de a avea o cheie de coloane primare a, b, c. Este nu ALTER tabel. Vă permite să modificați tabelul organizat de index, și se adaugă o altă coloană în cheia primară compozit?
Răspunde de Tom Kyte
În Oracle9i, puteți utiliza online pentru a recrea.
În 8i, trebuie să utilizați tabelul Creare. ca selectați. . ștergeți tabelul vechi și redenumiți cel nou.
Dacă, să zicem, am organizat indicele de masă T cu coloane a. b. c. d. Dar acum coloanele cheie primare pentru a forma o. b. c. în această ordine.
Am constatat că, în majoritatea interogărilor am folosit starea coloanelor a, c. Va coloanele cheie compozit astfel utile a, b, c. Comparativ cu cheia compozit pe coloane a, c?
Răspunde de Tom Kyte
Cheia primară - este cheia primară este caracteristica sa principala.
In timp ce cele mai multe cereri de acces la masa este pe coloane a, c. cheia primară trebuie să fie în coloanele A, C, b
Întrebare urmărirea.
Jumătate din cererile mele - o, c. iar cealaltă jumătate - pentru a, b.
Dacă creați o cheie primară compozit pe coloane a, b, c. Fie că va fi utilizat pentru toate aceste interogări? Printr-o, b cere un pic mai mult decât o, c.
Am încercat pe un server de dezvoltare folosi un tabel organizat de index, în loc de masa de obicei, și a obținut prin tkprof diferență a fost suficientă pentru a justifica o astfel de implementare pe un server de producție.
Sistemul face parte din clasa 24x7, si timpul de livrare ar trebui să fie reduse la minimum.
Cum pot îngheța masa de spus? Dacă există un operator „modifica tabelul <имя_таблицы> numai în citire „- Nu pot găsi în 8i sau tabllitsa sursă vor fi înghețate de către operatorul de masă și să selectați creați ...?
Mă duc în orele de vârf pentru a face următoarele:
- redenumiți tabelul din
- să nu apară modificări ulterioare - creează masă <исходная таблица> ca selectați din
Am verificat în funcție de alte obiecte din masă, și nu le-au găsit. Cheia primară a tabelului nu este referit de chei străine de alte tabele, iar masa în sine nu conține chei străine.
Răspunde de Tom Kyte
și cealaltă copie.
Apoi, în prima sesiune, șterge, redenumi și noul tabel.
În 8i, în cazul în care cererile de date selectate a, b și c. cel mai probabil, este necesar să se creeze indicii:
Separat, coloana „c“, deoarece toate indexurile pe o masă organizată de index, și așa includ cheia primară. Luați în considerare acest exemplu:
Vezi cum cererea nu a reușit numai pe index? Pentru valori ale lui A nu trebuie să se refere la masa - este în index.
Fie că recrearea indicele este necesar?
De ce trebuie să ne re-crea indicii. Ești împotriva indici de reconstrucție. Iată răspunsul:
Răspunde de Tom Kyte
Nu mă deranjează să creeze toate.
I - împotriva indicilor de reconstrucție obișnuite, pur și simplu pentru că „toată lumea știe că modul de a face.“
Mă opun punerii în aplicare a acțiunilor, despre care nu se știe că acestea:
- face sistemul mai bine;
- nu provoacă efecte adverse.
indexurile bitmap (indici bitmap) pot fi necesare pentru a recrea după un anumit număr de declarații DML.
Indexul textul meu pe site-ul asktom - o am din când în când, recrea, după o schimbare semnificativă a datelor (de fapt, este foarte similar cu indexul bitmap).
Indici bazate pe b * -tree - acestea sunt puțin probabil să recreeze vreodată în valoare (indiciu :. Citiți despre coaguleze - oferă cele mai multe dintre aceleași beneficii, și de a lucra mult mai puțin).
Am creat un tabel organizat de index, pentru utilizare ca o lista drop-down:
Sunt interesat de următoarele:
1. În esență, există două indici pe aceeași coloană a tabelului. În mod eficient, și cum să gestioneze un singur indice?
2. Pentru a specifica un nume explicit pentru masa de preaplin (PREAPLIN)?
Aș dori să știu recomandările pentru îmbunătățirea performanței.
Răspunde de Tom Kyte
1) De fapt, nu văd decât un singur indice - pe funcțiile pe care le-ați creat. Un alt „Index“ - este, de fapt, tabelul de sine.
2) segment Overflow în acest caz, este inutil și nedorit. De fapt, aș spune că, dacă aveți nevoie de un segment de preaplin, atunci probabil că nu au nevoie de o organizație de pe masa de index (există, desigur, excepții).
Dacă sunteți mereu în căutarea unui șir de caractere în caz de sus, puteți crea un tabel:
și pur și simplu inserați-l în numele în numele majuscule și display_yn.
În acest caz, veți obține:
- doar un singur tabel organizat de index;
- Nu există ambiguități, pentru că acum aveți ca valoare a tabelului „cheie primară“ poate fi atât de „bună“ și „Bună ziua“.
Serverul găsește un rând într-un tabel organizat de index
Are valoarea cheii primare a serverului pentru a găsi rapid rânduri într-un tabel, organizate de index? El nu păstrează RowId. ca într-un index normal pe baza b-copac? Ați putea explica ce mecanism este utilizat.
Răspunde de Tom Kyte
Stocate „ROWID“, dar universală, nu una fizică. Și aceasta include de fapt, o valoare cheie primară. Luați în considerare acest exemplu:
Vezi cât de mare poate RowId.
Indicele cheie conține.
Asta înseamnă că, în conformitate cu indicele de coloană (indicele secundar) este valoarea cheii, valoarea cheii primare și ROWID (logica)?
Răspunde de Tom Kyte
Da. Vă rugăm să rețineți, ca în exemplul următor, un acces se face numai la indexul T_IDX. dar, în general, nu se aplică la masă. Deși indicele - doar coloana Y.
Tabel de dimensiuni organizat de indicele
Sunt implicat în transformarea unor tabele „mari, dar skinny“ de la mai mult de 10.000 de rânduri în indicele organizat și a constatat că acesta îmbunătățește semnificativ performanța.
Ce crezi, are sens să organizeze masa indicele de mai puțin de 10.000 de linii? Aceasta îi conferă un avantaj semnificativ față de masă regulate cu indici?
Răspunde de Tom Kyte
Da, desigur. Când căutați o cheie doar 1/3 logică IO poate fi necesară. În cazul în care o astfel de căutare se face de multe ori, 100 de rânduri în tabel sau 10.000 - nu contează.
Coaguleze sau MOVE ONLINE
1) Atunci când utilizarea ALTER coaguleze iot_table. și când - ALTER MOVE iot_table ONLINE. Există cazuri în care utilizarea coaliza justificate?
2) În cazul în care există un tabel de iot_table de index și noi te mișca ONLINE. dacă pentru a reconstrui indexul?
Răspunde de Tom Kyte
1) Utilizarea coaliza pentru „comprimarea“ a tabelului organizat de index.
Utilizați mișcare pentru transferul său. În același timp, există o re-creare completă și necesitatea spațiu de dimensiunea unui tabel.
2) un tabel de index organizat de un indice bazat pe chei primare. Când se transferă o valoare primară cheie nu se schimba, astfel încât nu este nevoie de a re-crea indicii.
indexurile de masă regulate trebuie să re-crea (schimba rând fizic ID-uri) și indicii de pe masa organizat de index - nr.
Index cu o dimensiune bloc mare
Ca o intrare index poate fi mai mare de 4000 octeți cu o dimensiune a blocului de 2 KB?
Răspunde de Tom Kyte
Se pare ca o greșeală, au uitat să verifice. Dacă tabelul are rânduri care depășesc dimensiunea maximă, trebuie să fi primit:
în cazul în mișcare alter lucra cu succes, veți obține:
atunci când încercați să introduceți un șir de caractere foarte mare.
Astfel, nici o corupere de date, etc. nu se întâmplă - doar ratat de inspecție înainte de transfer. Am pus deja o greșeală bazată pe mesajul dvs. cu următorul caz de încercare:
Cum pot face un tabel regulat organizat de index?
Organizarea mesei de index pare adecvat în cazul meu. Avem o masa - 6 milioane de linii, tratamentul la care urmează întotdeauna același index; tabel doar cinci coloane și 3 creează un index, astfel încât organizarea mesei de indicele pare soluția perfectă. Dar am două întrebări.
Cum se cu adevărat „reorganiza“ tabelul de pe index? Dacă creați un nou tabel și de a efectua: a se introduce în. selectați *. când șase milioane de rânduri, această operațiune se va încheia mai devreme sau mai târziu, nu (după toate segmentele rollback vor fi ocupate). Nu există o modalitate mai interesant de a schimba organizarea mesei? Și dacă nu, dacă am exporta un tabel, am șterge, de a crea un tabel cu același nume, ci o organizație diferită. Indiferent daca activitatea de import? Indiferent dacă există motive (intensiv de inserție / modificare.), Pe care organizația nu trebuie utilizat pe masa de index?
Și o altă întrebare: Este posibil să partiție de masă organizate de index? Acest lucru, în general, are sens?
Răspunde de Tom Kyte
Totul se termină cu bine, dacă setați în conformitate cu acțiunea de dimensiunea segmentelor rollback care urmează să fie executat (pentru numele lui Dumnezeu, eu de multe ori cu 10 milioane și mai multe linii de „lățime“ de lucru pe laptop-ul său. Pe laptop!)
Puteți partiționa un tabel organizat de index, da.
Da, acest lucru are sens (dar 6 milioane de linii, oricum, e un pic)
se dovedește că este folosit aproximativ la fel de mult ca un singur bloc în segmentul rollback :) Ești îngrijorat de faptul că nu să se întâmple (ca și în modul istoric arhivă, puteți efectua această acțiune în modul nologging. fiind de acord cu backup-uri DBA de date noi, cum ar fi cât mai curând posibil, și să elimine astfel eventualele probleme cu revista refaceți pe care le-ar putea imagina exagerată):
și UNDO folosit a fost un bloc!
Gama împărțit, organizată de comprimarea indicelui de masă
În 9iR2 am un tabel de 3 coloane, cu aproximativ un miliard de rânduri, dar încă în creștere rapidă. Aș dori să-l partiție de gamă, comprima și de a organiza index.
Nu vreau prea mult. -)
Am creat deja o tabelă partiționată organizată de index, și se pare că performanța (și nu numai) a crescut în mod semnificativ, de multe criterii, care nu doresc să se oprească.
Voi testa fiabilitatea / viteza și alte aspecte ale comprimare a datelor din tabel (deja organizate așa cum este descris mai sus), dar întrebarea principală este dacă o astfel de soluție (dacă testarea va da rezultate pozitive) stabile și adecvate pentru „industriale“ folosesc? Ie nu există erori cunoscute, „nuanțată“, sau alte probleme care pot deveni osuschestvennym obstacol sau o amenințare semnificativă în viitor.
Răspunde de Tom Kyte
3 coloana „îngustă“ = zamechtaelno de masă organizat de indicele
1.000.000.000 de rânduri = candidat potrivit pentru partiționarea
În cazul în care coloanele inițiale au multe valori duplicate, compresie = idee foarte proastă.
Nu știu despre unele „nuanțe“ și potențialele probleme pe care nu le lasa sa-l faci.
Chtoy mulțumit.
Vă mulțumim pentru răspuns, dar vreau să vă asigurați că a descris în mod corect situația, deoarece este esențial în acest caz:
Vreau să folosesc organizat pe intervalul de index împărțit și tabele comprimate, primetrno cum ar fi stabilit mai jos (am găsit undeva sintaxa pentru compresie) [Apropo, mulțumesc pentru pont despre „coloana de intrare cu valori duplicate“]
M-am gândit pentru o clipă, dacă am înțeles corect că justifică utilizarea unei partiționat sau organizate de indicele de masă, dar vreau ceva, și un altul, și de compresie, dar este preocupat de posibilitatea pierderii de date, etc. pe termen lung. Avem o memorie - masina, astfel încât timpul de compresie nu mă deranjează, totuși, este necesar să se testeze. Me corupere de date mai mult în cauză, etc. În plus, dacă se face TRUNCATE (am facut accidental la fel de versat ca la trunchia secțiunea) - Trebuie să re-crea întregul tabel sau numai această organizat pe secțiunea de index :-)
A fost scenariul prezentat mai sus sunt o companie serioasa testate cu succes si fara probleme de administrare?
(Întrebare despre 10g aruncat afară pentru că Tom nu ia răspuns până la - .. Nota VK)
Răspunde de Tom Kyte
Nu, am scris că tabelul organizat de index, care este împărțit și, eventual, comprimat, poate foarte abordare.
Știu despre utilizarea de tabele partiționate mari, organizat de indicele (aproximativ de compresie nu sunt sigur că acest lucru este de obicei trecute cu vederea), și lucrează cu succes.