A’ leantainn ann an ceumannan Highload ++ Siberia 2019 - 8 gnìomhan air Oracle

Hello!

Air 24-25 Ògmhios, chaidh co-labhairt Highload++ Siberia 2019 a chumail ann an Novosibirsk. aithisg “Stòr-dàta soithichean Oracle (CDB/PDB) agus an cleachdadh practaigeach airson leasachadh bathar-bog", foillsichidh sinn dreach teacsa beagan nas fhaide air adhart. Bha e fionnar, taing olbunin airson na buidhne, cho math ris a h-uile duine a thàinig.

A’ leantainn ann an ceumannan Highload ++ Siberia 2019 - 8 gnìomhan air Oracle
Anns an dreuchd seo, bu mhath leinn na duilgheadasan a bh ’againn aig a’ bhothan againn a cho-roinn riut gus an urrainn dhut d ’eòlas Oracle a dhearbhadh. Fon gearradh tha 8 duilgheadasan, roghainnean freagairt agus mìneachadh.

Dè an luach sreath as àirde a chì sinn mar thoradh air an sgriobt a leanas a chuir an gnìomh?

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
  • Chan e, bidh mearachd ann

FreagairtA rèir sgrìobhainnean Oracle (air ainmeachadh bho 8.1.6):
Taobh a-staigh aon aithris SQL, àrdaichidh Oracle an t-sreath dìreach aon turas gach sreath. Ma tha barrachd air aon iomradh ann an aithris air NEXTVAL airson sreath, bidh Oracle ag àrdachadh an t-sreath aon uair agus a’ tilleadh an aon luach airson gach tachartas de NEXTVAL. Ma tha iomradh ann an aithris air an dà chuid CURRVAL agus NEXTVAL, bidh Oracle ag àrdachadh an t-sreath agus a’ tilleadh an aon luach airson an dà chuid CURRVAL agus NEXTVAL ge bith dè an òrdugh a th’ aca san aithris.

Mar sin, bidh an luach as àirde a rèir an àireamh de loidhnichean, is e sin 5.

Cia mheud sreath a bhios sa chlàr mar thoradh air an sgriobt a leanas a ruith?

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

FreagairtA rèir sgrìobhainnean Oracle (air ainmeachadh bho 11.2):

Mus cuir thu aithris SQL sam bith an gnìomh, tha Oracle a’ comharrachadh àite sàbhalaidh inntinneach (nach eil ri fhaighinn dhut). An uairsin, ma dh’ fhailicheas an aithris, bheir Oracle air ais e gu fèin-ghluasadach agus tillidh e an còd mearachd iomchaidh gu SQLCODE anns an SQLCA. Mar eisimpleir, ma dh’ adhbhraicheas aithris INSERT mearachd le bhith a’ feuchainn ri luach dùblaichte a chuir a-steach ann an clàr-amais sònraichte, thèid an aithris a thoirt air ais.

Thathas cuideachd a’ beachdachadh air fios a chuir gu HP bhon neach-dèiligidh agus air a phròiseasadh mar aon aithris. Mar sin, thig a’ chiad ghairm HP gu crìch gu soirbheachail, an dèidh trì clàran a chuir a-steach; bidh an dàrna gairm HP a’ tighinn gu crìch le mearachd agus a’ cuir air ais an ceathramh clàr a chaidh aige air a chuir a-steach; theid an treas gairm, agus tha tri clàir anns a' chlàr.

Cia mheud sreath a bhios sa chlàr mar thoradh air an sgriobt a leanas a ruith?

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

FreagairtA rèir sgrìobhainnean Oracle (air ainmeachadh bho 11.2):

Leigidh cuingealachadh seic dhut suidheachadh a shònrachadh a dh'fheumas gach sreath sa chlàr a shàsachadh. Gus an cuingeachadh a shàsachadh, feumaidh gach sreath sa chlàr an suidheachadh a dhèanamh TRUE no neo-aithnichte (air sgàth null). Nuair a bhios Oracle a’ measadh suidheachadh cuibhreachaidh seic airson sreath sònraichte, bidh ainmean colbh sam bith san t-suidheachadh a’ toirt iomradh air luachan colbh san t-sreath sin.

Mar sin, thèid an luach null seachad air an t-seic, agus thèid am bloca gun urra a chuir gu bàs gu soirbheachail gus an tèid oidhirp an luach 3 a chuir a-steach. Às deidh seo, bidh am bloca làimhseachadh mearachd a’ glanadh an eisgeachd, cha tachair tilleadh air ais, agus bidh ceithir sreathan air fhàgail sa chlàr le luachan 1, null, 2 agus null a-rithist.

Dè na paidhrichean de luachan a bheir suas an aon uiread de rùm sa bhloc?

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 agus X
  • B agus Y
  • C agus K
  • C agus Z
  • K agus Z
  • Tha mi fhèin agus J
  • J agus X
  • Uile air an liostadh

FreagairtSeo earrannan bho na sgrìobhainnean (12.1.0.2) mu bhith a’ stòradh diofar sheòrsaichean dàta ann an Oracle.

Seòrsa dàta CHAR
Tha an seòrsa dàta CHAR a’ sònrachadh sreang caractar fad stèidhichte ann an seata caractar an stòr-dàta. Bidh thu a’ sònrachadh seata caractar an stòr-dàta nuair a chruthaicheas tu an stòr-dàta agad. Bidh Oracle a’ dèanamh cinnteach gu bheil an fhaid a tha air a shònrachadh a rèir meud anns na semantics faid taghte aig a h-uile luach a tha air a stòradh ann an colbh CHAR. Ma chuireas tu a-steach luach a tha nas giorra na fad a’ cholbh, cuiridh Oracle bàn an luach gu fad a’ cholbh.

Seòrsa dàta VARCHAR2
Tha an seòrsa dàta VARCHAR2 a’ sònrachadh sreang caractar fad caochlaideach ann an seata caractar an stòr-dàta. Bidh thu a’ sònrachadh seata caractar an stòr-dàta nuair a chruthaicheas tu an stòr-dàta agad. Bidh Oracle a’ stòradh luach caractar ann an colbh VARCHAR2 dìreach mar a shònraicheas tu e, às aonais pleadhag bàn, fhad ‘s nach bi an luach nas àirde na fad a’ cholbh.

ÀIREAMH Seòrsa Dàta
Bidh an seòrsa dàta ÀIREAMH a’ stòradh neoni a bharrachd air àireamhan stèidhichte dearbhach is àicheil le luachan iomlan bho 1.0 x 10-130 gu ach gun a bhith a’ toirt a-steach 1.0 x 10126. Ma shònraicheas tu abairt àireamhachd aig a bheil luach iomlan nas motha na no co-ionann ri 1.0 x 10126, an uairsin bidh Oracle a’ tilleadh mearachd. Feumaidh gach luach ÀIREAMH bho 1 gu 22 bytes. Le seo a’ gabhail a-steach, faodar meud a’ cholbh ann am bytes airson luach dàta àireamhach sònraichte ÀIREAMH(p), far a bheil p mionaideachd luach sònraichte, a thomhas a’ cleachdadh na foirmle a leanas: ROUND((fad(p)+s)/2))+1 far a bheil s co-ionann ri neoni ma tha an àireamh dearbhach, agus s co-ionann ri 1 ma tha an àireamh àicheil.

A bharrachd air an sin, bheir sinn earrann às na sgrìobhainnean mu bhith a’ stòradh luachan Null.

Is e null às aonais luach ann an colbh. Tha nulls a’ comharrachadh dàta a tha a dhìth, neo-aithnichte no neo-iomchaidh. Bidh nulls air an stòradh san stòr-dàta ma thuiteas iad eadar colbhan le luachan dàta. Anns na cùisean sin, feumaidh iad 1 byte airson fad a 'cholbh (neoni) a stòradh. Chan eil feum air stòradh nulls ann an sreath oir tha bann-cinn sreath ùr a’ comharrachadh gu bheil na colbhan a tha air fhàgail san t-sreath roimhe null. Mar eisimpleir, ma tha na trì colbhan mu dheireadh de bhòrd null, chan eil dàta air a stòradh airson nan colbhan sin.

