đ„Si tĂ« arrish nĂ« qiell dhe tĂ« bĂ«hesh pilot | ProHoster
Më 24-25 qershor në Novosibirsk u mbajt konferenca Highload++ Siberia 2019. Djemtë tanë ishin gjithashtu atje. «Baza të container Oracle (CDB/PDB) dhe përdorimi i tyre praktik për zhvillimin e softuerit», ne do ta publikojmë versionin tekstual pak më vonë. Ishte super, faleminderit për organizimin, si dhe për të gjithë ata që erdhën.

Në këtë post do të doja të ndaja me ju detyrat që ishin në stendën tonë, në mënyrë që ju të mund të kontrolloni njohuritë tuaja në Oracle. Poshtë keni 8 detyra, variante përgjigjesh dhe shpjegime.
ĂfarĂ« Ă«shtĂ« vlera maksimale e sekuencĂ«s qĂ« do tĂ« shohim si rezultat i ekzekutimit tĂ« kĂ«tij skenari?
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
- Asnjë, do të ketë një gabim.
PërgjigjeSipas dokumentacionit Oracle (cituar nga 8.1.6):
Brenda një deklarate të vetme SQL, Oracle do të rrisë sekuencën vetëm një herë për rresht. Nëse një deklaratë përmban më shumë se një referencë në NEXTVAL për një sekuencë, Oracle e rrit sekuencën një herë dhe kthen të njëjtën vlerë për të gjitha rastet e NEXTVAL. Nëse një deklaratë përmban referenca si CURRVAL, ashtu edhe NEXTVAL, Oracle e rrit sekuencën dhe kthen të njëjtën vlerë për të dy CURRVAL dhe NEXTVAL, pa marrë parasysh rendin e tyre brenda deklaratës.
Kështu, Vlera maksimale do të përputhet me numrin e rreshtave, pra 5..
Sa rreshta do të përfundojnë në tabelë si rezultat i ekzekutimit të këtij skenari?
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
PërgjigjeSipas dokumentacionit Oracle (cituar nga 11.2):
Para se të ekzekutojë çdo deklaratë SQL, Oracle shënon një savepoint implicit (nuk është në dispozicion për ju). Më pas, nëse deklarata dështon, Oracle e rikthen automatikisht dhe kthen kodin e gabimit të përkatshëm në SQLCODE në SQLCA. Për shembull, nëse një deklaratë INSERT shkakton një gabim duke u përpjekur të fusë një vlerë të rëndësishme në një indeks unik, deklarata rikthehet.
Thirrja e procedurës të ruajtur nga klienti gjithashtu shqyrtohet dhe përpunohen si një deklaratë e vetme. Kështu, thirrja e parë e procedurës së ruajtur përfundon me sukses, duke shtuar tre regjistrime; thirrja e dytë përfundon me një gabim dhe rikthen regjistrimin e katërt që mundi të fusë; thirrja e tretë përfundon me një gabim, dhe në tabelë përfundojnë tre regjistrime..
Sa rreshta do të përfundojnë në tabelë si rezultat i ekzekutimit të këtij skenari?
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
PërgjigjeSipas dokumentacionit Oracle (cituar nga 11.2):
Një kusht kontrolli ju lejon të specifikoni një kusht që çdo rresht në tabelë duhet të përmbushë. Për të plotësuar kushtin, çdo rresht në tabelë duhet të bëjë që kushti të jetë ose TRUE ose i panjohur (për shkak të null). Kur Oracle vlerëson një kusht kontrolli për një rresht të veçantë, emrat e kolonave në kusht i referohen vlerave të kolonave në atë rresht.
Kështu, vlera null do të kalojë kontrollin, dhe blloku anonim do të ekzekutohet me sukses deri në përpjekjen për të futur vlerën 3. Pas kësaj, blloku i trajtimit të gabimeve do ta ndalë përjashtimin, nuk do të ndodhi asnjë rikthim dhe në tabelë do të mbeten katër rreshta me vlerat 1, null, 2 dhe përsëri null.
Cilat palë vlerash do të zënë të njëjtën hapësirë në bllok?
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', 'Vasil', 10, 10, 'D', 'Vasil');
- A dhe X
- B dhe Y
- C dhe K
- C dhe Z
- K dhe Z
- I dhe J
- J dhe X
- Të gjitha të renditurat
PërgjigjeDo të japim përmbledhje nga dokumentacioni (12.1.0.2) mbi ruajtjen e tipeve të ndryshëm të të dhënave në Oracle.
Tipi i të Dhënave CHAR
Tipi i të dhënave CHAR specifikon një string karakteresh me gjatësi fikse në setin e karaktereve të databazës. Specifikoni setin e karaktereve të databazës kur krijoni databazën tuaj. Oracle siguron që të gjitha vlerat e ruajta në një kolonë CHAR kanë gjatësi të specifikuar nga madhësia në semantikën e zgjedhur. Nëse insertoni një vlerë që është më e shkurtër se gjatësi e kolonës, Oracle e plotëson vlerën me hapësira deri te gjatësi e kolonës.
Tipi i të Dhënave VARCHAR2
Tipi i të dhënave VARCHAR2 specifikon një string karakteresh me gjatësi të ndryshueshme në setin e karaktereve të databazës. Specifikoni setin e karaktereve të databazës kur krijoni databazën tuaj. Oracle ruan një vlerë karakteri në një kolonë VARCHAR2 pikërisht ashtu siç e specifikoni, pa asnjë mbushje me hapësira, për sa kohë që vlera nuk kalon gjatësi e kolonës.
Tipi i të Dhënave NUMBER
Tipi i tĂ« dhĂ«nave NUMBER ruan zero si edhe numra tĂ« rregullt pozitivĂ« dhe negativĂ« me vlera absolute nga 1.0 x 10-130 deri por jo pĂ«rfshirĂ« 1.0 x 10126. NĂ«se specifikoni njĂ« shprehje aritmetike qĂ« ka njĂ« vlerĂ« me njĂ« vlerĂ« absolute mĂ« tĂ« madhe ose tĂ« barabartĂ« me 1.0 x 10126, atĂ«herĂ« Oracle kthen njĂ« gabim. Ădo vlerĂ« NUMBER kĂ«rkon nga 1 deri nĂ« 22 bajtĂ«. Duke e marrĂ« kĂ«tĂ« parasysh, madhĂ«sia e kolonĂ«s nĂ« bajta pĂ«r njĂ« vlerĂ« numerike tĂ« veçantĂ« NUMBER(p), ku p Ă«shtĂ« saktĂ«sia e njĂ« vlerĂ« tĂ« caktuar, mund tĂ« llogaritet duke pĂ«rdorur formulĂ«n e mĂ«poshtme: ROUND((length(p)+s) / 2))+1 ku s barazohet me zero nĂ«se numri Ă«shtĂ« pozitiv, dhe s barazohet me 1 nĂ«se numri Ă«shtĂ« negativ.
Për më tepër, le të marrim një përmbledhje nga dokumentacioni mbi ruajtjen e vlerave Null.
Një null është mungesa e një vlerë në një kolonë. Nulls tregojnë të dhëna të humbura, të panjohura ose të papërdorshme. Nulls ruhen në databazë nëse bien ndërmjet kolovnave me vlera të dhënash. Në këto raste, ato kërkojnë 1 bajt për të ruajtur gjatësi e kolonës (zero). Nulls pas një rreshti nuk kërkojnë ruajtje sepse një krye të ri rreshti sinjalizon që kolonat e mbetura në rreshtin e mëparshëm janë null. Për shembull, nëse tre kolona të fundit të një tabele janë null, atëherë asnjë të dhëna nuk ruhet për këto kolona.
Duke u bazuar në këto të dhëna, ne formulojmë arsyetimin. Supozojmë se në DB përdoret kodimi AL32UTF8. Në këtë kodim, shkronjat ruse do të zënë 2 bajta.
1) A dhe X, vlera e fushĂ«s a âYâ zĂ« 1 bajt, vlera e fushĂ«s x âDâ â 2 bajta
2) B dhe Y, 'Vasja' në b do të plotësohet me shkronja deri në 10 karaktere dhe do të marrë 14 byte, 'Vasja' në d - do të marrë 8 byte.
3) C dhe K. Të dy fushat kanë vlerë NULL, pas tyre ka fusha të vlefshme, prandaj zënë nga 1 byte.
4) C dhe Z. TĂ« dy fushat kanĂ« vlerĂ« NULL, por fusha Z â Ă«shtĂ« e fundit nĂ« tabelĂ«, prandaj nuk zĂ« vend (0 byte). Fusha C zĂ« 1 byte.
5) K dhe Z. Siç ishte rastin e mĂ«parshĂ«m. VlerĂ« nĂ« fushĂ«n K zĂ« 1 byte, nĂ« Z â 0.
6) I dhe J. Sipas dokumentacionit, të dy vlerat do të zënë nga 2 byte. Gjatësinë e llogarisim sipas formulës të marrë nga dokumentacioni: round((1 + 0) / 2) + 1 = 1 + 1 = 2.
7) J dhe X. Vlera në fushën J do të marrë 2 byte, vlera në fushën X do të marrë 2 byte.
Deri tani, variantet e sakta janë: C dhe K, I dhe J, J dhe X.
Cila do të jetë pothuajse clustering factor për indeksin T_I?
create table t (i integer);
insert into t select rownum from dual connect by level <= 10000;
create index t_i on t(i);
- Pothuajse dhjetëra
- Pothuajse qindra
- Pothuajse mijëra
- Pothuajse dhjetëra mijëra
PërgjigjeSipas dokumentacionit Oracle (cituar nga 12.1):
Për një indeks B-tree, faktori i grupimit të indeksit mat fizikisht grupimin e rreshtave në lidhje me një vlerë indeksi.
Faktori i grupimit të indeksit ndihmon optimizuesin të vendosë nëse një skanimi indeksi ose një skanimi të plotë të tabelës është më efikas për disa pyetje. Një faktor grupimi i ulët tregon një skanim të efektshëm të indeksit.
Një faktor grupimi që është afër numrit të blloqeve në një tabelë tregon se rreshtat janë fizikisht të renditur në blloqet e tabelës sipas çelësit të indeksit. Nëse databaza përllogarit një skan të plotë të tabelës, atëherë databaza ka tendencë të rikuperojë rreshtat ashtu si janë ruajtur në disk të renditur sipas çelësit të indeksit. Një faktor grupimi që është afër numrit të rreshtave tregon se rreshtat janë të shpërndara rastësisht në blloqet e databazës në lidhje me çelësin e indeksit. Nëse databaza bën një skan të plotë të tabelës, atëherë databaza nuk do të rikuperojë rreshtat në asnjë rend të renditur sipas këtij çelësi indeksi.
Në këtë rast, të dhënat janë të organizuara perfekt, prandaj faktor grupimi do të jetë i barabartë ose afër numrit të blloqeve të zëna në tabelë. Për një madhësi standarde blloku prej 8 kilobytes, mund të pritet që në një bllok mund të vendosen rreth një mijë vlera të ngushta numri, prandaj numri i blloqeve, dhe si pasojë, faktori i grupimit do të jetë pothuajse dhjetëra.
Me çfarë vlerash N skenari i mëposhtëm do të ekzekutohet me sukses në një databazë normale me cilësime standarde?
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
PërgjigjeSipas dokumentacionit Oracle (cituar nga 11.2):
Kufijtë e Logjikës së Databasës
Artikulli
Lloji i Kufirit
Vlera e Kufirit
Indekset
Madhësia totale e kolonave të indeksuara
75% e madhësisë së bllokut të databazës minus disa kosto shtesë
Pra pasojë, madhësia totale e kolonave të indeksuara nuk duhet të kalojë 6 KB. Më tej, kjo varet nga kodimi i zgjedhur i bazës. Për kodimin AL32UTF8, një karakter mund të zërë maksimum 4 byte, kështu që në 6 kilobajt në rastin më të keq hyjnë rreth 1500 karaktere. Prandaj, Oracle do të ndalojë krijimin e indeksit kur N = 400 (kur gjatësi e çelësit në rastin më të keq do të jetë 1600 karaktere * 4 byte + gjatësi e rowid), ndërsa kur N = 200 (dhe më pak) krijimi i indeksit do të funksionojë pa probleme.
Operatori INSERT me hint tĂ« APPEND-it Ă«shtĂ« i destinuar pĂ«r ngarkimin e tĂ« dhĂ«nave nĂ« modalitetin direkt. ĂfarĂ« do tĂ« ndodhĂ« nĂ«se aplikohuese nĂ« tabelĂ« ku ka njĂ« trigger?
- Të dhënat do të ngarkohen në modalitetin direkt, trigger-i do të aktivohet siç duhet
- Të dhënat do të ngarkohen në modalitetin direkt, por trigger-i nuk do të ekzekutohet
- Të dhënat do të ngarkohen në modalitetin konvencional, trigger-i do të aktivohet siç duhet
- Të dhënat do të ngarkohen në modalitetin konvencional, por trigger-i nuk do të ekzekutohet
- Të dhënat nuk do të ngarkohen, do të regjistrohet një gabim
PërgjigjeNë parim, ky është një pyetje më shumë logjike. Për të gjetur përgjigjen e saktë, do të sugjeroja modelin e mëposhtëm të mendimit:
- Inseartimi në modalitetin direkt realizohet përmes formimit të drejtpërdrejtë të bllokut të të dhënave, pa kaluar nga SQL-motori, që siguron shpejtësi të lartë. Kështu, sigurimi i ekzekutimit të trigger-it është shumë i vështirë, nëse jo i pamundur, dhe nuk ka kuptim sepse ai do të ngadalësojë ndjeshëm insertin.
- Mos-ekzekutimi i trigger-it do të sjellë që, nëse të dhënat janë të njëjta në tabelë, gjendja e bazës në përgjithësi (të tjerat tabela) do të varet nga se si janë ngarkuar këto të dhëna. Kjo do ta shkathtësonte qartësinë e të dhënave dhe nuk mund të aplikohet si një zgjidhje në production.
- Mos-arritja për të ekzekutuar operacionin e kërkuar, në përgjithësi, interpretohet si një gabim. Por këtu duhet të kujtojmë se APPEND është një hint, dhe logjika e përgjithshme e hints është se ato konsiderohen nëse është e mundur, nëse jo - operacioni ekzekutohet pa marrë parasysh hintin.
Prandaj, përgjigjja e pritur është - të dhënat do ngarkohen në modalitetin e zakonshëm (SQL), trigger-i do të aktivohet.
Sipas dokumentacionit të Oracle (cituar nga 8.04):
Shkeljet e kufizimeve do të shkaktojnë që deklarata të ekzekutohet serikisht, duke përdorur rrugën e zakonshme të insertit, pa paralajmërime ose mesazhe gabimi. Një përjashtim është kufizimi mbi deklaratat që i qasen të njëjtës tabelë më shumë se një herë në një transaksion, që mund të shkaktojë mesazhe gabimi.
Për shembull, nëse ka tregues ose integritet referencial në tabelë, atëherë kodi APPEND do të injorohet kur të përpiqeni të përdorni INSERT ngarkesë të drejtpërdrejtë (serial ose paralel), ashtu si dhe tregohet ose klauzola PARALLEL, nëse ka.
ĂfarĂ« do tĂ« ndodhĂ« kur tĂ« ekzekutohet skenari i mĂ«poshtĂ«m?
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);
- Ekzekutimi i suksesshëm
- Dështim për shkak të një gabimi sintaksor
- Gabim që lidhet me papranueshmërinë e transaksionit autonom
- Gabim që lidhet me tejkalimin e thellësisë maksimale të thirrjeve
- Gabim që lidhet me shkeljen e çelësit të jashtëm
- Gabim që lidhet me bllokimet
PërgjigjeTabelat dhe treguesi krijohen plotësisht saktë dhe kjo operacion nuk duhet të shkaktojë probleme. Transaksionet autonome në tregues janë gjithashtu të lejuara, ndryshe nuk do të mund të bëhej, për shembull, regjistrimi.
Pas futur sĂ« rreshtit tĂ« parĂ«, aktivizimi i suksesshĂ«m i treguesit do tĂ« çonte nĂ« futjen e rreshtit tĂ« dytĂ«, duke bĂ«rĂ« qĂ« treguesi tĂ« aktivizohej pĂ«rsĂ«ri, tĂ« fusĂ« rreshtin e tretĂ« dhe kĂ«shtu me radhĂ« deri sa deklarata tĂ« dĂ«shtonte pĂ«r shkak tĂ« tejkalimit tĂ« thellĂ«sisĂ« maksimale tĂ« thirrjeve. MegjithatĂ«, ndodh njĂ« moment tjetĂ«r delikat. NĂ« momentin e ekzekutimit tĂ« treguesit pĂ«r tĂ« parin e ngarkuar, ende nuk Ă«shtĂ« kryer commit. Prandaj, treguesi qĂ« punon nĂ« njĂ« transaksion autonom po pĂ«rpiqet tĂ« fusĂ« nĂ« tabelĂ« njĂ« rresht qĂ« referon me çelĂ«sin e jashtĂ«m njĂ« rekord qĂ« nuk Ă«shtĂ« akoma i komituar. Kjo çon nĂ« pritje (transaksioni autonom pret komitin e kryesorit pĂ«r tĂ« kuptuar nĂ«se mund tĂ« insertohet tĂ« dhĂ«nat) dhe njĂ«kohĂ«sisht transaksioni kryesor pret komitin e autonomes pĂ«r tĂ« vazhduar punĂ«n pas treguesit. Kjo shkakton njĂ« deadlock dhe si pasojĂ« â transaksioni autonom eliminohet pĂ«r shkak tĂ« bllokimeve.
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutem.
Ishte e vështirë?
Si dy gishta, e zgjidhëm menjëherë saktë.
Jo shumë, gabova në disa pyetje.
Zgjodha gjysmën saktë.
E kam gjetur përgjigjen dy herë!
Do të shkruaj në komentet
14 përdorues votuan. 10 përdorues u ndalën.
Burimi: habr.com
