Swiv tras Highload++ Siberia 2019 - 8 travay sou Oracle

Hi!

24-25 jen, konferans Highload++ Siberia 2019 te fèt nan Novosibirsk, mesye nou yo te la tou. rapò "Baz done veso Oracle (CDB/PDB) ak itilizasyon pratik yo pou devlopman lojisyèl", nou pral pibliye yon vèsyon tèks yon ti kras pita. Li te fre, mèsi olegbunin pou òganizasyon an, osi byen ke pou tout moun ki te vini.

Swiv tras Highload++ Siberia 2019 - 8 travay sou Oracle
Nan pòs sa a, nou ta renmen pataje avèk ou pwoblèm nou te genyen nan izolwa nou an pou ou ka teste konesans Oracle ou. Anba koupe a gen 8 pwoblèm, opsyon repons ak eksplikasyon.

Ki valè maksimòm sekans nou pral wè kòm rezilta nan egzekite script sa a?

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
  • Non, pral gen yon erè

ReponnDapre dokiman Oracle (ki site nan 8.1.6):
Nan yon sèl deklarasyon SQL, Oracle pral ogmante sekans lan sèlman yon fwa pou chak ranje. Si yon deklarasyon gen plis pase yon referans a NEXTVAL pou yon sekans, Oracle ogmante sekans lan yon fwa epi retounen menm valè a pou tout ensidans NEXTVAL. Si yon deklarasyon gen referans a tou de CURRVAL ak NEXTVAL, Oracle ogmante sekans lan epi retounen menm valè pou tou de CURRVAL ak NEXTVAL kèlkeswa lòd yo nan deklarasyon an.

Kidonk, nan valè maksimòm lan pral koresponn ak kantite liy, se sa ki 5.

Konbyen ranje ki pral genyen nan tablo a kòm rezilta kouri script sa a?

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

ReponnDapre dokiman Oracle (ki site nan 11.2):

Anvan ou egzekite nenpòt deklarasyon SQL, Oracle make yon pwen sove implicite (pa disponib pou ou). Lè sa a, si deklarasyon an echwe, Oracle woule li tounen otomatikman epi retounen kòd erè ki aplikab la nan SQLCODE nan SQLCA la. Pou egzanp, si yon deklarasyon INSERT lakòz yon erè lè li eseye mete yon valè kopi nan yon endèks inik, deklarasyon an woule tounen.

Rele HP nan men kliyan an konsidere tou ak trete kòm yon deklarasyon sèl. Kidonk, premye apèl HP konplete avèk siksè, li te mete twa dosye; dezyèm apèl HP fini ak yon erè ak woule tounen katriyèm dosye ke li jere yo mete; twazyèm apèl la echwe, epi gen twa dosye nan tablo a.

Konbyen ranje ki pral genyen nan tablo a kòm rezilta kouri script sa a?

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

ReponnDapre dokiman Oracle (ki site nan 11.2):

Yon kontrent chèk pèmèt ou presize yon kondisyon ke chak ranje nan tablo a dwe satisfè. Pou satisfè kontrent la, chak ranje nan tablo a dwe fè kondisyon an swa VRE oswa enkoni (akòz yon nil). Lè Oracle evalye yon kondisyon kontrent chèk pou yon ranje patikilye, nenpòt non kolòn nan kondisyon an refere a valè kolòn yo nan ranje sa a.

Kidonk, valè nil la pral pase chèk la, epi blòk anonim la pral egzekite avèk siksè jiskaske yon tantativ pou mete valè 3. Apre sa, blòk manyen erè a pral klè eksepsyon an, pa gen okenn rollback ap fèt, ak pral gen kat ranje ki rete nan tablo a ak valè 1, nil, 2 ak nil ankò.

Ki pè valè ki pral pran menm kantite espas nan blòk la?

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 ak X
  • B ak Y
  • C ak K
  • C ak Z
  • K ak Z
  • mwen ak J
  • J ak X
  • Tout ki nan lis la

ReponnIsit la yo se ekstrè nan dokiman an (12.1.0.2) sou estoke divès kalite done nan Oracle.

Kalite done CHAR
Kalite done CHAR la presize yon seri karaktè longè fiks nan seri karaktè baz done a. Ou presize seri karaktè baz done a lè ou kreye baz done ou a. Oracle asire ke tout valè ki estoke nan yon kolòn CHAR gen longè ki espesifye pa gwosè nan semantik longè chwazi yo. Si ou mete yon valè ki pi kout pase longè kolòn nan, Lè sa a, Oracle vid-pad valè a nan longè kolòn.

VARCHAR2 Kalite Done
Kalite done VARCHAR2 la presize yon seri karaktè ki gen longè varyab nan seri karaktè baz done a. Ou presize seri karaktè baz done a lè ou kreye baz done ou a. Oracle estoke yon valè karaktè nan yon kolòn VARCHAR2 egzakteman jan ou presize li, san okenn padding vid, depi valè a pa depase longè kolòn nan.

