Pagsunod sa mga lakang sa Highload++ Siberia 2019 - 8 nga mga buluhaton sa Oracle

Hello!

Kaniadtong Hunyo 24-25, ang Highload++ Siberia 2019 nga komperensya gihimo sa Novosibirsk. Ang among mga lalaki didto usab report "Mga database sa sudlanan sa Oracle (CDB / PDB) ug ang ilang praktikal nga paggamit alang sa pagpalambo sa software", mag-publish kami usa ka bersyon sa teksto sa ulahi. Nindot kadto, salamat olegbunin alang sa organisasyon, ingon man sa tanan nga mianhi.

Pagsunod sa mga lakang sa Highload++ Siberia 2019 - 8 nga mga buluhaton sa Oracle
Sa kini nga post, gusto namon nga ipaambit kanimo ang mga problema nga naa sa among booth aron masulayan nimo ang imong kahibalo sa Oracle. Ubos sa pagputol mao ang 8 ka mga problema, mga kapilian sa tubag ug katin-awan.

Unsa ang labing taas nga kantidad sa pagkasunod-sunod nga atong makita ingon usa ka sangputanan sa pagpatuman sa mosunod nga script?

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
  • Dili, adunay usa ka sayup

TubagSumala sa dokumentasyon sa Oracle (gikutlo gikan sa 8.1.6):
Sulod sa usa ka pahayag sa SQL, ang Oracle magdugang sa pagkasunod-sunod kausa ra matag laray. Kung ang usa ka pahayag adunay labaw pa sa usa ka reperensiya sa NEXTVAL alang sa usa ka han-ay, ang Oracle magdugang sa pagkasunod-sunod sa makausa ug ibalik ang parehas nga kantidad alang sa tanan nga mga panghitabo sa NEXTVAL. Kung ang usa ka pahayag adunay mga pakisayran sa CURRVAL ug NEXTVAL, ang Oracle nagdugang sa pagkasunod-sunod ug nagbalik sa parehas nga kantidad alang sa CURRVAL ug NEXTVAL bisan unsa pa ang ilang order sa sulod sa pahayag.

Busa, ang kinatas-ang bili motakdo sa gidaghanon sa mga linya, nga mao ang 5.

Pila ka laray ang anaa sa lamesa isip resulta sa pagpadagan sa mosunod nga script?

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

TubagSumala sa dokumentasyon sa Oracle (gikutlo gikan sa 11.2):

Sa wala pa ipatuman ang bisan unsang pahayag sa SQL, gimarkahan sa Oracle ang usa ka implicit nga savepoint (dili magamit kanimo). Unya, kung ang pamahayag mapakyas, Oracle roll kini balik awtomatik ug ibalik ang angay nga error code sa SQLCODE sa SQLCA. Pananglitan, kung ang usa ka INSERT nga pahayag hinungdan sa usa ka sayup pinaagi sa pagsulay sa pagsulud sa usa ka doble nga kantidad sa usa ka talagsaon nga indeks, ang pahayag ibalik.

Ang pagtawag sa HP gikan sa kliyente giisip usab ug giproseso isip usa ka pahayag. Sa ingon, ang unang tawag sa HP malampuson nga nakompleto, nga nakasulod og tulo ka mga rekord; ang ikaduha nga tawag sa HP natapos sa usa ka sayup ug gibalik ang ikaupat nga rekord nga nahimo niini nga ipasok; napakyas ang ikatulo nga tawag, ug adunay tulo ka mga talaan sa lamesa.

Pila ka laray ang anaa sa lamesa isip resulta sa pagpadagan sa mosunod nga script?

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

TubagSumala sa dokumentasyon sa Oracle (gikutlo gikan sa 11.2):

Ang usa ka pagpugong sa tseke nagtugot kanimo sa pagtino sa usa ka kondisyon nga kinahanglan matagbaw sa matag laray sa lamesa. Aron matagbaw ang pagpugong, ang matag laray sa lamesa kinahanglan maghimo sa kondisyon nga TINUOD o wala mailhi (tungod sa usa ka null). Kung gi-evaluate sa Oracle ang kondisyon sa pagpugong sa tseke alang sa usa ka partikular nga laray, ang bisan unsang mga ngalan sa kolum sa kondisyon nagtumong sa mga kantidad sa kolum sa kana nga laray.

Sa ingon, ang bili nga null mopasa sa tseke, ug ang anonymous block malamposong ipatuman hangtud nga usa ka pagsulay sa pagsal-ot sa bili 3. Human niini, ang error handling block motangtang sa eksepsiyon, walay rollback nga mahitabo, ug adunay upat ka laray nga nahibilin sa lamesa nga adunay mga kantidad 1, null, 2 ug null pag-usab.

