Manaraka ny dian'ny Highload++ Siberia 2019 - asa 8 ao amin'ny Oracle

Miarahaba!

Notanterahina tany Novosibirsk ny fihaonambe Highload++ Siberia 24 ny 25-2019 jona teo. Teo ihany koa ry zalahy. TATITRA "Oracle container databases (CDB/PDB) sy ny fampiasany azo ampiharina amin'ny fampivoarana rindrambaiko", dia hamoaka dikan-tsoratra izahay ato aoriana kely. Nahafinaritra, misaotra olegbunin ho an’ny fandaminana ary koa ho an’izay tonga rehetra.

Manaraka ny dian'ny Highload++ Siberia 2019 - asa 8 ao amin'ny Oracle
Amin'ity lahatsoratra ity dia tianay ny hizara aminareo ny olana nanananay tao amin'ny tranohevanay mba hahafahanao mitsapa ny fahalalanao Oracle. Eo ambanin'ny fanapahana dia misy olana 8, safidy valiny ary fanazavana.

Inona ny sandan'ny filaharana ambony indrindra ho hitantsika vokatry ny fanatanterahana ity script manaraka ity?

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
  • Tsia, hisy hadisoana

valinyAraka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 8.1.6):
Ao anatin'ny fanambarana SQL tokana, Oracle dia hampiakatra ny filaharana indray mandeha isaky ny andalana. Raha misy fanambarana mihoatra ny iray momba ny NEXTVAL ho an'ny filaharana iray, Oracle dia mampitombo ny filaharana indray mandeha ary mamerina ny sanda mitovy amin'ny fisehoan-javatra rehetra momba ny NEXTVAL. Raha misy filazana momba ny CURRVAL sy NEXTVAL, Oracle dia mampitombo ny filaharana ary mamerina ny sanda mitovy amin'ny CURRVAL sy NEXTVAL na inona na inona baikony ao anatin'ilay fanambarana.

Noho izany, ny sanda ambony indrindra dia hifanaraka amin'ny isan'ny andalana, izany hoe 5.

Firy ny andalana ao amin'ny tabilao vokatry ny fampandehanana ity script manaraka ity?

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

valinyAraka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 11.2):

Alohan'ny hanatanterahana ny fanambarana SQL rehetra, Oracle dia manamarika teboka iray tsy misy dikany (tsy misy anao). Avy eo, raha tsy nahomby ilay fanambarana, dia averin'i Oracle ho azy izany ary avereno amin'ny SQLCODE ao amin'ny SQLCA ny fehezan-dalΓ na diso. Ohatra, raha miteraka hadisoana ny fanambarana INSERT amin'ny fiezahana hampiditra sanda mitovy amin'ny tondro tokana, dia averina ilay fanambarana.

Ny fiantsoana ny HP avy amin'ny mpanjifa dia raisina ho toy ny fanambarana tokana ihany koa. Noho izany, ny antso HP voalohany dia vita soa aman-tsara, rehefa nampiditra firaketana telo; ny fiantsoana HP faharoa dia mifarana amin'ny hadisoana ary mamerina ny rakitsoratra fahefatra izay azony nampidirina; tsy nahomby ny antso fahatelo, ary misy rakitsoratra telo eo amin'ny latabatra.

Firy ny andalana ao amin'ny tabilao vokatry ny fampandehanana ity script manaraka ity?

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

valinyAraka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 11.2):

Ny faneriterena fanamarinana dia mamela anao hamaritra fepetra iray izay tsy maintsy mameno ny andalana tsirairay ao amin'ny latabatra. Mba hanomezana fahafaham-po ny teritery, ny andalana tsirairay ao amin'ny tabilao dia tsy maintsy manao ny fepetra na TRUE na tsy fantatra (noho ny tsy misy). Rehefa manombatombana fepetra faneriterena ny Oracle ho an'ny andalana iray manokana, ny anaran'ny tsanganana ao amin'io fepetra io dia manondro ny sandan'ny tsanganana ao amin'io andalana io.

Noho izany, ny sanda null dia handalo ny fanamarinana, ary ny sakana tsy mitonona anarana dia hotanterahina amim-pahombiazana mandra-pahatongan'ny andrana hampiditra ny sanda 3. Aorian'izany, ny sakana amin'ny fitantanana ny hadisoana dia hanala ny maningana, tsy hisy fiverenana, ary hisy andalana efatra sisa eo amin'ny latabatra miaraka amin'ny sanda 1, null, 2 ary null indray.

Iza amin'ireo sanda roa no haka toerana mitovy amin'ny sakana?

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 sy X
  • B sy Y
  • C sy K
  • C sy Z
  • K sy Z
  • I sy J
  • J sy X
  • Voatanisa daholo