Stèidhichte air an dàta seo, bidh sinn a’ togail reusanachadh. Tha sinn a’ gabhail ris gu bheil an stòr-dàta a’ cleachdadh còdachadh AL32UTF8. Anns a 'chòdachadh seo, bidh litrichean Ruiseanach a' gabhail thairis 2 bytes.

1) A agus X, tha luach raon ‘Y’ a’ toirt 1 byte, tha luach raon x ‘D’ a’ toirt 2 byte
2) B agus Y, ‘Vasya’ ann am b thèid an luach a phasgadh le beàrnan suas ri 10 caractaran agus bheir e 14 bytes, bheir ‘Vasya’ ann an d 8 bytes.
3) C agus K. Tha an luach NULL aig an dà raon, às deidh sin tha raointean cudromach ann, agus mar sin bidh iad ann an 1 byte.
4) C agus Z. Tha an luach NULL aig an dà raon, ach is e raon Z an tè mu dheireadh sa chlàr, agus mar sin chan eil e a' gabhail àite (0 bytes). Tha Field C a’ gabhail a-steach 1 byte.
5) K agus Z. Coltach ris a 'chùis roimhe. Tha an luach ann an raon K a’ gabhail a-steach 1 byte, ann an Z – 0.
6) I agus J. A rèir an sgrìobhainnean, bheir an dà luach 2 bytes. Bidh sinn ag obrachadh a-mach an fhaid a’ cleachdadh na foirmle a chaidh a thoirt bho na sgrìobhainnean: cruinn ((1 + 0)/2) +1 = 1 + 1 = 2.
7) J agus X. Gabhaidh an luach ann an raon J 2 bytes, bheir an luach ann an raon X 2 bytes.

Gu h-iomlan, is iad na roghainnean ceart: C agus K, I agus J, J agus X.

Dè mu dheidhinn a bhios am feart cruinneachaidh ann an clàr-amais 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);

  • Mu dheichean
  • Mu cheudan
  • Mu mhìltean
  • Mu dheich mìltean

FreagairtA rèir sgrìobhainnean Oracle (air ainmeachadh bho 12.1):

Airson clàr-amais B-craobhan, tha am bàillidh cruinneachadh clàr-amais a’ tomhas cruinneachadh fiosaigeach nan sreathan a thaobh luach clàr-amais.

Bidh am feart cruinneachadh clàr-amais a’ cuideachadh an optimizer gus co-dhùnadh a bheil sgrùdadh clàr-amais no làn-chlàr nas èifeachdaiche airson cuid de cheistean). Tha factar cruinneachadh ìosal a’ nochdadh sgrùdadh clàr-amais èifeachdach.

Tha factar cruinneachadh a tha faisg air an àireamh de bhlocaichean ann an clàr a’ nochdadh gu bheil na sreathan air an òrdachadh gu corporra anns na blocaichean clàr leis an iuchair clàr-amais. Ma nì an stòr-dàta làn sgrùdadh clàr, bidh an stòr-dàta buailteach na sreathan fhaighinn air ais fhad ‘s a tha iad air an stòradh air diosc air an òrdachadh leis an iuchair clàr-amais. Tha factar cruinneachadh a tha faisg air an àireamh de shreathan a’ nochdadh gu bheil na sreathan air an sgapadh air thuaiream thairis air blocaichean an stòr-dàta a thaobh an iuchair clàr-amais. Ma nì an stòr-dàta sganadh clàr slàn, cha lorgadh an stòr-dàta sreathan ann an òrdugh sam bith leis an iuchair chlàr-amais seo.

Anns a 'chùis seo, tha an dàta air a rèiteachadh gu dòigheil, agus mar sin bidh am bàillidh cnuasachaidh co-ionann no faisg air an àireamh de bhlocaichean còmhnaidh sa chlàr. Airson meud bloc àbhaisteach de 8 kilobytes, faodaidh tu a bhith an dùil gum bi timcheall air mìle luachan àireamh cumhang a ’freagairt ann an aon bhloca, agus mar sin bidh an àireamh de bhlocaichean, agus mar thoradh air an sin, bidh am bàillidh cruinneachadh mu dheich.

Dè na luachan aig N a thèid an sgriobt a leanas a chuir gu bàs gu soirbheachail ann an stòr-dàta cunbhalach le suidheachaidhean àbhaisteach?

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

FreagairtA rèir sgrìobhainnean Oracle (air ainmeachadh bho 11.2):

Crìochan stòr-dàta loidsigeach

Notaichean
Seòrsa Crìochan
Luach Crìochan

Clàr-amais
Meud iomlan a’ cholbh chlàraichte
75% de mheud bloc an stòr-dàta às aonais cuid os cionn

Mar sin, cha bu chòir meud iomlan nan colbhan clàraichte a bhith nas àirde na 6Kb. Bidh na thachras a-nis an urra ris a’ chòdachadh bonn a chaidh a thaghadh. Airson còdachadh AL32UTF8, faodaidh aon charactar suas ri 4 bytes a ghabhail thairis, agus mar sin anns an t-suidheachadh as miosa, bidh timcheall air 6 caractar a’ freagairt air 1500 kilobytes. Mar sin, bidh Oracle a’ dì-cheadachadh cruthachadh clàr-amais aig N = 400 (nuair a tha fad iuchrach na cùise as miosa 1600 caractar * 4 bytes + fad sreathach), fhad ‘s a tha aig N = 200 (no nas lugha) obraichidh cruthachadh a’ chlàr-amais gun duilgheadasan.

Tha an gnìomhaiche INSERT leis an sanas APPEND air a dhealbhadh gus dàta a luchdachadh ann am modh dìreach. Dè thachras ma thèid a chuir air a’ bhòrd air a bheil an inneal-brosnachaidh crochte?

  • Thèid an dàta a luchdachadh ann am modh dìreach, obraichidh an inneal-brosnachaidh mar a bhiodh dùil
  • Thèid an dàta a luchdachadh ann am modh dìreach, ach cha tèid an inneal-brosnachaidh a chuir gu bàs
  • Thèid an dàta a luchdachadh ann am modh àbhaisteach, obraichidh an inneal-brosnachaidh mar a bu chòir
  • Thèid an dàta a luchdachadh ann am modh àbhaisteach, ach cha tèid an inneal-brosnachaidh a chuir gu bàs
  • Cha tèid an dàta a luchdachadh, thèid mearachd a chlàradh

FreagairtGu bunaiteach, tha seo nas motha de cheist loidsig. Gus am freagairt ceart a lorg, bhithinn a’ moladh a’ mhodail reusanachaidh a leanas:

  1. Tha cuir a-steach ann am modh dìreach air a dhèanamh le bhith a’ cruthachadh bloc dàta gu dìreach, a ’dol seachad air an einnsean SQL, a nì cinnteach gu bheil astar àrd. Mar sin, tha e glè dhoirbh a bhith a 'dèanamh cinnteach gu bheil an inneal-brosnachaidh gu math duilich, mura h-eil e do-dhèanta, agus chan eil adhbhar sam bith ann, oir bidh e fhathast a' slaodadh sìos an cuir a-steach gu mòr.
  2. Mura tèid an inneal-brosnachaidh a chuir an gnìomh, ma tha an dàta sa chlàr mar an ceudna, bidh staid an stòr-dàta gu h-iomlan (clàran eile) an urra ris a’ mhodh anns an deach an dàta seo a chuir a-steach. Bidh seo gu follaiseach a’ sgrios ionracas dàta agus chan urrainnear a chuir an sàs mar fhuasgladh ann an cinneasachadh.
  3. Tha neo-chomas an obair a chaidh iarraidh a dhèanamh mar as trice air a làimhseachadh mar mhearachd. Ach an seo bu chòir dhuinn cuimhneachadh gur e sanas a th’ ann APPEND, agus is e loidsig choitcheann molaidhean gu bheilear a’ toirt aire dhaibh ma ghabhas sin dèanamh, ach mura h-eil, thèid an gnìomhaiche a chuir gu bàs gun a bhith a ’toirt aire don bheachd.

Mar sin is e am freagairt ris a bheil dùil thèid an dàta a luchdachadh ann am modh àbhaisteach (SQL), thèid an inneal-brosnachaidh a losgadh.

A rèir sgrìobhainnean Oracle (air ainmeachadh bho 8.04):

Bidh brisidhean air na cuingeadan ag adhbhrachadh gun tèid an aithris a chuir an gnìomh gu sreathach, a’ cleachdadh an t-slighe cuir a-steach àbhaisteach, gun rabhaidhean no teachdaireachdan mearachd. Is e aon eisgeachd an cuingealachadh air aithrisean a bhith a’ faighinn cothrom air an aon chlàr barrachd air aon uair ann an gnothach, a dh’ fhaodadh teachdaireachdan mearachd adhbhrachadh.
Mar eisimpleir, ma tha luchd-brosnachaidh no ionracas iomraidh an làthair air a’ bhòrd, cha tèid aire a thoirt don bheachd APPEND nuair a dh’ fheuchas tu ri INSERT dìreach-luchd a chleachdadh (sreathach no co-shìnte), a bharrachd air sanas no clàs PARALLEL, ma tha sin ann.

Dè thachras nuair a thèid an sgriobt a leanas a chur gu bàs?

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

  • Crìochnachadh soirbheachail
  • Dh'fhàillig air sgàth mearachd co-chàradh
  • Mearachd: Chan eil Gnìomh Fèin-riaghlaidh dligheach
  • Mearachd co-cheangailte ri bhith a' dol thairis air an ìre as àirde de neadachadh fòn
  • Mearachd briseadh iuchair thall thairis
  • Mearachd co-cheangailte ri glasan

FreagairtTha am bòrd agus an inneal-brosnachaidh air an cruthachadh gu math ceart agus cha bu chòir don ghnìomhachd seo leantainn gu duilgheadasan. Tha gnothaichean fèin-riaghailteach ann an inneal-brosnachaidh ceadaichte cuideachd, air neo cha bhiodh e comasach logadh a-steach, mar eisimpleir.

Às deidh a’ chiad sreath a chuir a-steach, bhiodh losgadh brosnachaidh soirbheachail ag adhbhrachadh gun deidheadh ​​​​an dàrna sreath a chuir a-steach, ag adhbhrachadh losgadh a-rithist, a ’cur a-steach treas sreath, agus mar sin air adhart gus an do dh’ fhàilnich an aithris mar thoradh air a bhith nas àirde na an neadachadh as àirde de ghlaidhean. Ach, thig puing seòlta eile a-steach. Aig an àm a thèid an inneal-brosnachaidh a chuir gu bàs, chan eil gealltanas air a chrìochnachadh fhathast airson a’ chiad chlàr a chaidh a chuir a-steach. Mar sin, bidh inneal-brosnachaidh a tha a’ ruith ann an gnothach neo-eisimeileach a’ feuchainn ri sreath a chuir a-steach don chlàr a tha a’ toirt iomradh air iuchair chèin gu clàr nach deach a ghealltainn fhathast. Bidh seo a’ leantainn gu feitheamh (bidh an gnothach fèin-riaghailteach a’ feitheamh ris a’ phrìomh ghnothach gealltainn feuch an urrainn dha dàta a chuir a-steach) agus aig an aon àm tha am prìomh ghnothach a’ feitheamh ris a’ ghnothach fèin-riaghailteach cumail a’ dol ag obair às deidh an inneal brosnachaidh. Bidh stad-stad a’ tachairt agus, mar thoradh air an sin, tha an gnothach fèin-riaghailteach air a chuir dheth air sgàth adhbharan co-cheangailte ri glasan.

Chan fhaod ach luchd-cleachdaidh clàraichte pàirt a ghabhail san sgrùdadh. Soidhnig a-steach, mas e do thoil e.

Bha e duilich?

  • Coltach ri dà mheur, cho-dhùin mi a h-uile dad gu ceart sa bhad.

  • Chan e gu dearbh, bha mi ceàrr air ceist no dhà.

  • Dh’fhuasgail mi leth dheth gu ceart.

  • Shaoil ​​​​mi am freagairt dà uair!

  • Sgrìobhaidh mi anns na beachdan

Bhòt 14 neach-cleachdaidh. Sheall 10 neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann