Tere!
24-25 juunil toimus Novosibirskis konverents Highload++ Siberia 2019. Meie tiim oli ka kohal. âOracle'i konteinerandmebaasid (CDB/PDB) ja nende praktiline kasutamine tarkvara arendusesâ, jagame tekstiversioone natuke hiljem. Oli Ă€ge, aitĂ€h. korralduse eest, samuti kĂ”igile, kes kohal olid.

Selles postituses tahame teiega jagada ĂŒlesandeid, mis olid meie standil, et saaksite oma Oracle'i teadmisi testida. Allpool on 8 ĂŒlesannet, vastusevariandid ja selgitus.
Milline on maksimaalne seeria vÀÀrtus, mida me nÀeme jÀrgmise skripti tÀitmisel?
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
- Mitte mingit, ilmneb viga.
VastusVastavalt Oracle'i dokumentatsioonile (tsiteeritud versioonist 8.1.6):
Ăhes SQL-kĂ€skluses suurendab Oracle jĂ€rjestust ainult ĂŒhe korra rea kohta. Kui kĂ€sklus sisaldab rohkem kui ĂŒhte viidatud vÀÀrtust NEXTVAL jĂ€rjestusele, suurendab Oracle jĂ€rjestust ĂŒhe korra ja tagastab sama vÀÀrtuse kĂ”ikide NEXTVAL-i viidete korral. Kui kĂ€skluses on viidatud nii CURRVALile kui NEXTVALile, suurendab Oracle jĂ€rjestust ja tagastab sama vÀÀrtuse nii CURRVALile kui ka NEXTVALile, olenemata nende jĂ€rjekorrast kĂ€sus.
Seega, maksimaalne vÀÀrtus vastab ridade arvule, st 5..
Kui palju ridu on tabelis pÀrast jÀrgmise skripti tÀitmist?
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
VastusVastavalt Oracle'i dokumentatsioonile (tsiteeritud versioonist 11.2):
Enne mis tahes SQL-kĂ€skluse tĂ€itmist mĂ€rgib Oracle vaikimisi salvestuspunkti (mis ei ole teile saadaval). Siis, kui kĂ€sklus ebaĂ”nnestub, taastab Oracle selle automaatselt ja tagastab kohaldatava veakoodi SQLCODE'i SQLCA-s. NĂ€iteks, kui INSERT kĂ€sklus pĂ”hjustab vea, pĂŒĂŒdes sisestada duubeldatud vÀÀrtust unikaalsesse indeksisse, taastatakse kĂ€sklus.
Kliendi poolne salajĂ€rje kutse kĂ€sitletakse samuti nagu ĂŒhe kĂ€skluse tĂ€itmine. Seega esimene salajĂ€rje kutse Ă”nnestub, sisestades kolm kirjet; teine salajĂ€rje kutse lĂ”peb veaga ja tĂŒhistab neljanda kirje, mille ta jĂ”udis sisestada; kolmas kutse lĂ”peb veaga, ja tabelis on kolm kirjet..
Kui palju ridu on tabelis pÀrast jÀrgmise skripti tÀitmist?
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
VastusVastavalt Oracle'i dokumentatsioonile (tsiteeritud versioonist 11.2):
Kontrolli piirang vÔimaldab mÀÀrata tingimuse, mida iga rida tabelis peab tÀitma. Selle tÀitmiseks peab iga tabeli rida olema tingimustest kas TRUE vÔi teadmata (tÀnu nullile). Kui Oracle hindab kontrolli piirangu tingimust konkreetse rea jaoks, viitavad tingimuses olevad veergude nimed sellele rea veergude vÀÀrtustele.
Seega lĂ€bib nulli vÀÀrtus kontrolli ning anonĂŒĂŒmne plokk tĂ€idetakse edukalt kuni katsega sisestada vÀÀrtus 3. PĂ€rast seda kustutab tĂ”rke töötlemise plokk erandi, tagasiviimist ei toimu ja tabelis jÀÀb neli rida. vÀÀrtustega 1, null, 2 ja taas null.
Millised vÀÀrtuste paarid vÔtavad sama palju 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', 'Vasya', 10, 10, 'D', 'Vasya');
- 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 vĂ€ljavĂ”tte dokumentatsioonist (12.1.0.2) erinevate andmetĂŒĂŒpide salvestamise kohta Oracles.
CHAR AndmetĂŒĂŒp
CHAR andmetĂŒĂŒp mÀÀratleb fikseeritud pikkusega sĂŒmbolite joonise andmebaasi sĂŒmbolite kogumis. Andmebaasi sĂŒmbolite kogus mÀÀratakse, kui loote oma andmebaasi. Oracle tagab, et kĂ”ik CHAR veerus salvestatud vÀÀrtused vastavad suurusele, mille olete valinud pikkuse semantika jĂ€rgi. Kui sisestate vÀÀrtuse, mis on lĂŒhem kui veeru pikkus, tĂ€idab Oracle vÀÀrtuse veeru pikkusele vastava tĂŒhikuga.
VARCHAR2 AndmetĂŒĂŒp
VARCHAR2 andmetĂŒĂŒp mÀÀratleb muutumispikkusega sĂŒmbolite joonise andmebaasi sĂŒmbolite kogumis. Andmebaasi sĂŒmbolite kogust mÀÀratakse, kui loote oma andmebaasi. Oracle salvestab VARCHAR2 veerus sĂŒmbolvÀÀrtuse tĂ€pselt sellisena, nagu te selle mÀÀrate, ilma tĂŒhikute tĂ€itmiseta, tingimusel et vÀÀrtus ei ĂŒleta veeru pikkust.
NUMBER AndmetĂŒĂŒp
NUMBER andmetĂŒĂŒp salvestab nulli, samuti positiivseid ja negatiivseid fikseeritud numbreid absoluutvÀÀrtustega alates 1,0 x 10-130 kuni, kuid mitte sealhulgas 1,0 x 10126. Kui mÀÀrate aritmeetilise avaldi, mille vÀÀrtus on absoluutvÀÀrtus suurem vĂ”i vĂ”rdne 1,0 x 10126, tagastab Oracle vea. Iga NUMBER vÀÀrtus nĂ”uab 1 kuni 22 baiti. Arvestades seda, saab konkreetse numbrilise andmevÀÀrtuse NUMBER(p) veeru suurust baitides arvutada, kasutades jĂ€rgmist valemit: 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 vÀljavÔtte dokumentatsioonist Null vÀÀrtuste sÀilitamise kohta.
Null on vÀÀrtuse puudumine veerus. Nullid nÀitavad puuduvat, tundmatut vÔi mittetulenevat teavet. Nullid salvestatakse andmebaasis, kui need asuvad andmevÀÀrtustega veergude vahel. Sel juhul nÔuavad nad 1 baiti veeru pikkuse salvestamiseks (null). Rida lÔpus olevad nullid ei nÔua salvestamist, kuna uus ridade pÀis mÀrgib, et eelmise rea jÀrelejÀÀnud veerud on null. NÀiteks, kui tabeli viimased kolm veergu on null, siis nende veergude jaoks ei salvestata andmeid.
VÔttes arvesse neid andmeid, koostame argumente. Eeldame, et andmebaasis kasutatakse kodeeringut AL32UTF8. Selles kodeeringus hÔivavad vene tÀhed 2 baiti.
1) A ja X, veeru a vÀÀrtus 'Y' hĂ”ivab 1 baiti, veeru x vÀÀrtus 'D' â 2 baiti.
2) B ja Y, 'Vasya' b vÀÀrtus tĂ€iendatakse tĂŒhikutega kuni 10 sĂŒmbolit ja vĂ”tab 14 baiti, 'Vasya' d vÀÀrtus â 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 need 1 baiti.
4) C ja Z. MÔlemad vÀljad on NULL vÀÀrtusega, kuid Z vÀli on tabelis viimane, seega ei vÔta see ruumi (0 baiti). C vÀli vÔtab 1 baiti.
5) K ja Z. Sarnane eelnevale juhtumile. K vĂ€lja vÀÀrtus vĂ”tab 1 baiti, Z â 0.
6) I ja J. Dokumentatsiooni kohaselt vÔtavad mÔlemad vÀÀrtused 2 baiti. Pikkust arvestame dokumentatsioonist saadud valemi jÀrgi: round( (1 + 0) / 2) + 1 = 1 + 1 = 2.
7) J ja X. J vÀlja vÀÀrtus vÔtab 2 baiti, X vÀlja vÀÀrtus vÔtab 2 baiti.
Seega, Ôiged variandid: C ja K, I ja J, J ja X.
Milline on umbkaudu clustering factor indeksi T_I puhul?
create table t (i integer);
insert into t select rownum from dual connect by level <= 10000;
create index t_i on t(i);
- KĂŒmneid
- Sadu
- Tuhandeid
- KĂŒmneid tuhandeid
VastusOracle'i dokumentatsiooni kohaselt (tsiteeritud 12.1):
B-puu indeksi korral mÔÔdab indeksi clustering factor ridade fĂŒĂŒsilist kogunemist indeksi vÀÀrtuse suhtes.
Indeksi clustering factor aitab optimeerijal otsustada, kas indeksi skaneerimine vÔi tÀistabeli skaneerimine on teatud pÀringute jaoks tÔhusam. Madal clustering factor viitab tÔhusale indeksi skaneerimisele.
Clustering factor, mis on lĂ€hedal tabeli plokkide arvule, nĂ€itab, et read on fĂŒĂŒsiliselt tabeli plokkides indeksi vĂ”tme jĂ€rgi jĂ€rjestatud. Kui andmebaas teeb tĂ€istabeli skaneerimise, siis suudab andmebaas tĂ”enĂ€oliselt tuua read nii, nagu need on kettal jĂ€rjestatud indeksi vĂ”tme jĂ€rgi. Clustering factor, mis on lĂ€hedal ridade arvule, nĂ€itab, et read on andmebaasi plokkides indeksi vĂ”tme suhtes juhuslikult hajutatud. Kui andmebaas teeb tĂ€istabeli skaneerimise, siis ei tooda read mingil jĂ€rjestatud jĂ€rjekorras selle indeksi vĂ”tme jĂ€rgi.
Antud juhul on andmed ideaalselt sorteeritud, seega clustering factor on vĂ”rdne vĂ”i lĂ€hedane tabelis kasutatud plokkide arvule. Tavalise ploki suuruse korral 8 kilobaiti vĂ”ib oodata, et ĂŒhte plokki mahub umbes tuhat kitsast number vÀÀrtust, seega plokkide arv ja seega clustering factor on kĂŒmneid.
Millistel N vÀÀrtustel kÀivitub jÀrgmine skript edukalt tavalises andmebaasis vaikeseadetega?
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
VastusVastavalt Oracle'i dokumentatsioonile (tsiteeritud versioonist 11.2):
Loogilised andmebaasi piirangud
Esemed
Piirangu tĂŒĂŒp
Piirangu vÀÀrtus
Indeksid
Indekseeritud veeru kogusumma
75% andmebaasi ploki suurusest miinus mÔned lisakulud
Seega ei tohi indekseeritud veergude kogusumma ĂŒletada 6 KB. Edasi sĂ”ltub see valitud andmebaasi kodeeringust. Koderingu AL32UTF8 puhul vĂ”ib ĂŒks tĂ€ht vĂ”tta maksimaalselt 4 baiti, seega mahub 6 kilobaiti halva variandi korral umbes 1500 tĂ€hemĂ€rki. Seega keelab Oracle indeksi loomise juhul, kui N = 400 (kui vĂ”tme pikkus halvas variandis on 1600 tĂ€hemĂ€rki * 4 baiti + rowid pikkus), samas kui kui N = 200 (ja vĂ€hem) indeksi loomine töötab 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 kĂ€ivitub nagu peab.
- Andmed laaditakse otse reĆŸiimis, kuid trigerit ei kĂ€ivitata.
- Andmed laaditakse tavalises reĆŸiimis, triger kĂ€ivitub nagu peab.
- Andmed laaditakse tavalises reĆŸiimis, kuid trigerit ei kĂ€ivitata.
- Andmeid ei laadita, ilmneb viga.
VastusPĂ”himĂ”tteliselt on see kĂŒsimus rohkem loogika kohta. Ăige vastuse leidmiseks soovitaksin jĂ€rgmise mĂ”tlemisviisi:
- Otse reĆŸiimis sisestamine toimub andmeploki vahetu koostamise kaudu, mööda SQL-mootorit, mis tagab kĂ”rge kiirus. Seega on trigeri tĂ€itmine vĂ€ga keeruline, kui mitte vĂ”imatu, ja sellel pole mĂ”tet, kuna see aeglustab sisestamist oluliselt.
- Triggereid mitte tĂ€itmine tĂ€hendab, et andmebaasi ĂŒldine seisund (teised tabelid) sĂ”ltub sellest, millises reĆŸiimis need andmed sisestati. See rikub selgelt andmete jĂ€rjepidevust ja ei saa olla lahendus tootmisökos.
- Soovitud operatsiooni teostamise vĂ”imetus mĂ”istetakse ĂŒldiselt kui viga. Kuid sellega seoses tuleb meeles pidada, et APPEND on vihje, ja vihjete ĂŒldine loogika on see, et neid arvestatakse, kui see on vĂ”imalik; kui ei, siis teostatakse operaator ilma vihje arvestamiseta.
Seega on oodatav vastus - andmed laaditakse tavalisel (SQL) reĆŸiimil, triger kĂ€ivitub.
Oracle'i dokumentatsiooni kohaselt (tsiteeritud alates 8.04):
Piirangute rikkumine pĂ”hjustab kĂ€su tĂ€itmise jĂ€rjestikuse viisi kasutamise, kasutades tavapĂ€rast sisestusteed, ilma hoiatuste ja veateadeteta. Erandiks on piirangud, mille kohaselt ligipÀÀseb sama tabelit rohkem kui ĂŒks kord tehingu kĂ€igus, mis vĂ”ib pĂ”hjustada veateateid.
NÀiteks, kui tabelis on kÀivitid vÔi viidatud terviklikkus, siis APPEND vihje ignoreeritakse, kui proovite kasutada otsekoha (seeria vÔi paralleel) INSERT-e, samuti PARALLEL vihjet vÔi klauslit, kui selline on.
Mis juhtub jÀrgmise skripti tÀitmisel?
loo tabel t(i tÀisarv mitte null esmane vÔti, j tÀisarv viidatud t);
loo kÀiviti t_a_i pÀrast sisestamist t iga rea jaoks
deklaratsioon
pragma autonoomne tehing;alustage
sisestage t vÀÀrtused (:uus.i + 1, :uus.i);
kinnitage;
lÔpp;
/
sisestage t vÀÀrtused (1, null);
- TĂ€ideti edukalt
- TĂ”rge sĂŒntaktilise vea tĂ”ttu
- Viga, mis on seotud autonoomse tehingu keeldumisega
- Viga, mis on seotud maksimumkutsumise pesade ĂŒ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 tohiks probleeme tekitada. Autonoomsed tehingud kÀivitusel on samuti lubatud, vastasel juhul ei oleks vÔimalik nÀiteks logimist.
Esimese rea sisestamise jĂ€rel kĂ€ivitamine kĂ€ivitit viib teise rea sisestamiseni, mis taas kĂ€ivitab kĂ€iviti, sisestab kolmanda rea jne, kuni statement kukub Ă€ra maksimumkutsumise pesade ĂŒletamise tĂ”ttu. Siiski tekib veel ĂŒks nĂŒanss. KĂ€iviti tĂ€itmise ajal ei ole esimese sisestatud kirje kommiteerimine veel tehtud. Seega ĂŒritab autonoomses tehingus töötav kĂ€iviti sisestada tabelisse rea, mis viitab vĂ€lisvĂ”tmele veel mitte-kinnitunud kirjele. See viib ootusse (autonoomne tehing ootab peamise tehingu kinnitamist, et mĂ”ista, kas andmeid saab sisestada) ja samal ajal ootab peamine tehing kinnitatud autonoomset, et jĂ€tkata kĂ€iviti jĂ€rel. Tekkib deadlock ja tagajĂ€rjel lĂ”petatakse autonoomne tehing lukustustega seotud pĂ”hjusel.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kas oli keeruline?
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. VÀltis 10 kasutajat.
Allikas: habr.com