Unsang mga pares sa mga kantidad ang mokuha sa parehas nga kantidad sa wanang sa bloke?

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 ug X
  • B ug Y
  • C ug K
  • C ug Z
  • K ug Z
  • Ako ug si J
  • J ug X
  • Gilista ang tanan

TubagAnia ang mga kinutlo gikan sa dokumentasyon (12.1.0.2) sa pagtipig sa lainlaing klase sa datos sa Oracle.

Type sa Data sa CHAR
Ang tipo sa datos sa CHAR nagtino sa usa ka fixed-length character string sa database character set. Gitakda nimo ang set sa karakter sa database kung imong gimugna ang imong database. Gisiguro sa Oracle nga ang tanan nga mga kantidad nga gitipigan sa usa ka kolum sa CHAR adunay gitas-on nga gitakda sa gidak-on sa pinili nga mga semantika sa gitas-on. Kung magsal-ot ka og value nga mas mubu kay sa gitas-on sa column, unya ang Oracle blank-pads sa value ngadto sa column length.

VARCHAR2 Data Type
Ang VARCHAR2 data type nagtino sa usa ka variable-length character string sa database character set. Gitakda nimo ang set sa karakter sa database kung imong gimugna ang imong database. Ang Oracle nagtipig sa usa ka kantidad sa karakter sa usa ka kolum nga VARCHAR2 sama sa imong gipiho, nga wala’y bisan unsang blangko nga padding, kung ang kantidad dili molapas sa gitas-on sa kolum.

NUMBER Type sa Data
Ang NUMBER data type nagtipig og zero ingon man ang positibo ug negatibo nga fixed nga mga numero nga adunay hingpit nga mga bili gikan sa 1.0 x 10-130 ngadto sa apan dili naglakip sa 1.0 x 10126. 1.0 x 10126, unya gibalik sa Oracle ang usa ka sayup. Ang matag NUMBER nga kantidad nanginahanglan gikan sa 1 hangtod 22 byte. Sa pagkonsiderar niini, ang gidak-on sa kolum sa mga byte alang sa usa ka partikular nga numeric data value NUMBER(p), diin ang p mao ang katukma sa gihatag nga value, mahimong kalkulado gamit ang mosunod nga pormula: ROUND((gitas-on(p)+s)/2))+1 diin ang s katumbas sa zero kung ang numero positibo, ug ang s katumbas sa 1 kung ang numero negatibo.

Dugang pa, magkuha kita usa ka kinutlo gikan sa dokumentasyon bahin sa pagtipig sa mga kantidad sa Null.

Ang null mao ang pagkawala sa usa ka bili sa usa ka kolum. Ang mga null nagpakita nga nawala, wala mailhi, o dili magamit nga datos. Ang mga null gitipigan sa database kung nahulog sila sa taliwala sa mga kolum nga adunay mga kantidad sa datos. Niini nga mga kaso, nagkinahanglan sila og 1 byte aron tipigan ang gitas-on sa kolum (zero). Ang pagsubay sa mga null sa usa ka laray wala magkinahanglan og pagtipig tungod kay ang usa ka bag-ong row header nagpahibalo nga ang nahabilin nga mga kolum sa miaging laray kay null. Pananglitan, kung ang katapusang tulo ka mga kolum sa usa ka lamesa walay pulos, nan walay datos nga gitipigan alang niini nga mga kolum.

Pinasukad niini nga mga datos, nagtukod kami og pangatarungan. Nagtuo kami nga ang database naggamit sa AL32UTF8 encoding. Niini nga pag-encode, ang mga letra sa Russia mag-okupar sa 2 bytes.

1) A ug X, ang bili sa field usa ka 'Y' nagkinahanglan og 1 byte, ang bili sa field x 'D' nagkinahanglan og 2 bytes
2) B ug Y, 'Vasya' sa b ang bili mapuno sa mga espasyo hangtod sa 10 ka karakter ug mokuha ug 14 ka byte, ang 'Vasya' sa d mokuha ug 8 bytes.
3) C ug K. Ang duha ka mga natad adunay kantidad nga NULL, pagkahuman niini adunay hinungdanon nga mga natad, mao nga sila nag-okupar sa 1 ka byte.
4) C ug Z. Ang duha ka field adunay bili nga NULL, apan ang field Z mao ang kataposan sa table, mao nga dili kini mokuha ug space (0 bytes). Ang Field C nag-okupar og 1 byte.
5) K ug Z. Susama sa miaging kaso. Ang bili sa K field nag-okupar sa 1 byte, sa Z – 0.
6) I ug J. Sumala sa dokumentasyon, ang duha nga mga kantidad magkuha og 2 bytes. Among kuwentahon ang gitas-on gamit ang pormula nga gikuha gikan sa dokumentasyon: round((1 + 0)/2) +1 = 1 + 1 = 2.
7) J ug X. Ang bili sa J field mokuha ug 2 bytes, ang value sa X field mokuha ug 2 bytes.

