Tere!
24.-25. juunil toimus Novosibiris konverents Highload++ Siberia 2019. Meie inimesed olid ka seal. âOracleâi konteinerandmebaasid (CDB/PDB) ja nende praktiline kasutamine tarkvara arendamiselâ, paneme tekstiversiooni ĂŒles natuke hiljem. Oli Ă€ge, aitĂ€h! korraldamise eest ja ka kĂ”igile, kes kohale tulid.

Selles postituses tahaksime jagada teiega ĂŒlesandeid, mis olid meie stendis, et saaksite kontrollida oma teadmisi Oracle'is. Allpool â 8 ĂŒlesannet, vastusevariandid ja selgitus.
Milline on maksimaalne vÀÀrtus, mida jÀrjestuse tÀitmise tulemusena nÀeme jÀrgmise skripti puhul?
create sequence s start with 1;
select s.currval, s.nextval, s.currval, s.nextval, s.currval
from dual
connect by level <= 5;
- 1
- 5
- 10
- 25
- Ei mingit, tuleb viga.
VastusOracle'i dokumentatsiooni kohaselt (tsiteeritud versioonist 8.1.6):
Ăhe SQL-lause piires suurendab Oracle jĂ€rjestust ainult ĂŒks kord rea kohta. Kui laus sisaldab rohkem kui ĂŒhte viidet NEXTVAL-ile jĂ€rjestusele, suurendab Oracle jĂ€rjestust ĂŒhe korra ja tagastab sama vÀÀrtuse kĂ”igi NEXTVAL-i esinemiste jaoks. Kui lauses on viidatud nii CURRVAL-ile kui NEXTVAL-ile, suurendab Oracle jĂ€rjestust ja tagastab sama vÀÀrtuse nii CURRVAL-ile kui NEXTVAL-ile, sĂ”ltumata nende jĂ€rjekorrast lauses.
Seega, maksimaalne vÀÀrtus vastab ridade arvule, st 5..
Kui palju ridu ilmub tabelis, kui kÀivitatakse jÀrgmine skript?
create table t(i integer check (i < 5));
create procedure p(p_from integer, p_to integer) as
begin
for i in p_from .. p_to loop
insert into t values (i);
end loop;
end;
/
exec p(1, 3);
exec p(4, 6);
exec p(7, 9);- 0
- 3
- 4
- 5
- 6
- 9
VastusOracle'i dokumentatsiooni kohaselt (tsiteeritud 11.2):
Enne SQL-lause tÀitmist mÀrgib Oracle vaikimisi sÀÀstupunkte (teie jaoks mitte kÀttesaadavad). Kui lause nurjub, tagastab Oracle automaatselt vea ja tagasitÔmbab selle SQLCODE-s SQLCA-sse. NÀiteks, kui INSERT-lausung pÔhjustab vea, proovides sisestada dupliitse vÀÀrtuse unikaalsesse indeksisse, tagastatakse lausung.
Protseduuri (HP) kutse kliendilt kĂ€sitletakse samuti ĂŒhe lausena. Seega lĂ”petab esimene HP kutse edukalt, sisestades kolm kirjet; teine HP kutse lĂ”petab vea tĂ”ttu ja tagastab neljanda kirje, mille ta suutis sisestada; kolmas kutse lĂ”petatakse veaga, ja tabelis on kokku kolm kirjet..
Kui palju ridu ilmub tabelis, kui kÀivitatakse jÀrgmine skript?
create table t(i integer, constraint i_ch check (i < 3));
begin
insert into t values (1);
insert into t values (null);
insert into t values (2);
insert into t values (null);
insert into t values (3);
insert into t values (null);
insert into t values (4);
insert into t values (null);
insert into t values (5);
exception
when others then
dbms_output.put_line('Oops!');
end;
/- 1
- 2
- 3
- 4
- 5
- 6
- 7
VastusOracle'i dokumentatsiooni kohaselt (tsiteeritud 11.2):
Kontrolli piirang vÔimaldab teil mÀÀrata tingimuse, millele iga rea tabelis vastata peab. Piirangu tÀitmiseks peab iga rea tabelis olema tingimus, mis on kas TRUE vÔi tundmatu (kuna see on null). Kui Oracle hindab kontrolli piirangu tingimust teatud rea kohta, viitavad tingimuses olevad veeru nimed selle rea veeru vÀÀrtustele.
Seega lĂ€bib nulli vÀÀrtus kontrolli, ja anonĂŒĂŒmne plokk tĂ€idetakse edukalt kuni katsetamiseni sisestada vÀÀrtust 3. PĂ€rast seda katkestab viga töödeldav plokk erandi, tagasikĂ€iku ei toimu ning tabelis jÀÀb neli rida vÀÀrtustega 1, null, 2 ja uuesti null.
Millised vÀÀrtuste paarid vÔtavad samasugust ruumi plokis?
create table t (
a char(1 char),
b char(10 char),
c char(100 char),
i number(4),
j number(14),
k number(24),
x varchar2(1 char),
y varchar2(10 char),
z varchar2(100 char));
insert into t (a, b, i, j, x, y)
values ('Y', 'ĐаŃŃ', 10, 10, 'Đ', 'ĐаŃŃ');
- A ja X
- B ja Y
- C ja K
- C ja Z
- K ja Z
- I ja J
- J ja X
- KÔik loetletud
VastusToome vĂ€lja lĂ”ike dokumentatsioonist (12.1.0.2) erinevate andmetĂŒĂŒpide sĂ€ilitamisest Oracle'is.
CHAR andmetĂŒĂŒpi
CHAR andmetĂŒĂŒp mÀÀrab andmebaasi karakterite komplektis fikseeritud pikkusega tegelaste stringi. Te mÀÀrate andmebaasi karakterite komplekti, kui loote oma andmebaasi. Oracle tagab, et kĂ”ik vÀÀrtused, mis salvestatakse CHAR veerus, vastavad valitud pikkussemantika mÀÀratud pikkusele. Kui sisestate vÀÀrtuse, mis on lĂŒhem kui veeru pikkus, siis Oracle tĂ”ukab vÀÀrtust veeru pikkuse ulatuses.
VARCHAR2 andmetĂŒĂŒp
VARCHAR2 andmetĂŒĂŒp mÀÀratleb muutuva pikkusega tĂ€hemĂ€rgirea andmebaasi tĂ€hemĂ€rgisĂŒsteemis. Andmebaasi tĂ€hemĂ€rgisĂŒsteemi mÀÀrate andmebaasi loomisel. Oracle salvestab tĂ€hemĂ€rgi vÀÀrtuse VARCHAR2 veerus tĂ€pselt nii, nagu te selle mÀÀrate, ilma igasuguste tĂŒhikuteta, tingimusel et vÀÀrtus ei ĂŒleta veeru pikkust.
NUMBER andmetĂŒĂŒp
NUMBER andmetĂŒĂŒp salvestab nulli ning positiivseid ja negatiivseid fikseeritud numbreid absoluutvÀÀrtustega vahemikus 1,0 x 10-130 kuni, kuid mitte sealhulgas, 1,0 x 10^126. Kui mÀÀrate arvutuse, mille vÀÀrtus on absoluutvÀÀrtusega sama vĂ”i suurem kui 1,0 x 10^126, siis tagastab Oracle vea. Iga NUMBER vÀÀrtus vajab 1 kuni 22 baiti. Arvestades seda, saab teatud numerilise andmevÀÀrtuse NUMBER(p) jaoks veeru suurust bittides, kus p on antud vÀÀrtuse tĂ€psus, arvutada jĂ€rgmise valemi abil: ROUND((length(p)+s)/2))+1 kus s on null, kui number on positiivne, ja s on 1, kui number on negatiivne.
Lisaks toome vÀlja lÔike dokumentatsioonist Null-vÀÀrtuste salvestamise kohta.
Null on vÀÀrtuse puudumine veerus. Nullid nÀitavad puuduvat, tundmatut vÔi kohaldamatut teavet. Nullid salvestatakse andmebaasi, kui need asuvad andmevÀÀrtustega veergude vahel. Neil juhtudel vajavad nad 1 baiti veeru pikkuse (null) salvestamiseks. Rida nulliga lÔppevad nullid ei vaja salvestamist, kuna uus rea pÀis annab mÀrku, et eelmistel veergudel on null. NÀiteks, kui tabeli viimased kolm veergu on null, siis nende veergude jaoks andmeid ei salvestata.
Arvestades neid andmeid, jÀreldame. Eeldame, et andmebaasis kasutatakse kodeeringut AL32UTF8. Selles kodeeringus vÔtavad vene tÀhed 2 baiti.
1) A ja X, vĂ€li a vÀÀrtus âYâ vĂ”tab 1 bait, vĂ€li x vÀÀrtus âĐâ â 2 baiti
2) B ja Y, âĐаŃŃâ b vÀÀrtus tĂ€iendatakse tĂŒhikutega 10 sĂŒmbolini ja vĂ”tab 14 baiti, âĐаŃŃâ d â vĂ”tab 8 baiti.
3) C ja K. MÔlemad vÀljad on NULL vÀÀrtusega, pÀrast neid on tÀhenduslikud vÀljad, seega vÔtavad nad 1 baidi.
4) C ja Z. MÔlemad vÀljad on NULL vÀÀrtusega, kuid vÀli Z on tabelis viimane, seega ei vÔta see ruumi (0 baiti). VÀli C vÔtab 1 baidi.
5) K ja Z. Sarnane eelnevaga. VĂ€li K vÀÀrtus vĂ”tab 1 baidi, Z â 0.
6) I ja J. Dokumentatsiooni kohaselt vÔtavad mÔlemad vÀÀrtused 2 baiti. Pikkuse arvutame dokumentatsioonist saadud valemi jÀrgi: round( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J ja X. VÀli J vÀÀrtus vÔtab 2 baiti, vÀli X vÀÀrtus vÔtab 2 baiti.
KokkuvÔttes on Ôiged variandid: C ja K, I ja J, J ja X.
Mis on umbkaudselt T_I indeksi clustering factor?
create table t (i integer);
insert into t select rownum from dual connect by level < = 10000;
create index t_i on t(i);
- Umbkaudu kĂŒmneid
- Umbkaudu sadu
- Umbkaudu tuhandeid
- Umbkaudu kĂŒmneid tuhandeid
VastusDokumentatsiooni kohaselt Oracle'ist (tsiteeritud 12.1):
B-puu indeksi puhul mÔÔdab indeksi clustering factor ridade fĂŒĂŒsilist rĂŒhmitust seoses indeksi vÀÀrtusega.
Indeksiklastri faktor aitab optimeerijal otsustada, kas teatud pÀringute jaoks on efektiivsem indeksi skaneerimine vÔi tÀielik tabeli skaneerimine. Madal klassifitseerimisfaktor nÀitab efektiivset indeksi skaneerimist.
Klasterfaktor, mis on lĂ€hedane tabeli plokkide arvule, nĂ€itab, et read on fĂŒĂŒsiliselt tabeli plokkides indeksi vĂ”tme jĂ€rgi jĂ€rjekorras. Kui andmebaas teostab tĂ€isklastri skaneerimise, siis tavaliselt hankib andmebaas read nii, nagu need on salvestatud kettale, jĂ€rjestatud indeksi vĂ”tme jĂ€rgi. Klasterfaktor, mis on lĂ€hedane ridade arvule, tĂ€hendab, et read on andmebaasi plokkides indeksi vĂ”tme suhtes juhuslikult hajutatud. Kui andmebaas teostab tĂ€isklastri skaneerimise, ei hanki andmebaas ridu selle indeksi vĂ”tme jĂ€rgi mingis sorteeritud jĂ€rjekorras.
Antud juhul on andmed ideaalselt jĂ€rjestatud, seega klassifitseerimisfaktor on vĂ”i on lĂ€hedal tabeli hĂ”ivatud plokkide arvule. TĂŒĂŒpilise ploki suuruse korral, mis on 8 kilobaiti, vĂ”ib oodata, et ĂŒhte plokki mahub umbes tuhat kitsast number vÀÀrtust, seega plokkide arv ja seega klassifitseerimisfaktor on kĂŒmneid.
Milliste vÀÀrtuste N korral tÀidab jÀrgmine skript edukalt tavalisest andmebaasist, millel on vaikeseaded?
create table t (
a varchar2(N char),
b varchar2(N char),
c varchar2(N char),
d varchar2(N char));
create index t_i on t (a, b, c, d);
- 100
- 200
- 400
- 800
- 1600
- 3200
- 6400
VastusOracle'i dokumentatsiooni kohaselt (tsiteeritud 11.2):
Loogilised andmebaasi piirid
Esemed
Piiri tĂŒĂŒp
Piiri vÀÀrtus
Indeksid
Indekseeritud veeru kogumaht
75% andmebaasi ploki suurusest miinus mingi ĂŒlemÀÀrane kulu
Seega ei tohi indekseeritavate veergude kogumahu suurus ĂŒletada 6 KB. Edasi oleneb valitud andmebaasi kodeeringust. Kodeeringu AL32UTF8 puhul vĂ”ib ĂŒks sĂŒmbol vĂ”tta maksimaalselt 4 baiti, seega mahub 6 kilobaidi halvemal juhul umbes 1500 sĂŒmbolit. SeetĂ”ttu keelab Oracle indeksi loomise, kui N = 400 (kui vĂ”tme pikkus halvemal juhul on 1600 sĂŒmbolit * 4 baiti + rowid pikkus), samas kui N = 200 (ja vĂ€hem) indeksi loomine sujub probleemideta.
INSERT operaator koos APPEND vihjega on mĂ”eldud andmete laadimiseks otse-reĆŸiimis. Mis juhtub, kui seda rakendada tabelile, millel on triger?
- Andmed laaditakse otse-reĆŸiimis, triger töötab nagu peab
- Andmed laaditakse otse-reĆŸiimis, kuid triger ei tööta
- Andmed laaditakse tavareĆŸiimis, triger töötab nagu peab
- Andmed laaditakse tavareĆŸiimis, kuid triger ei tööta
- Andmeid ei laadita, tekib viga
VastusPĂ”himĂ”tteliselt on see kĂŒsimus rohkem loogika kohta. Ăige vastuse leidmiseks soovitaksin jĂ€rgmise mĂ”tlemismudeli:
- Andmete sisestamine otse reĆŸiimis toimub andmeploki otsese genereerimise teel, möödaminnes SQL-mootorist, mis tagab kĂ”rge kiirus. SeetĂ”ttu on triki tĂ€itmine vĂ€ga keeruline, kui ĂŒldse vĂ”imalik, ja sellel ei ole mĂ”tet, kuna see aeglustab ikka veel sisestamist dramaatiliselt.
- Târigri tĂ€itmata jĂ€tmine tĂ€hendab, et andmete sarnase sisestamise puhul sĂ”ltub kogu andmebaasi seisund (sealhulgas teised tabelid) olukorrast, millises reĆŸiimis need andmed sisestati. See rikub ilmselgelt andmete terviklikkust ja ei saa olla lahendus tootmises.
- Taotletud operatsiooni teostamise vĂ”imatus tĂ€histatakse ĂŒldiselt veana. Kuid siin tuleks meelde tuletada, et APPEND on vihje, ja vihjete ĂŒldine loogika on, et neid arvestatakse, kui see on vĂ”imalik; kui ei, siis teostatakse operaator ilma vihjet arvestamata.
SeetĂ”ttu on oodatav vastus â andmed laaditakse tavapĂ€rases (SQL) reĆŸiimis, trikk aktiveeritakse.
Oracle'i dokumentatsiooni kohaselt (tsiteeritud 8.04):
Piirangute rikkumised toovad kaasa lause jĂ€rjestikuse tĂ€itmise konventsionaalsel sisestusteel, ilma hoiatusete vĂ”i veateadeteta. Erandiks on piirangud, mis kehtivad lause puhul, mis pÀÀseb samu tabeleid rohkem kui ĂŒks kord tehingus, mis vĂ”ib pĂ”hjustada veateateid.
NÀiteks, kui tabelil on olemas kÀivitajad vÔi viidete terviklikkus, siis APPEND vihje eiratakse, kui proovite kasutada otsest laadimist INSERT (jÀrjestikuline vÔi paralleelne), samuti PARALLEL vihje vÔi klausel, kui see on olemas.
Mis juhtub jÀrgmise skripti tÀitmisel?
create table t(i integer not null primary key, j integer references t);
create trigger t_a_i after insert on t for each row
declare
pragma autonomous_transaction;
begin
insert into t values (:new.i + 1, :new.i);
commit;
end;
/
insert into t values (1, null);
- Edukalt tÀidetud
- Viga sĂŒnaktakiga
- Viga, mis on seotud autonoomse tehingu keeldumisega
- Viga, mis on seotud maksimaalse kutse sĂŒgavause ĂŒletamisega
- Viga, mis on seotud vÀlisvÔtme rikkumisega
- Viga, mis on seotud lukustustega
VastusTabel ja kÀiviti luuakse tÀiesti korrektselt ja see toiming ei peaks probleeme tekitama. KÀivitites on autonoomsed tehingud samuti lubatud, muidu oleks nÀiteks logimise tegemine vÔimatu.
Esimese rea sisestamise jĂ€rel aktiveerib automaatne sĂŒndmus teise rea sisestamise, mistĂ”ttu aktiveerub taas sĂŒndmus, sisestades kolmanda rea ja nii edasi, kuni statement ebaĂ”nnestub maksimaalse sisestuste sĂŒgavuse ĂŒletamise tĂ”ttu. Siiski, on veel ĂŒks peene nĂŒanss. Esimese sisestatud kirje töötluse hetkel ei ole commit toimunud. Seega, autonoomses tehingus töötav sĂŒndmus pĂŒĂŒab sisestada tabelisse rida, mis viitab vĂ€lisvĂ”tmega veel commiteerimata kirjele. See pĂ”hjustab ooteolukorra (autonoomne tehing ootab pĂ”hitehingu commit'i, et mĂ”ista, kas andmeid saab sisestada) ja samal ajal ootab pĂ”hitehing autonoomse commit'i lĂ”petamist, et jĂ€tkata tööd pĂ€rast sĂŒndmust. Tekkib deadlock ja selle tagajĂ€rjel â autonoomne tehing katkestatakse seoses lukustustega.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kas see oli raske?
Kaks sÔrme, lahendasin kohe kÔik Ôigesti.
Ei olnud eriti, eksisin paaris kĂŒsimuses.
Lahendasin poole Ôigesti.
Kaks korda arvasin vastuse Ôigesti!
Kirjutan kommentaaridesse
HÀÀletas 14 kasutajat. 10 kasutajat jÀi erapooletuks.
Allikas: habr.com
