I gcéimeanna Highload++ Siberia 2019 - 8 dtasc Oracle

Dia duit!

Ar 24-25 Meitheamh, reáchtáladh comhdháil Highload++ Siberian 2019 i Novosibirsk. Bhí ár mbuachaillí ann freisin tuarascáil “Bunachair shonraí coimeádán Oracle (CDB/PDB) agus a n-úsáid phraiticiúil le haghaidh forbairt bogearraí", foilseoidh muid leagan téacs beagán níos déanaí. Bhí sé fionnuar, go raibh maith agat olagbuinin don eagraíocht, chomh maith le gach duine a tháinig.

I gcéimeanna Highload++ Siberia 2019 - 8 dtasc Oracle
Sa phost seo, ba mhaith linn na fadhbanna a bhí againn ag ár mboth a roinnt leat ionas gur féidir leat do chuid eolais Oracle a thástáil. Anseo thíos tá 8 bhfadhb, roghanna freagartha agus míniú.

Cad é an luach seichimh uasta a fheicfimid mar thoradh ar an script seo a leanas a chur i gcrích?

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
  • Ní bheidh, beidh earráid ann

FreagairDe réir doiciméadú Oracle (luaite ó 8.1.6):
Laistigh de ráiteas SQL amháin, ní mhéadóidh Oracle an seicheamh ach uair amháin in aghaidh an tsraith. Má tá níos mó ná tagairt amháin i ráiteas do NEXTVAL le haghaidh seicheamh, méadaíonn Oracle an seicheamh uair amháin agus tugann sé an luach céanna ar ais do gach teagmhas de NEXTVAL. Má tá tagairtí i ráiteas do CURRVAL agus NEXTVAL araon, ardaíonn Oracle an seicheamh agus tugann sé an luach céanna ar ais do CURRVAL agus NEXTVAL araon beag beann ar a n-ord laistigh den ráiteas.

Dá bhrí sin, comhfhreagróidh an t-uasluach do líon na línte, is é sin 5.

Cé mhéad ró a bheidh sa tábla mar thoradh ar an script seo a leanas a rith?

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

FreagairDe réir doiciméadú Oracle (luaite ó 11.2):

Sula ndéanann sé aon ráiteas SQL, marcálann Oracle pointe sábhála intuigthe (nach bhfuil ar fáil duit). Ansin, má theipeann ar an ráiteas, rollaíonn Oracle ar ais go huathoibríoch é agus cuireann sé an cód earráide is infheidhme ar ais chuig SQLCODE sa SQLCA. Mar shampla, má dhéanann ráiteas INSERT earráid trí iarracht a dhéanamh luach dúblach a chur isteach in innéacs uathúil, cuirtear an ráiteas ar ais.

Déantar glaoch ar HP ón gcliant a mheas agus a phróiseáil mar ráiteas aonair freisin. Mar sin, críochnaítear an chéad ghlao HP go rathúil, tar éis trí thaifead a chur isteach; críochnaíonn an dara glao HP le hearráid agus rollaíonn sé ar ais an ceathrú taifead a d'éirigh leis a chur isteach; theipeann ar an tríú glaoch, agus tá trí thaifead sa tábla.

Cé mhéad ró a bheidh sa tábla mar thoradh ar an script seo a leanas a rith?

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

FreagairDe réir doiciméadú Oracle (luaite ó 11.2):

Ligeann srian le seic duit coinníoll a shonrú nach mór do gach ró sa tábla a shásamh. Chun an srian a shásamh, caithfidh gach ró sa tábla an coinníoll a dhéanamh TRUE nó anaithnid (mar gheall ar null). Nuair a dhéanann Oracle measúnú ar choinníoll srianta seiceála le haghaidh ró ar leith, tagraíonn aon ainmneacha colún sa choinníoll do na luachanna colún sa tsraith sin.

Mar sin, déanfaidh an luach null an seic a rith, agus déanfar an bloc gan ainm a fhorghníomhú go rathúil go dtí go ndéanfar iarracht an luach 3 a chur isteach. Tar éis seo, déanfaidh an bloc láimhseála earráide an eisceacht a ghlanadh, ní tharlóidh aon rolladh siar, agus beidh ceithre shraith fágtha sa tábla le luachanna 1, null, 2 agus null arís.

Cé na péirí luachanna a thógfaidh suas an méid céanna spáis 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
  • Mé agus J
  • J agus X
  • Gach liostaithe

FreagairSeo sleachta as an doiciméadú (12.1.0.2) maidir le cineálacha éagsúla sonraí a stóráil in Oracle.

Cineál Sonraí CHAR
Sonraíonn an cineál sonraí CHAR teaghrán carachtar fad seasta sa tacar carachtar bunachar sonraí. Sonraíonn tú an tacar carachtar bunachar sonraí nuair a chruthaíonn tú do bhunachar sonraí. Cinntíonn Oracle go bhfuil gach luach a stóráiltear i gcolún CHAR an fad a shonraítear de réir méid sa semantics fad roghnaithe. Má chuireann tú isteach luach atá níos giorra ná fad an cholúin, ansin cuireann Oracle ceap bán ar an luach go fad an cholúin.

VARCHAR2 Cineál Sonraí
Sonraíonn an cineál sonraí VARCHAR2 teaghrán carachtar fad athraitheach sa tacar carachtar bunachar sonraí. Sonraíonn tú an tacar carachtar bunachar sonraí nuair a chruthaíonn tú do bhunachar sonraí. Stórálann Oracle luach carachtar i gcolún VARCHAR2 go díreach mar a shonraíonn tú é, gan aon stuáil fholamh, ar choinníoll nach sáraíonn an luach fad an cholúin.

NUMBER Cineál Sonraí
Stórálann an cineál sonraí UIMHIR náid chomh maith le huimhreacha seasta dearfacha agus diúltacha le luachanna absalóideacha ó 1.0 x 10-130 go dtí ach gan 1.0 x 10126 a áireamh. Má shonraíonn tú slonn uimhríochtúil a bhfuil a luach absalóideach níos mó ná nó cothrom le 1.0 x 10126, ansin cuireann Oracle earráid ar ais. Éilíonn gach luach UIMHIR ó 1 go 22 beart. Agus é seo á chur san áireamh, is féidir méid an cholúin i mbearta do luach sonraí uimhriúil ar leith UIMHIR(p), áit a bhfuil p beachtas luach tugtha, a ríomh ag baint úsáide as an bhfoirmle seo a leanas: ROUND((fad(p)+s)/2))+1 áit a bhfuil s cothrom le nialas má tá an uimhir deimhneach, agus s cothrom le 1 má tá an uimhir diúltach.

Ina theannta sin, déanaimis sliocht a ghlacadh as an doiciméadú maidir le luachanna Neamhní a stóráil.

Is éard is null ann ná easpa luacha i gcolún. Léiríonn neamhní sonraí atá in easnamh, anaithnid nó neamh-infheidhmithe. Stóráiltear neamhní sa bhunachar sonraí má thiteann siad idir colúin le luachanna sonraí. Sna cásanna seo, éilíonn siad 1 byte chun fad an cholúin (nialas) a stóráil. Níl aon stóráil ag teastáil le haghaidh nulls rianaithe i ndiaidh a chéile mar go dtugann ceanntásc nua le fios go bhfuil na colúin atá fágtha sa ró roimhe seo ar neamhní. Mar shampla, má tá na trí cholún dheireanacha de thábla ar neamhní, ní stóráiltear aon sonraí do na colúin seo.

Bunaithe ar na sonraí seo, déanaimid réasúnaíocht a thógáil. Glacaimid leis go n-úsáideann an bunachar sonraí ionchódú AL32UTF8. Sa ionchódú seo, áiteoidh litreacha na Rúise 2 bytes.

1) A agus X, glacann luach réimse 'Y' 1 beart, tógann luach réimse x 'D' 2 beart
2) B agus Y, 'Vasya' i b déanfar an luach a stuáil le spásanna suas le 10 gcarachtar agus tógfaidh sé 14 beart, tógfaidh 'Vasya' in d 8 beart.
3) C agus K. Tá an luach NULLComment ag an dá réimse, tar éis dóibh tá réimsí suntasacha, mar sin áitíonn siad 1 beart.
4) C agus Z. Tá an luach NULLComment ag an dá réimse, ach is é réimse Z an ceann deireanach sa tábla, mar sin ní thógann sé spás (0 bytes). Tá 1 beart i gceist le Réimse C.
5) K agus Z. Cosúil leis an gcás roimhe seo. Tá an luach i réimse K cothrom le 1 beart, i Z – 0.
6) I agus J. De réir an doiciméadúcháin, glacfaidh an dá luach 2 bytes. Ríomhaimid an fad ag baint úsáide as an bhfoirmle a tógadh ón doiciméadú: cruinn( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J agus X. Tógfaidh an luach sa réimse J 2 bytes, glacfaidh an luach sa réimse X 2 bytes.

San iomlán, is iad na roghanna cearta: C agus K, I agus J, J agus X.

Cad é thart ar fhachtóir cnuasaithe an innéacs 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);

  • Thart ar na deicheanna
  • Maidir leis na céadta
  • Thart ar na mílte
  • Thart ar na mílte

FreagairDe réir doiciméadú Oracle (luaite ó 12.1):

Maidir le hinnéacs B-crann, tomhaiseann an fachtóir cnuasaithe innéacs grúpáil fhisiciúil na sraitheanna i gcomparáid le luach innéacs.

Cuidíonn an fachtóir cnuasaithe innéacs leis an optimizer cinneadh a dhéanamh cibé an bhfuil scanadh innéacs nó scanadh tábla iomlán níos éifeachtaí le haghaidh fiosrúcháin áirithe). Léiríonn fachtóir cnuasaithe íseal scanadh innéacs éifeachtach.

Léiríonn fachtóir cnuasaithe atá gar do líon na mbloc i dtábla go n-ordaítear na sraitheanna go fisiciúil sna bloic tábla leis an eochair innéacs. Má dhéanann an bunachar sonraí scanadh tábla iomlán, is gnách go n-aisghabhann an bunachar sonraí na sraitheanna de réir mar a stóráiltear iad ar dhiosca curtha in eagar de réir na heochrach innéacs. Léiríonn fachtóir cnuasaithe atá gar do líon na sraitheanna go bhfuil na sraitheanna scaipthe go randamach thar na bloic bunachar sonraí maidir leis an eochair innéacs. Má dhéanann an bunachar sonraí scanadh tábla iomlán, ní bheadh ​​an bunachar sonraí a aisghabháil sraitheanna in aon ord sórtáilte leis an eochair innéacs.

Sa chás seo, déantar na sonraí a shórtáil go hidéalach, agus mar sin beidh an fachtóir cnuasaithe cothrom le nó gar do líon na mbloic áitithe sa tábla. Le haghaidh méid bloc caighdeánach de 8 cilibheart, is féidir leat a bheith ag súil go mbeidh thart ar mhíle luach uimhreacha caol oiriúnach i mbloc amháin, agus mar sin beidh líon na mbloic, agus mar thoradh air sin, beidh an fachtóir cnuasaithe timpeall na ndeicheanna.

Cad iad na luachanna de N a dhéanfar an script seo a leanas a fhorghníomhú go rathúil i mbunachar sonraí rialta le socruithe caighdeánacha?

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

FreagairDe réir doiciméadú Oracle (luaite ó 11.2):

Teorainneacha Bunachar Sonraí Loighciúla

Mír
Cineál Teorainn
Luach Teorainn

Innéacsanna
Méid iomlán an cholúin innéacsaithe
75% de mhéid na mbloc bunachar sonraí lúide roinnt forchostais

Mar sin, níor cheart go sáródh méid iomlán na gcolún innéacsaithe 6Kb. Braitheann cad a tharlóidh ina dhiaidh sin ar an ionchódú bonn roghnaithe. Le haghaidh ionchódú AL32UTF8, is féidir le carachtar amháin 4 byte ar a mhéad a áitiú, mar sin sa chás is measa, beidh thart ar 6 carachtar oiriúnach i 1500 chileabheart. Dá bhrí sin, dícheadóidh Oracle cruthú innéacs ag N = 400 (nuair is é an fad eochrach cás is measa ná 1600 carachtar * 4 bytes + fad as a chéile), agus ag N = 200 (nó níos lú) Beidh cruthú an t-innéacs ag obair gan fadhbanna.

Tá an t-oibreoir INSERT leis an leid APPEND deartha chun sonraí a luchtú i mód díreach. Cad a tharlaíonn má chuirtear i bhfeidhm ar an mbord ar a bhfuil an truicear é?

  • Déanfar na sonraí a luchtú i mód díreach, oibreoidh an truicear mar a bhíothas ag súil leis
  • Déanfar na sonraí a luchtú i mód díreach, ach ní dhéanfar an truicear a fhorghníomhú
  • Déanfar na sonraí a luchtú sa mhodh traidisiúnta, oibreoidh an truicear mar ba chóir
  • Déanfar na sonraí a luchtú sa mhodh traidisiúnta, ach ní dhéanfar an truicear a fhorghníomhú
  • Ní dhéanfar na sonraí a luchtú, déanfar earráid a thaifeadadh

FreagairGo bunúsach, is ceist níos mó é seo maidir le loighic. Chun an freagra ceart a fháil, mholfainn an tsamhail réasúnaíochta seo a leanas:

  1. Cuirtear isteach i mód díreach trí bhloc sonraí a fhoirmiú go díreach, ag seachaint an t-inneall SQL, rud a chinntíonn ardluais. Mar sin, tá sé an-deacair, más rud é nach bhfuil sé dodhéanta an truicear a chur i gcrích, a chinntiú, agus níl aon phointe ann, ós rud é go mbeidh sé mall fós ar an gcur isteach.
  2. Mura ndéantar an truicear a fhorghníomhú beidh sé mar thoradh, má tá na sonraí sa tábla mar an gcéanna, go mbeidh staid an bhunachair sonraí ina iomláine (táblaí eile) ag brath ar an modh inar cuireadh na sonraí seo isteach. Is léir go scriosfaidh sé sin sláine sonraí agus ní féidir é a chur i bhfeidhm mar réiteach i dtáirgeadh.
  3. Is gnách gur earráid í an neamhábaltacht an oibríocht iarrtha a dhéanamh. Ach anseo ba cheart dúinn cuimhneamh gur leid é APPEND, agus is é an loighic ghinearálta leideanna ná go gcuirtear san áireamh iad más féidir, ach mura ndéantar, déantar an t-oibreoir a fhorghníomhú gan an leid a chur san áireamh.

Mar sin is é an freagra a bhfuiltear ag súil leis déanfar na sonraí a luchtú i mód gnáth (SQL), beidh an truicear dóiteáin.

De réir doiciméadú Oracle (luaite ó 8.04):

Má sháraítear na srianta, déanfar an ráiteas a fhorghníomhú go sraitheach, ag baint úsáide as an ngnáthchonair ionsáite, gan rabhadh ná teachtaireachtaí earráide. Eisceacht is ea an srian ar ráitis a fhaigheann rochtain ar an tábla céanna níos mó ná uair amháin in idirbheart, rud a d’fhéadfadh teachtaireachtaí earráide a chruthú.
Mar shampla, má tá truicear nó sláine tagartha i láthair ar an tábla, ansin ní thabharfar aird ar an leid AGUISÍN nuair a dhéanann tú iarracht INSERT dír-ualach (srathach nó comhthreomhar) a úsáid, chomh maith leis an leid nó an clásal PARALLEL, más ann dó.

Cad a tharlóidh nuair a fhorghníomhófar an script seo a leanas?

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

  • Forghníomhú rathúil
  • Teip mar gheall ar earráid chomhréire
  • Earráid: Níl Idirbheart Uathrialach Bailí
  • Earráid a bhaineann le dul thar uasnead na nglaonna
  • Earráid maidir le Sárú Eochracha Coigríche
  • Earráid a bhaineann le glais

FreagairCruthaítear an tábla agus an truicear ceart go leor agus níor cheart go dtiocfadh fadhbanna as an oibríocht seo. Ceadaítear idirbhearta uathrialacha i dtruicear freisin, nó ní fhéadfaí logáil a dhéanamh, mar shampla.

Tar éis an chéad sraith a chur isteach, chuirfeadh lámhaigh truicear rathúil faoi deara go gcuirfí an dara sraith isteach, rud a chuirfeadh an truicear chun dóiteáin arís, ag cur an tríú sraith isteach, agus mar sin de go dtí gur theip ar an ráiteas mar gheall ar níos mó ná an nead uasta glaonna. Mar sin féin, tagann pointe subtle eile i spraoi. Ag an am a chuirtear an truicear i gcrích, níl gealltanas tugtha chun críche fós don chéad taifead a cuireadh isteach. Mar sin, déanann truicear a ritheann in idirbheart uathrialach iarracht as a chéile a chur isteach sa tábla a dhéanann tagairt d’eochair choigríche do thaifead nach bhfuil geallta fós. Is é an toradh a bhíonn air sin ná feithimh (fanann an t-idirbheart uathrialach ar an bpríomh-idirbheart gealltanas a thabhairt féachaint an féidir leis sonraí a chur isteach) agus ag an am céanna fanann an príomh-idirbheart ar an idirbheart uathrialach leanúint ar aghaidh ag obair tar éis an truicear. Tarlaíonn sáinneáil agus, mar thoradh air sin, cuirtear an t-idirbheart uathrialach ar ceal mar gheall ar chúiseanna a bhaineann le glais.

Ní féidir ach le húsáideoirí cláraithe páirt a ghlacadh sa suirbhé. Sínigh isteach, le do thoil.

Bhí sé deacair a?

  • Cosúil le dhá mhéar, chinn mé láithreach gach rud i gceart.

  • Ní hea i ndáiríre, bhí mé mícheart ar chúpla ceist.

  • Réitigh mé leath de i gceart.

  • Buille faoi thuairim mé an freagra faoi dhó!

  • Scríobhfaidh mé sna tuairimí

Vótáil 14 úsáideoir. Staon 10 úsáideoir.

Foinse: will.com

Add a comment