Yn dilyn yn ôl troed Highload++ Siberia 2019 - 8 tasg ar Oracle

Hi!

Ar 24-25 Mehefin, cynhaliwyd cynhadledd Highload++ Siberia 2019 yn Novosibirsk. Roedd ein bechgyn ni yno hefyd adroddiad “Cronfeydd data cynwysyddion Oracle (CDB/PDB) a'u defnydd ymarferol ar gyfer datblygu meddalwedd", byddwn yn cyhoeddi fersiwn testun ychydig yn ddiweddarach. Roedd yn cŵl, diolch olegbunin ar gyfer y sefydliad, yn ogystal ag i bawb a ddaeth.

Yn dilyn yn ôl troed Highload++ Siberia 2019 - 8 tasg ar Oracle
Yn y swydd hon, hoffem rannu gyda chi y problemau a gawsom yn ein bwth fel y gallwch brofi eich gwybodaeth Oracle. O dan y toriad mae 8 problem, opsiynau ateb ac esboniad.

Beth yw'r gwerth dilyniant mwyaf y byddwn yn ei weld o ganlyniad i weithredu'r sgript ganlynol?

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
  • Na, bydd gwall

AtebYn ôl dogfennaeth Oracle (dyfynnwyd o 8.1.6):
O fewn un datganiad SQL, bydd Oracle yn cynyddu'r dilyniant unwaith y rhes yn unig. Os yw gosodiad yn cynnwys mwy nag un cyfeiriad at NEXTVAL ar gyfer dilyniant, mae Oracle yn cynyddu'r dilyniant unwaith ac yn dychwelyd yr un gwerth ar gyfer pob digwyddiad o NEXTVAL. Os yw datganiad yn cynnwys cyfeiriadau at CURRVAL a NEXTVAL, mae Oracle yn cynyddu'r dilyniant ac yn dychwelyd yr un gwerth ar gyfer CURRVAL a NESAF beth bynnag fo'u trefn yn y datganiad.

Felly, mae'r bydd y gwerth mwyaf yn cyfateb i nifer y llinellau, hynny yw 5.

Sawl rhes fydd yn y tabl o ganlyniad i redeg y sgript ganlynol?

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

AtebYn ôl dogfennaeth Oracle (dyfynnwyd o 11.2):

Cyn gweithredu unrhyw ddatganiad SQL, mae Oracle yn nodi man arbed ymhlyg (ddim ar gael i chi). Yna, os bydd y datganiad yn methu, mae Oracle yn ei rolio'n ôl yn awtomatig ac yn dychwelyd y cod gwall perthnasol i SQLCODE yn y SQLCA. Er enghraifft, os yw datganiad INSERT yn achosi gwall trwy geisio mewnosod gwerth dyblyg mewn mynegai unigryw, caiff y datganiad ei rolio'n ôl.

Mae galw HP gan y cleient hefyd yn cael ei ystyried a'i brosesu fel un datganiad. Felly, mae'r alwad HP gyntaf yn cael ei chwblhau'n llwyddiannus, ar ôl mewnosod tri chofnod; mae'r ail alwad HP yn dod i ben gyda gwall ac yn rholio'n ôl y pedwerydd cofnod y llwyddodd i'w fewnosod; y trydydd galwad yn methu, ac y mae tri chofnod yn y tabl.

Sawl rhes fydd yn y tabl o ganlyniad i redeg y sgript ganlynol?

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

AtebYn ôl dogfennaeth Oracle (dyfynnwyd o 11.2):

Mae cyfyngiad siec yn gadael i chi nodi amod y mae'n rhaid i bob rhes yn y tabl ei fodloni. I fodloni'r cyfyngiad, rhaid i bob rhes yn y tabl wneud yr amod naill ai'n WIR neu'n anhysbys (oherwydd nwl). Pan fydd Oracle yn gwerthuso cyflwr cyfyngiad siec ar gyfer rhes benodol, mae unrhyw enwau colofn yn y cyflwr yn cyfeirio at y gwerthoedd colofn yn y rhes honno.

Felly, bydd y gwerth null yn pasio'r siec, a bydd y bloc dienw yn cael ei weithredu'n llwyddiannus hyd nes y bydd ymgais i fewnosod y gwerth 3. Ar ôl hyn, bydd y bloc trin gwall yn clirio'r eithriad, ni fydd unrhyw ddychwelyd yn digwydd, a bydd pedair rhes ar ôl yn y bwrdd gyda gwerthoedd 1, null, 2 a null eto.

Pa barau o werthoedd fydd yn cymryd yr un faint o le yn y bloc?

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 ac X
  • B ac Y
  • C a K
  • C ac Z
  • K a Z
  • Rwyf i a J
  • J ac X
  • Rhestrir pob un