NUMBER Kalite Done
Kalite done NIMEWO a estoke zewo ak nimewo pozitif ak negatif fiks ak valè absoli ki soti nan 1.0 x 10-130 a men ki pa enkli 1.0 x 10126. Si w presize yon ekspresyon aritmetik ki gen valè absoli ki pi gran pase oswa egal a. 1.0 x 10126, Lè sa a, Oracle retounen yon erè. Chak valè NIMEWO mande de 1 a 22 bytes. Lè w pran sa a an kont, gwosè kolòn nan byte pou yon valè done nimerik patikilye NUMBER(p), kote p se presizyon yon valè yo bay, yo ka kalkile lè l sèvi avèk fòmil sa a: WONT ((longè(p)+s)/2))+1 kote s egal zewo si nimewo a pozitif, ak s egal 1 si nimewo a negatif.

Anplis de sa, ann pran yon ekstrè nan dokiman an sou estoke valè Nil.

Yon nil se absans yon valè nan yon kolòn. Nil yo endike done ki manke, ki pa konnen oswa ki pa aplikab. Nul yo estoke nan baz done a si yo tonbe ant kolòn ak valè done yo. Nan ka sa yo, yo mande pou 1 byte pou estoke longè kolòn nan (zewo). Nul final yo nan yon ranje pa bezwen depo paske yon nouvo header ranje siyal ke kolòn ki rete yo nan ranje anvan an se nil. Pa egzanp, si twa dènye kolòn yon tablo yo nil, pa gen okenn done ki estoke pou kolòn sa yo.

Baze sou done sa yo, nou bati rezònman. Nou sipoze ke baz done a sèvi ak kodaj AL32UTF8. Nan kodaj sa a, lèt Ris pral okipe 2 octets.

1) A ak X, valè jaden yon 'Y' pran 1 byte, valè jaden x 'D' pran 2 byte
2) B ak Y, 'Vasya' nan b valè a pral ranpli ak espas jiska 10 karaktè epi yo pral pran 14 bytes, 'Vasya' nan d pral pran 8 bytes.
3) C ak K. Tou de jaden yo gen valè NULL, apre yo gen jaden enpòtan, kidonk yo okipe 1 byte.
4) C ak Z. Tou de jaden yo gen valè NULL, men jaden Z se dènye a nan tablo a, kidonk li pa pran espas (0 bytes). Jaden C okipe 1 byte.
5) K ak Z. Menm jan ak ka anvan an. Valè nan jaden K okipe 1 byte, nan Z - 0.
6) I ak J. Dapre dokiman an, tou de valè yo pral pran 2 bytes. Nou kalkile longè a lè l sèvi avèk fòmil yo pran nan dokiman an: wonn( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J ak X. Valè a nan jaden an J pral pran 2 byte, valè a nan jaden an X pral pran 2 byte.

An total, opsyon ki kòrèk yo se: C ak K, I ak J, J ak X.

Ki sa ki pral apeprè faktè gwoupman endèks T_I a?

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

  • Apeprè dizèn
  • Apeprè dè santèn
  • Apeprè dè milye
  • Apeprè dè dizèn de milye

ReponnDapre dokiman Oracle (ki site nan 12.1):

Pou yon endèks B-tree, faktè gwoupman endèks la mezire gwoupman fizik ranje yo an relasyon ak yon valè endèks.

Faktè clustering endèks la ede optimisateur la deside si yon eskanè endèks oswa yon eskanè tab konplè pi efikas pou sèten demann). Yon faktè ki ba gwoupman endike yon eskanè endèks efikas.

Yon faktè clustering ki pre kantite blòk nan yon tablo endike ke ranje yo ranje fizikman nan blòk tab yo pa kle endèks la. Si baz done a fè yon eskanè tab konplè, Lè sa a, baz done a gen tandans rekipere ranje yo jan yo estoke sou disk klase pa kle nan endèks. Yon faktè clustering ki pre kantite ranje endike ke ranje yo gaye owaza atravè blòk baz done yo an relasyon ak kle endèks la. Si baz done a fè yon eskanè tab konplè, Lè sa a, baz done a pa ta rekipere ranje nan nenpòt lòd ki klase pa kle endèks sa a.

Nan ka sa a, done yo depreferans klase, kidonk faktè a gwoupman pral egal a oswa fèmen nan kantite blòk okipe nan tablo a. Pou yon gwosè blòk estanda 8 kilookte, ou ka espere ke apeprè mil valè nimewo etwat pral anfòm nan yon blòk, kidonk kantite blòk yo, epi kòm yon rezilta, faktè gwoupman an pral. sou dè dizèn.

Nan ki valè N yo pral egzekite script sa a avèk siksè nan yon baz done regilye ak anviwònman estanda?

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

ReponnDapre dokiman Oracle (ki site nan 11.2):

Limit baz done lojik

Atik
Kalite Limit
Valè limit

Endis
Gwosè total kolòn endis
75% nan gwosè a blòk baz done mwens kèk anlè