Sa kinatibuk-an, ang husto nga mga kapilian mao ang: C ug K, I ug J, J ug X.

Unsa ang gibanabana nga mahimong clustering factor sa T_I index?

create table t (i integer);
 
insert into t select rownum from dual connect by level <= 10000;
 
create index t_i on t(i);

  • Mga tinagpulo
  • Mga gatos
  • Mga liboan
  • Mga tinagpulo ka libo

TubagSumala sa dokumentasyon sa Oracle (gikutlo gikan sa 12.1):

Para sa B-tree index, ang index clustering factor nagsukod sa pisikal nga paggrupo sa mga laray nga may kalabotan sa index value.

Ang index clustering factor makatabang sa optimizer sa pagdesisyon kung ang index scan o full table scan mas episyente para sa pipila ka mga pangutana). Ang ubos nga clustering factor nagpakita sa usa ka episyente nga index scan.

Ang usa ka clustering factor nga duol sa gidaghanon sa mga bloke sa usa ka lamesa nagpakita nga ang mga laray pisikal nga gi-order sa mga bloke sa lamesa pinaagi sa index key. Kung ang database naghimo sa usa ka bug-os nga pag-scan sa lamesa, nan ang database lagmit nga makuha ang mga laray samtang kini gitipigan sa disk nga gisunud sa index key. Ang usa ka clustering factor nga duol sa gidaghanon sa mga laray nagpakita nga ang mga laray nagkatag nga random tabok sa mga bloke sa database kalabot sa index key. Kung ang database naghimo sa usa ka bug-os nga pag-scan sa lamesa, nan ang database dili makakuha sa mga laray sa bisan unsang han-ay nga han-ay sa kini nga index key.

Sa kini nga kaso, ang datos maayo nga pagkahan-ay, mao nga ang clustering factor mahimong katumbas o duol sa gidaghanon sa giokupahan nga mga bloke sa lamesa. Alang sa usa ka sukaranan nga gidak-on sa bloke nga 8 kilobytes, mahimo nimong mapaabut nga mga usa ka libo nga pig-ot nga mga kantidad sa numero ang mohaum sa usa ka bloke, mao nga ang gidaghanon sa mga bloke, ug ingon usa ka sangputanan, ang hinungdan sa clustering mahimong mga tinagpulo.

Sa unsa nga mga kantidad sa N ang mosunod nga script malampuson nga ipatuman sa usa ka regular nga database nga adunay standard nga mga setting?

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

TubagSumala sa dokumentasyon sa Oracle (gikutlo gikan sa 11.2):

Mga Limitasyon sa Logical Database

item
Matang sa Limitasyon
Limitahan ang Bili

Mga Indeks
Kinatibuk-ang gidak-on sa na-index nga kolum
75% sa gidak-on sa block sa database minus ang pipila ka overhead

Busa, ang kinatibuk-ang gidak-on sa gi-index nga mga kolum kinahanglan dili molapas sa 6Kb. Ang sunod nga mahitabo nagdepende sa gipili nga base encoding. Alang sa AL32UTF8 nga pag-encode, ang usa ka karakter mahimong mag-okupar sa labing taas nga 4 ka byte, mao nga sa pinakagrabe nga sitwasyon sa kaso, mga 6 ka mga karakter ang mohaum sa 1500 ka kilobytes. Busa, dili tugotan sa Oracle ang paghimo sa indeks sa N = 400 (kung ang pinakagrabe nga kaso sa yawe nga gitas-on mao ang 1600 ka karakter * 4 bytes + rowid nga gitas-on), samtang sa N = 200 (o ubos pa) ang paghimo sa index molihok nga walay mga problema.

Ang INSERT operator nga adunay APPEND nga pahiwatig gidesinyo sa pagkarga sa datos sa direkta nga paagi. Unsa ang mahitabo kung kini i-apply sa lamesa diin ang gatilyo nagbitay?

  • Ang datos i-load sa direkta nga mode, ang gatilyo molihok sama sa gipaabut
  • Ang datos i-load sa direkta nga mode, apan ang gatilyo dili ipatuman
  • Ang datos i-load sa conventional mode, ang gatilyo molihok ingon nga kini kinahanglan
  • Ang datos ikarga sa naandan nga paagi, apan ang gatilyo dili ipatuman
  • Ang datos dili ma-load, usa ka sayup ang marekord