AtebDyma ddyfyniadau o'r ddogfennaeth (12.1.0.2) ar storio gwahanol fathau o ddata yn Oracle.

Math o Ddata CHAR
Mae'r math o ddata CHAR yn pennu llinyn nod hyd sefydlog yn set nodau'r gronfa ddata. Rydych chi'n nodi set nodau'r gronfa ddata pan fyddwch chi'n creu eich cronfa ddata. Mae Oracle yn sicrhau bod gan bob gwerth sy'n cael ei storio mewn colofn CHAR yr hyd a bennir yn ôl maint yn y semanteg hyd a ddewiswyd. Os ydych chi'n mewnosod gwerth sy'n fyrrach na hyd y golofn, yna mae Oracle yn padio'r gwerth i hyd y golofn.

VARCHAR2 Math o Ddata
Mae'r math data VARCHAR2 yn pennu llinyn nodau hyd newidiol yn set nodau'r gronfa ddata. Rydych chi'n nodi set nodau'r gronfa ddata pan fyddwch chi'n creu eich cronfa ddata. Mae Oracle yn storio gwerth nod mewn colofn VARCHAR2 yn union fel y byddwch chi'n ei nodi, heb unrhyw badin gwag, ar yr amod nad yw'r gwerth yn fwy na hyd y golofn.

NUMBER Math o Ddata
Mae'r math o ddata RHIF yn storio sero yn ogystal â rhifau sefydlog positif a negatif gyda gwerthoedd absoliwt o 1.0 x 10-130 i ond heb gynnwys 1.0 x 10126. Os byddwch yn nodi mynegiad rhifyddol y mae ei werth â gwerth absoliwt yn fwy na neu'n hafal i 1.0 x 10126, yna mae Oracle yn dychwelyd gwall. Mae angen rhwng 1 a 22 beit ar gyfer pob gwerth RHIF. Gan gymryd hyn i ystyriaeth, gellir cyfrifo maint y golofn mewn beit ar gyfer gwerth data rhifol penodol NUMBER(p), lle mae p yn fanylder gwerth penodol, gan ddefnyddio’r fformiwla ganlynol: ROWND((hyd(p)+s)/2))+1 lle mae s yn hafal i sero os yw'r rhif yn bositif, a s yn hafal i 1 os yw'r rhif yn negatif.

Yn ogystal, gadewch i ni gymryd dyfyniad o'r ddogfennaeth am storio gwerthoedd Null.

null yw absenoldeb gwerth mewn colofn. Mae nulls yn dynodi data coll, anhysbys neu amherthnasol. Mae nulls yn cael eu storio yn y gronfa ddata os ydynt yn disgyn rhwng colofnau â gwerthoedd data. Yn yr achosion hyn, mae angen 1 beit arnynt i storio hyd y golofn (sero). Nid oes angen storio nulliau llusgo yn olynol oherwydd mae pennawd rhes newydd yn nodi bod y colofnau sy'n weddill yn y rhes flaenorol yn nwl. Er enghraifft, os yw tair colofn olaf tabl yn nwl, yna ni chaiff unrhyw ddata ei storio ar gyfer y colofnau hyn.

Yn seiliedig ar y data hyn, rydym yn adeiladu rhesymu. Tybiwn fod y gronfa ddata yn defnyddio amgodio AL32UTF8. Yn yr amgodio hwn, bydd llythyrau Rwsiaidd yn meddiannu 2 beit.

1) A ac X, mae gwerth cae a 'Y' yn cymryd 1 beit, mae gwerth maes x 'D' yn cymryd 2 beit
2) B ac Y, 'Vasya' yn b bydd y gwerth yn cael ei badio â bylchau hyd at 10 nod a bydd yn cymryd 14 beit, bydd 'Vasya' yn d yn cymryd 8 beit.
3) C a K. Mae gan y ddau faes y gwerth NULL, ar eu hôl mae meysydd sylweddol, felly maent yn meddiannu 1 beit.
4) C a Z. Mae gan y ddau faes y gwerth NULL, ond maes Z yw'r olaf yn y tabl, felly nid yw'n cymryd lle (0 beit). Mae maes C yn llenwi 1 beit.
5) K a Z. Yn debyg i'r achos blaenorol. Mae'r gwerth yn y maes K yn meddiannu 1 beit, yn Z – 0.
6) I a J. Yn ôl y ddogfennaeth, bydd y ddau werth yn cymryd 2 bytes. Rydyn ni'n cyfrifo'r hyd gan ddefnyddio'r fformiwla a gymerwyd o'r ddogfennaeth: rownd( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J a X. Bydd y gwerth yn y maes J yn cymryd 2 beit, bydd y gwerth yn y maes X yn cymryd 2 beit.

Yn gyfan gwbl, yr opsiynau cywir yw: C a K, I a J, J ac X.

Beth yn fras fydd ffactor clystyru'r mynegai 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);

  • Tua degau
  • Am gannoedd
  • Am filoedd
  • Tua degau o filoedd

AtebYn ôl dogfennaeth Oracle (dyfynnwyd o 12.1):

Ar gyfer mynegai coed-B, mae'r ffactor clystyru mynegai yn mesur grwpio ffisegol rhesi mewn perthynas â gwerth mynegai.

Mae'r ffactor clystyru mynegai yn helpu'r optimizer i benderfynu a yw sgan mynegai neu sgan tabl llawn yn fwy effeithlon ar gyfer rhai ymholiadau). Mae ffactor clystyru isel yn dangos sgan mynegai effeithlon.