valinyIreto misy sombiny avy amin'ny antontan-taratasy (12.1.0.2) momba ny fitehirizana karazana data ao amin'ny Oracle.

Karazana data CHAR
Ny karazana angon-drakitra CHAR dia mamaritra tady tarehintsoratra maharitra maharitra ao amin'ny fitambaran'ny tarehintsoratra database. Manondro ny endri-tsoratra momba ny database ianao rehefa mamorona ny angonao. Oracle dia manome antoka fa ny soatoavina rehetra voatahiry ao amin'ny tsanganana CHAR dia manana ny halavany voatondro amin'ny habe amin'ny semantika lava voafantina. Raha mampiditra sanda izay fohy kokoa noho ny halavan'ny tsanganana ianao, dia ny Oracle blank-pads ny sanda amin'ny halavan'ny tsanganana.

Karazana data VARCHAR2
Ny karazana angon-drakitra VARCHAR2 dia mamaritra tady tarehin-tsoratra miovaova-lava ao amin'ny andiana tarehintsoratra database. Manondro ny endri-tsoratra momba ny database ianao rehefa mamorona ny angonao. Oracle dia mitahiry sandan'ny tarehin-tsoratra ao amin'ny tsanganana VARCHAR2 araka ny voalazanao, tsy misy padding banga, raha toa ka tsy mihoatra ny halavan'ny tsanganana ny sandany.

Karazana angona NUMBER
Ny karazana angon-drakitra NUMBER dia mitahiry aotra ary isa tsara sy miiba misy sanda tanteraka manomboka amin'ny 1.0 x 10-130 ka hatramin'ny 1.0 x 10126. 1.0 x 10126, avy eo Oracle dia mamerina hadisoana. Ny sanda NUMBER tsirairay dia mitaky 1 ka hatramin'ny 22 bytes. Raha raisina izany, ny haben'ny tsanganana amin'ny bytes ho an'ny sanda angona nomerika manokana NUMBER(p), izay ny p dia ny fahamarinan'ny sanda nomena, dia azo kajy amin'ny fampiasana ity formula manaraka ity: ROUND((halany(p)+s)/2))+1 izay s mitovy aotra raha ny isa dia tsara, ary s mitovy 1 raha ny isa dia ratsy.

Ho fanampin'izay, andeha isika haka ampahany amin'ny antontan-taratasy momba ny fitehirizana ny soatoavina Null.

Ny null dia ny tsy fisian'ny sanda amin'ny tsanganana. Ny nulls dia manondro angona tsy hita, tsy fantatra, na tsy azo ampiharina. Ny nulls dia voatahiry ao amin'ny angon-drakitra raha toa ka latsaka eo anelanelan'ny tsanganana misy sanda data. Amin'ireo tranga ireo dia mitaky 1 byte izy ireo mba hitahirizana ny halavan'ny tsanganana (aotra). Tsy mila fitehirizana ny fandalovan'ny nulls misesy satria ny lohatenin'ny laharana vaovao dia manambara fa ny tsanganana sisa amin'ny laharana teo aloha dia tsy misy. Ohatra, raha tsy misy ny tsanganana telo farany amin'ny latabatra iray, dia tsy misy angona voatahiry ho an'ireo tsanganana ireo.

Mifototra amin'ireo angon-drakitra ireo, manangana hevitra izahay. Mihevitra izahay fa mampiasa ny kaody AL32UTF8 ny angon-drakitra. Amin'ity fandokoana ity, ny litera Rosiana dia hanana 2 bytes.

1) A sy X, ny sandan'ny saha 'Y' dia maka 1 byte, ny sandan'ny saha x 'D' dia maka 2 byte
2) B sy Y, 'Vasya' ao amin'ny b ny sandany dia hofenoina habaka hatramin'ny tarehintsoratra 10 ary haka 14 bytes, 'Vasya' amin'ny d dia haka 8 bytes.
3) C sy K. Samy manana ny sanda NULL ny saha roa, aorian'izy ireo dia misy saha manan-danja, noho izany dia manana 1 byte izy ireo.
4) C sy Z. Samy manana sanda NULL ny saha roa, fa ny saha Z no farany amin'ny latabatra, ka tsy maka toerana (0 bytes). Ny saha C dia manana 1 byte.
5) K sy Z. Mitovy amin'ny tranga teo aloha. Ny sanda ao amin'ny saha K dia manana 1 byte, amin'ny Z - 0.
6) I sy J. Araka ny antontan-taratasy, ny soatoavina roa dia haka 2 bytes. Kajy ny halavany amin'ny fampiasana ny formula nalaina tao amin'ny antontan-taratasy: round((1 + 0)/2) +1 = 1 + 1 = 2.
7) J sy X. Ny sanda ao amin'ny saha J dia haka 2 byte, ny sanda ao amin'ny X saha dia haka 2 byte.

Amin'ny fitambarany, ny safidy marina dia: C sy K, I sy J, J ary X.

Inona no mety ho anton'ny fivondronan'ny tondro 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);

  • Tokony ho folo
  • An-jatony eo ho eo
  • An'arivony eo ho eo
  • An'aliny eo ho eo

valinyAraka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 12.1):

Ho an'ny index B-tree, ny index clustering factor dia mandrefy ny vondrona ara-batana ny andalana mifandraika amin'ny sanda fanondro.

Ny anton'ny clustering index dia manampy ny optimizer hanapa-kevitra raha mahomby kokoa amin'ny fanontaniana sasany ny scan index na ny latabatra feno. Ny anton-tsarimihetsika ambany dia manondro ny fitarafana fanondro mahomby.

Ny anton-javatra mivondrona izay manakaiky ny isan'ny sakana ao anaty latabatra dia manondro fa ny andalana dia voalamina ara-batana ao amin'ny sakana latabatra amin'ny alalan'ny fanalahidin'ny fanondro. Raha manao scan table feno ny angon-drakitra, dia mirona haka ny andalana ny angon-drakitra rehefa voatahiry ao anaty kapila voafantina amin'ny fanalahidin'ny index. Ny anton-javatra mivondrona izay manakaiky ny isan'ny andalana dia manondro fa ny andalana dia miparitaka kisendrasendra manerana ny blocs database mifandraika amin'ny fanalahidin'ny index. Raha manao scan table feno ny angon-drakitra dia tsy haka andalana amin'ny filaharana voafantina amin'ity fanalahidin'ny index ity ny angon-drakitra.

Amin'ity tranga ity, ny angon-drakitra dia voalamina tsara, noho izany dia hitovy na hanakaiky ny isan'ny sakana voapetraka ao amin'ny tabilao ny anton'ny clustering. Ho an'ny haben'ny sakana mahazatra amin'ny 8 kilobytes, azonao antenaina fa eo amin'ny arivo eo ho eo ny sandan'ny isa tery dia hifanaraka amin'ny sakana iray, ka ny isan'ny sakana, ary vokatr'izany, ny anton'ny clustering dia ho tokony ho folo.

Amin'ny sandan'ny N inona no hahatanteraka amim-pahombiazana ity script manaraka ity amin'ny angon-drakitra tsy tapaka miaraka amin'ny filaharana mahazatra?

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

valinyAraka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 11.2):

fetran'ny angona lojika

Item
Karazana fetra
Mametra ny sanda

fanondroana
Haben'ny tsanganana tondroina
75% amin'ny haben'ny sakana amin'ny angon-drakitra minus ny overhead

Noho izany, tsy tokony hihoatra ny 6Kb ny totalin'ny tsanganana voatanisa. Ny zava-mitranga manaraka dia miankina amin'ny coding fototra voafantina. Ho an'ny kaody AL32UTF8, ny tarehin-tsoratra iray dia afaka mahatratra 4 byte fara-fahakeliny, ka amin'ny tranga ratsy indrindra, tarehintsoratra 6 eo ho eo no mety ho 1500 kilobytes. Noho izany, Oracle dia tsy hamela ny famoronana index amin'ny N = 400 (rehefa 1600 tarehintsoratra * 4 bytes + rowid ny halavan'ny tranga ratsy indrindra). amin'ny N = 200 (na latsaka) ny famoronana ny index dia hiasa tsy misy olana.

Ny mpandraharaha INSERT miaraka amin'ny soso-kevitra APPEND dia natao hampiditra angona amin'ny fomba mivantana. Inona no mitranga raha ampiharina amin'ny latabatra izay mihantona ny trigger?

  • Ny angon-drakitra dia ho entina amin'ny fomba mivantana, ny trigger dia hiasa araka ny efa nampoizina
  • Ny angona dia ho entina amin'ny fomba mivantana, fa ny trigger dia tsy hovonoina
  • Ny angon-drakitra dia ho entina amin'ny fomba mahazatra, ny trigger dia hiasa araka ny tokony ho izy
  • Ny angon-drakitra dia ho entina amin'ny fomba mahazatra, fa ny trigger dia tsy ho tanterahina
  • Ny angon-drakitra dia tsy ho voarakitra, misy hadisoana horaisina

valinyAmin'ny ankapobeny, io dia resaka lojika kokoa. Mba hahitana ny valiny marina dia manoro hevitra ity modely fanjohian-kevitra manaraka ity aho:

  1. Ny fampidirana amin'ny fomba mivantana dia atao amin'ny alΓ lan'ny fananganana mivantana ny sakana angon-drakitra, mandalo ny motera SQL, izay miantoka ny hafainganam-pandeha ambony. Noho izany, ny fiantohana ny famonoana ny trigger dia tena sarotra, raha tsy azo atao, ary tsy misy dikany izany, satria mbola hampiadana tanteraka ny fampidirana.
  2. Ny tsy fanatanterahana ny trigger dia hitarika ho amin'ny zava-misy fa, raha mitovy ny angon-drakitra ao amin'ny tabilao, ny toetry ny angona manontolo (tabilao hafa) dia miankina amin'ny fomba nampidirana an'io data io. Mazava ho azy fa handrava ny fahamendrehan'ny angona izany ary tsy azo ampiharina ho vahaolana amin'ny famokarana.
  3. Ny tsy fahafahana manatanteraka ny asa nangatahana dia raisina ho toy ny fahadisoana amin'ny ankapobeny. Fa eto dia tokony hotadidintsika fa APPEND dia fanoroana hevitra, ary ny lojika ankapoben'ny soso-kevitra dia raisina an-tanan-droa raha azo atao, fa raha tsy izany dia novonoina ny opΓ©rateur nefa tsy voahevitra akory.

Ka ny valiny andrasana dia ny angon-drakitra dia ho entina amin'ny fomba mahazatra (SQL), hirehitra ny trigger.

Araka ny antontan-taratasin'i Oracle (nalaina tao amin'ny 8.04):

Ny fanitsakitsahana ny fameperana dia hahatonga ny fanambarana hanatanteraka an-tsoratra, amin'ny fampiasana ny lalana fampidirana mahazatra, tsy misy fampitandremana na hafatra diso. Ny maningana dia ny famerana ny fanambarana miditra amin'ny latabatra mitovy mihoatra ny indray mandeha amin'ny fifanakalozana iray, izay mety hiteraka hafatra diso.
Ohatra, raha hita eo amin'ny latabatra ny trigger na ny fahamendrehan'ny referential, dia tsy horaharahaina ny soso-kevitra APPEND rehefa manandrana mampiasa INSERT mivantana (serial na parallèle), ary koa ny soso-kevitra PARALLEL na clause, raha misy.

Inona no hitranga rehefa tanterahina ity script manaraka ity?

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

  • Vita soa aman-tsara
  • Tsy fahombiazana noho ny fahadisoana syntax
  • Error: Tsy manankery ny Transaction Autonomous
  • Hadisoana mifandraika amin'ny fihoaram-pefy ambony indrindra amin'ny fiantsoana
  • Fahadisoana fanitsakitsahana fanalahidy vahiny
  • Hadisoana mifandraika amin'ny hidin-trano

valinyNy latabatra sy ny trigger dia noforonina araka ny tokony ho izy ary ity hetsika ity dia tsy tokony hiteraka olana. Avela ihany koa ny fifampiraharahana tsy miankina amin'ny trigger, raha tsy izany dia tsy ho azo atao, ohatra.

Aorian'ny fampidirana ny andalana voalohany, ny fandoroana trigger mahomby dia mety hampiditra ny laharana faharoa, ka mahatonga ny trigger hitifitra indray, mampiditra andalana fahatelo, ary toy izany hatrany mandra-pahoviana ilay fanambarana noho ny fihoaram-pefy ambony indrindra amin'ny antso. Na izany aza, misy teboka iray hafa manjavozavo. Tamin'ny fotoana nanaovana ny trigger dia tsy mbola vita ny commit ho an'ny rakitra nampidirina voalohany. Noho izany, ny trigger mandeha amin'ny fifampiraharahana tsy miankina dia manandrana mampiditra andalana iray ao anaty latabatra izay manondro fanalahidin'ny vahiny amin'ny rakitra iray izay mbola tsy vita. Izany dia miteraka fiandrasana (ny fifampiraharahana tsy miankina dia miandry ny fifampiraharahana lehibe mba hijerena raha afaka mampiditra angon-drakitra) ary miaraka amin'izay koa, ny fifampiraharahana lehibe dia miandry ny fifampiraharahana tsy miankina hanohy ny asa aorian'ny trigger. Mitranga ny fahatapahan-jiro ary, vokatr'izany, nofoanana ny fifampiraharahana tsy miankina noho ny antony mifandraika amin'ny hidin-trano.

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Sarotra ny?

  • Toy ny rantsantanana roa, avy hatrany dia nanapa-kevitra ny zava-drehetra aho.

  • Tsy tena, diso aho tamin'ny fanontaniana roa.

  • Voavahako tsara ny antsasany.

  • indroa aho no nieritreritra ny valiny!

  • Hanoratra ao amin'ny fanehoan-kevitra aho

Mpampiasa 14 no nifidy. Mpampiasa 10 no nifady.

Source: www.habr.com

Add a comment