TubagSa panguna, kini usa ka pangutana sa lohika. Aron makit-an ang husto nga tubag, akong isugyot ang mosunod nga modelo sa pangatarungan:

  1. Ang pagsal-ot sa direkta nga paagi gihimo pinaagi sa direkta nga pagporma sa usa ka bloke sa datos, pag-bypass sa makina sa SQL, nga nagsiguro sa taas nga tulin. Sa ingon, ang pagsiguro nga ang pagpatuman sa gatilyo lisud kaayo, kung dili imposible, ug wala’y kapuslanan niini, tungod kay kini makapahinay gihapon sa pagsal-ot.
  2. Ang pagkapakyas sa pagpatuman sa gatilyo mosangpot sa kamatuoran nga, kung ang datos sa lamesa parehas, ang kahimtang sa database sa kinatibuk-an (ubang mga lamesa) magdepende sa mode diin kini nga datos gisal-ot. Kini klaro nga makaguba sa integridad sa datos ug dili magamit isip solusyon sa produksiyon.
  3. Ang kawalay katakus sa paghimo sa gihangyo nga operasyon sa kasagaran giisip nga usa ka sayup. Apan dinhi kinahanglan natong hinumdoman nga ang APPEND usa ka pahiwatig, ug ang kinatibuk-ang lohika sa mga pahibalo mao nga kini gikonsiderar kung mahimo, apan kung dili, ang operator gipatuman nga wala gikonsiderar ang pahibalo.

Busa ang gipaabot nga tubag mao ang datos i-load sa normal (SQL) mode, ang gatilyo mobuto.

Sumala sa dokumentasyon sa Oracle (gikutlo gikan sa 8.04):

Ang mga paglapas sa mga pagdili makapahimo sa pahayag nga ipatuman sa sunod-sunod nga paagi, gamit ang naandan nga agianan sa pagsulod, nga wala’y mga pasidaan o mga mensahe sa sayup. Ang usa ka eksepsiyon mao ang pagdili sa mga pahayag nga maka-access sa parehas nga lamesa labaw sa kausa sa usa ka transaksyon, nga mahimong hinungdan sa mga mensahe sa sayup.
Pananglitan, kung ang mga trigger o referential integrity anaa sa lamesa, unya ang APPEND nga pahiwatig dili tagdon kung imong sulayan ang paggamit sa direkta nga pagkarga nga INSERT (serial o parallel), ingon man ang PARALLEL nga pahiwatig o clause, kung naa.

Unsa ang mahitabo kung ang mosunod nga script ipatuman?

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);

  • Malampuson nga pagpatay
  • Pagkapakyas tungod sa syntax error
  • Sayop: Ang Autonomous nga Transaksyon Dili Balido
  • Kasaypanan nga may kalabutan sa pagsobra sa kinatas-an nga pagsabwag sa tawag
  • Sayop sa Paglapas sa Langyaw nga Key
  • Sayop nga may kalabutan sa mga kandado

TubagAng lamesa ug gatilyo gihimo nga husto ug kini nga operasyon kinahanglan dili mosangpot sa mga problema. Ang mga awtonomous nga transaksyon sa usa ka gatilyo gitugotan usab, kung dili ang pag-log dili mahimo, pananglitan.

Human sa pagsal-ot sa unang laray, ang usa ka malampuson nga gatilyo pagpabuto mahimong hinungdan sa ikaduha nga laray nga gisal-ut, hinungdan sa gatilyo sa pagpabuto pag-usab, pagsal-ot sa usa ka ikatulo nga laray, ug uban pa hangtud nga ang pahayag napakyas tungod sa pagsobra sa maximum nesting sa mga tawag. Bisan pa, ang laing maliputon nga punto moabut sa pagdula. Sa panahon nga ang gatilyo gipatuman, ang commit wala pa makompleto alang sa unang gisulod nga rekord. Busa, ang usa ka trigger nga nagdagan sa usa ka awtonomous nga transaksyon mosulay sa pagsal-ot sa lamesa sa usa ka laray nga nag-refer sa usa ka langyaw nga yawe sa usa ka rekord nga wala pa nahimo. Kini moresulta sa usa ka paghulat (ang autonomous nga transaksyon naghulat alang sa nag-unang transaksyon nga mopasalig aron makita kung kini makasal-ot sa datos) ug sa samang higayon ang nag-unang transaksyon naghulat alang sa autonomous nga transaksyon nga magpadayon sa pagtrabaho human sa trigger. Ang usa ka deadlock mahitabo ug, isip resulta, ang autonomous nga transaksyon nakansela tungod sa mga rason nga may kalabutan sa mga kandado.

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Lisod diay to?

  • Sama sa duha ka tudlo, nakahukom dayon ko sa tanan sa husto.

  • Dili gyud, nasayop ko sa duha ka pangutana.

  • Nasulbad nako ang katunga niini sa husto.

  • Gitag-an nako ang tubag kaduha!

  • Isulat ko sa mga komento

14 ka tiggamit ang nagboto. 10 ka tiggamit ang nag-abstain.

Source: www.habr.com

Idugang sa usa ka comment