Mae ffactor clystyru sy'n agos at nifer y blociau mewn tabl yn nodi bod y rhesi wedi'u trefnu'n gorfforol yn y blociau tabl yn ôl yr allwedd mynegai. Os yw'r gronfa ddata yn perfformio sgan tabl llawn, yna mae'r gronfa ddata yn dueddol o adfer y rhesi wrth iddynt gael eu storio ar ddisg wedi'u didoli gan yr allwedd mynegai. Mae ffactor clystyru sy'n agos at nifer y rhesi yn nodi bod y rhesi wedi'u gwasgaru ar hap ar draws blociau'r gronfa ddata mewn perthynas â'r allwedd mynegai. Os yw'r gronfa ddata yn perfformio sgan tabl llawn, yna ni fyddai'r gronfa ddata yn adalw rhesi mewn unrhyw drefn wedi'u didoli gan yr allwedd mynegai hon.

Yn yr achos hwn, mae'r data wedi'i ddidoli'n ddelfrydol, felly bydd y ffactor clystyru yn gyfartal neu'n agos at nifer y blociau a feddiannir yn y tabl. Ar gyfer maint bloc safonol o 8 kilobytes, gallwch ddisgwyl y bydd tua mil o werthoedd rhif cul yn ffitio i mewn i un bloc, felly nifer y blociau, ac o ganlyniad, y ffactor clystyru fydd tua degau.

Ar ba werthoedd N fydd y sgript ganlynol yn cael ei gweithredu'n llwyddiannus mewn cronfa ddata reolaidd gyda gosodiadau safonol?

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

AtebYn ôl dogfennaeth Oracle (dyfynnwyd o 11.2):

Terfynau Cronfa Ddata Rhesymegol

Eitem
Math o Gyfyngiad
Gwerth Terfyn

Mynegeion
Cyfanswm maint y golofn wedi'i mynegeio
75% o faint bloc y gronfa ddata llai rhywfaint o orbenion

Felly, ni ddylai cyfanswm maint y colofnau mynegrifol fod yn fwy na 6Kb. Mae'r hyn sy'n digwydd nesaf yn dibynnu ar yr amgodio sylfaen a ddewiswyd. Ar gyfer amgodio AL32UTF8, gall un nod feddiannu uchafswm o 4 beit, felly yn y senario waethaf, bydd tua 6 o nodau yn ffitio i mewn i 1500 cilobeit. Felly, bydd Oracle yn gwrthod creu mynegai ar N = 400 (pan mai hyd bysell yr achos gwaethaf yw 1600 nod * 4 bytes + hyd rhesog), tra ar N = 200 (neu lai) bydd creu'r mynegai yn gweithio heb broblemau.

Mae'r gweithredwr INSERT gyda'r awgrym APPEND wedi'i gynllunio i lwytho data mewn modd uniongyrchol. Beth sy'n digwydd os caiff ei roi ar y bwrdd y mae'r sbardun yn hongian arno?

  • Bydd y data yn cael ei lwytho yn y modd uniongyrchol, bydd y sbardun yn gweithio yn ôl y disgwyl
  • Bydd y data yn cael ei lwytho yn y modd uniongyrchol, ond ni fydd y sbardun yn cael ei weithredu
  • Bydd y data yn cael ei lwytho yn y modd confensiynol, bydd y sbardun yn gweithio fel y dylai
  • Bydd y data yn cael ei lwytho yn y modd confensiynol, ond ni fydd y sbardun yn cael ei weithredu
  • Ni fydd y data yn cael ei lwytho, bydd gwall yn cael ei gofnodi

AtebYn y bôn, mae hwn yn fwy o gwestiwn o resymeg. I ddod o hyd i'r ateb cywir, byddwn yn awgrymu'r model rhesymu canlynol:

  1. Mae mewnosod yn y modd uniongyrchol yn cael ei berfformio trwy ffurfio bloc data yn uniongyrchol, gan osgoi'r injan SQL, sy'n sicrhau cyflymder uchel. Felly, mae sicrhau gweithrediad y sbardun yn anodd iawn, os nad yn amhosibl, ac nid oes unrhyw bwynt i hyn, gan y bydd yn dal i arafu'r mewnosodiad yn radical.
  2. Bydd methu â gweithredu'r sbardun yn arwain at y ffaith, os yw'r data yn y tabl yr un peth, y bydd cyflwr y gronfa ddata gyfan (tablau eraill) yn dibynnu ar y modd y mewnosodwyd y data hwn. Bydd hyn yn amlwg yn dinistrio cywirdeb data ac ni ellir ei gymhwyso fel ateb wrth gynhyrchu.
  3. Mae'r anallu i gyflawni'r llawdriniaeth y gofynnwyd amdani yn cael ei drin yn gyffredinol fel gwall. Ond yma dylem gofio mai awgrym yw ATTODIAD, a rhesymeg gyffredinol awgrymiadau yw eu bod yn cael eu cymryd i ystyriaeth os yn bosibl, ond os na, gweithredir y gweithredwr heb gymryd yr awgrym i ystyriaeth.

Felly yr ateb disgwyliedig yw bydd y data'n cael ei lwytho yn y modd arferol (SQL), bydd y sbardun yn tanio.

Yn ôl dogfennaeth Oracle (dyfynnwyd o 8.04):

Bydd torri'r cyfyngiadau yn achosi i'r datganiad weithredu'n gyfresol, gan ddefnyddio'r llwybr mewnosod confensiynol, heb rybuddion na negeseuon gwall. Eithriad yw'r cyfyngiad ar ddatganiadau sy'n cyrchu'r un tabl fwy nag unwaith mewn trafodiad, a all achosi negeseuon gwall.
Er enghraifft, os oes sbardunau neu gyfanrwydd cyfeiriol yn bresennol ar y bwrdd, yna anwybyddir yr awgrym ATODIAD pan geisiwch ddefnyddio INSERT llwyth uniongyrchol (cyfresol neu gyfochrog), yn ogystal â'r awgrym neu gymal PARALLEL, os o gwbl.

Beth fydd yn digwydd pan fydd y sgript ganlynol yn cael ei gweithredu?

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

  • Cwblhau llwyddiannus
  • Methiant oherwydd gwall cystrawen
  • Gwall: Nid yw Trafodiad Ymreolaethol yn Ddilys
  • Gwall yn ymwneud â mynd dros uchafswm y nythu galwadau
  • Gwall Torri Allwedd Tramor
  • Gwall yn ymwneud â chloeon

AtebMae'r tabl a'r sbardun yn cael eu creu yn eithaf cywir ac ni ddylai'r llawdriniaeth hon arwain at broblemau. Caniateir trafodion ymreolaethol mewn sbardun hefyd, fel arall ni fyddai logio yn bosibl, er enghraifft.

Ar ôl mewnosod y rhes gyntaf, byddai tanio sbardun llwyddiannus yn achosi i'r ail res gael ei fewnosod, gan achosi'r sbardun i dân eto, mewnosod trydydd rhes, ac yn y blaen nes bod y datganiad yn methu oherwydd bod yn fwy na'r uchafswm nythu galwadau. Fodd bynnag, daw pwynt cynnil arall i chwarae. Ar yr adeg y gweithredir y sbardun, nid yw ymrwymiad wedi'i gwblhau eto ar gyfer y cofnod cyntaf a fewnosodwyd. Felly, mae sbardun sy'n rhedeg mewn trafodiad ymreolaethol yn ceisio mewnosod rhes yn y tabl sy'n cyfeirio at allwedd dramor at gofnod nad yw wedi'i ymrwymo eto. Mae hyn yn arwain at aros (mae'r trafodiad ymreolaethol yn aros i'r prif drafodiad ymrwymo i weld a all fewnosod data) ac ar yr un pryd mae'r prif drafodiad yn aros i'r trafodiad ymreolaethol barhau i weithio ar ôl y sbardun. Mae terfyn amser yn digwydd ac, o ganlyniad, mae'r trafodiad ymreolaethol yn cael ei ganslo oherwydd rhesymau'n ymwneud â chloeon.

Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg. Mewngofnodios gwelwch yn dda.

Roedd yn anodd i?

  • Fel dau fys, penderfynais bopeth yn gywir ar unwaith.

  • Ddim mewn gwirionedd, roeddwn yn anghywir ar un neu ddau o gwestiynau.

  • Fe wnes i ddatrys ei hanner yn gywir.

  • Fe wnes i ddyfalu'r ateb ddwywaith!

  • Ysgrifennaf yn y sylwadau

Pleidleisiodd 14 o ddefnyddwyr. Ataliodd 10 o ddefnyddwyr.

Ffynhonnell: hab.com

Ychwanegu sylw