Kidonk, gwosè total kolòn endèks yo pa ta dwe depase 6Kb. Kisa k ap pase apre depann de kodaj baz chwazi a. Pou kodaj AL32UTF8, yon karaktè ka okipe yon maksimòm de 4 octets, kidonk nan pi move senaryo a, apeprè 6 karaktè ap anfòm nan 1500 kilobyte. Se poutèt sa, Oracle pral refize kreyasyon endèks nan N = 400 (lè pi move ka longè kle a se 1600 karaktè * 4 byte + longè rowid), pandan y ap nan N = 200 (oswa mwens) kreye endèks la ap travay san pwoblèm.

Operatè INSERT la ak sijesyon APPEND la fèt pou chaje done nan mòd dirèk. Kisa k ap pase si yo aplike li sou tab kote deklanche a pandye?

  • Done yo pral chaje nan mòd dirèk, deklanche a ap travay jan yo espere
  • Done yo pral chaje nan mòd dirèk, men deklanche a pa pral egzekite
  • Done yo pral chaje nan mòd konvansyonèl, deklanche a ap travay jan li ta dwe
  • Done yo pral chaje nan mòd konvansyonèl, men deklanche a pa pral egzekite
  • Done yo pa pral chaje, yo pral anrejistre yon erè

ReponnFondamantalman, sa a se plis nan yon kesyon de lojik. Pou jwenn repons ki kòrèk la, mwen ta sijere modèl rezònman sa a:

  1. Ensèsyon nan mòd dirèk fèt pa fòmasyon dirèk nan yon blòk done, contournement motè a SQL, ki asire gwo vitès. Kidonk, asire egzekisyon an nan deklanche a trè difisil, si se pa enposib, epi pa gen okenn pwen nan sa a, depi li pral toujou radikalman ralanti ensèsyon an.
  2. Si w pa egzekite deklanche a ap mennen nan lefèt ke, si done yo nan tablo a se menm bagay la, eta a nan baz done a kòm yon antye (lòt tab) pral depann de mòd nan ki done sa yo te eleman. Sa a pral evidamman detwi entegrite done epi yo pa ka aplike kòm yon solisyon nan pwodiksyon an.
  3. Enkapasite pou fè operasyon yo mande a jeneralman trete kòm yon erè. Men, isit la nou ta dwe sonje ke APPEND se yon allusion, ak lojik jeneral nan sijesyon se ke yo pran an kont si sa posib, men si se pa, se operatè a egzekite san yo pa pran allusion a an kont.

Se konsa, repons espere se done yo pral chaje nan mòd nòmal (SQL), deklanche a pral dife.

Dapre dokiman Oracle (ki site nan 8.04):

Vyolasyon restriksyon yo pral lakòz deklarasyon an egzekite seri, lè l sèvi avèk chemen an insert konvansyonèl, san avètisman oswa mesaj erè. Yon eksepsyon se restriksyon sou deklarasyon ki gen aksè a menm tab la plis pase yon fwa nan yon tranzaksyon, sa ki ka lakòz mesaj erè.
Pou egzanp, si deklanche oswa entegrite referans yo prezan sou tab la, Lè sa a, allusion APPEND la pral inyore lè ou eseye sèvi ak chaj dirèk INSERT (seri oswa paralèl), osi byen ke sijesyon oswa kloz PARALLEL la, si genyen.

Kisa ki pral rive lè yo egzekite script sa a?

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

  • Siksè ekzekisyon
  • Echèk akòz erè sentaks
  • Erè: Tranzaksyon otonòm pa valab
  • Erè ki gen rapò ak depase limit maksimòm apèl la
  • Erè Vyolasyon Kle Etranje
  • Erè ki gen rapò ak kadna

ReponnTablo a ak deklanche yo kreye byen kòrèkteman ak operasyon sa a pa ta dwe mennen nan pwoblèm. Tranzaksyon otonòm nan yon deklanche yo pèmèt tou, otreman antre pa ta posib, pou egzanp.

Apre mete premye ranje a, yon tire siksè deklanche ta lakòz dezyèm ranje a dwe mete, sa ki lakòz deklanche a tire ankò, mete yon twazyèm ranje, ak sou sa jiskaske deklarasyon an echwe akòz depase maksimòm nidifikasyon nan apèl. Sepandan, yon lòt pwen sibtil antre nan jwèt. Nan moman an egzekite deklanche a, komite poko fini pou premye dosye ki mete a. Se poutèt sa, yon deklanche ki kouri nan yon tranzaksyon otonòm eseye mete nan tablo a yon ranje ki fè referans a yon kle etranje ak yon dosye ki poko komèt. Sa a rezilta nan yon rete tann (tranzaksyon otonòm nan tann pou tranzaksyon prensipal la komèt pou wè si li ka mete done) ak an menm tan an tranzaksyon prensipal la tann pou tranzaksyon an otonòm kontinye ap travay apre deklanche la. Yon enpas rive epi, kòm rezilta, tranzaksyon otonòm an anile akòz rezon ki gen rapò ak kadna..

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Li te difisil pou?

  • Tankou de dwèt, mwen imedyatman deside tout bagay kòrèkteman.

  • Pa reyèlman, mwen te mal sou yon koup nan kesyon.

  • Mwen rezoud mwatye nan li kòrèkteman.

  • Mwen devine repons lan de fwa!

  • Mwen pral ekri nan kòmantè yo

14 itilizatè yo te vote. 10 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè