Ma hope o nā wāwae o Highload++ Siberia 2019 - 8 mau hana ma Oracle

Alohaʻoe!

Ma Iune 24-25, ua mālama ʻia ka hālāwai Highload++ Siberia 2019 ma Novosibirsk. Aia pū kā mākou mau kāne. hōʻike "Nā waihona waihona ipu Oracle (CDB/PDB) a me kā lākou hoʻohana pono ʻana no ka hoʻomohala polokalamu", e hoʻopuka mākou i kahi mana kikokikona ma hope iki. Ua ʻoluʻolu, mahalo olegbunin no ka hui, a me na mea a pau i hele mai.

Ma hope o nā wāwae o Highload++ Siberia 2019 - 8 mau hana ma Oracle
Ma kēia pou, makemake mākou e kaʻana like iā ʻoe i nā pilikia i loaʻa iā mākou ma kā mākou hale lole i hiki iā ʻoe ke hoʻāʻo i kāu ʻike Oracle. Aia ma lalo o ka ʻoki ʻia nā pilikia 8, nā koho pane a me ka wehewehe.

He aha ka nui o ka helu helu e ʻike ai mākou ma muli o ka hoʻokō ʻana i kēia ʻatikala?

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
  • ʻAʻole, e loaʻa ka hewa

ʻO ka paneWahi a Oracle palapala (i ʻōlelo ʻia mai 8.1.6):
I loko o kahi ʻōlelo SQL hoʻokahi, e hoʻonui ʻo Oracle i ke kaʻina hoʻokahi wale nō i kēlā me kēia lālani. Inā loaʻa i kahi ʻōlelo he ʻoi aku ma mua o hoʻokahi kuhikuhi i NEXTVAL no kahi kaʻina, hoʻonui ʻo Oracle i ke kaʻina hoʻokahi a hoʻihoʻi i ka waiwai like no nā hanana āpau o NEXTVAL. Inā loaʻa i kahi ʻōlelo nā kuhikuhi i ka CURRVAL a me NEXTVAL, hoʻonui ʻo Oracle i ke kaʻina a hoʻihoʻi i ka waiwai like no CURRVAL a me NEXTVAL me ka nānā ʻole i kā lākou kauoha i loko o ka ʻōlelo.

pela, ʻo ka helu kiʻekiʻe e like me ka helu o nā laina, ʻo ia ka 5.

ʻEhia lālani i loko o ka pākaukau ma muli o ka holo ʻana i kēia palapala?

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

ʻO ka paneWahi a Oracle palapala (i ʻōlelo ʻia mai 11.2):

Ma mua o ka hoʻokō ʻana i kekahi ʻōlelo SQL, hōʻailona ʻo Oracle i kahi wahi mālama huna (ʻaʻole i loaʻa iā ʻoe). A laila, inā hāʻule ka ʻōlelo, hoʻihoʻi maʻalahi ʻo Oracle iā ia a hoʻihoʻi i ke code hewa kūpono i SQLCODE ma SQLCA. No ka laʻana, inā pilikia ka ʻōlelo INSERT ma ka hoʻāʻo ʻana e hoʻokomo i kahi waiwai pālua i loko o kahi kuhikuhi kūʻokoʻa, ua ʻōwili ʻia ka ʻōlelo.

ʻO ke kāhea ʻana iā HP mai ka mea kūʻai aku e noʻonoʻo ʻia a hana ʻia ma ke ʻano he ʻōlelo hoʻokahi. No laila, hoʻopau maikaʻi ka kelepona HP mua, me ka hoʻokomo ʻana i ʻekolu mau moʻolelo; pau ka lua o ke kelepona HP me ka hewa a hoʻihoʻi i ka moʻolelo ʻehā i hiki ke hoʻokomo; hāʻule ka leo ʻekolu, a he ekolu moolelo ma ka papa.

ʻEhia lālani i loko o ka pākaukau ma muli o ka holo ʻana i kēia palapala?

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

ʻO ka paneWahi a Oracle palapala (i ʻōlelo ʻia mai 11.2):

Hiki iā ʻoe ke kuhikuhi i kahi kūlana e pono ai kēlā me kēia lālani i ka papaʻaina. No ka hoʻokō ʻana i ke koʻikoʻi, pono i kēlā me kēia lālani i ka papaʻaina ke ʻano he TRUE a ʻike ʻole paha (no ka null). Ke loiloi ʻo Oracle i kahi kūlana kaohi no kahi lālani, ʻo nā inoa kolamu i ke kūlana e kuhikuhi i nā koina kolamu i kēlā lālani.

No laila, e hala ka waiwai null i ka helu, a e hoʻokō pono ʻia ka poloka inoa ʻole a hiki i ka hoʻāʻo ʻana e hoʻokomo i ka waiwai 3. Ma hope o kēia, e hoʻomaʻemaʻe ka poloka hana hewa i ka ʻokoʻa, ʻaʻohe rollback e hiki mai, a ʻehā lālani i koe i ka papaʻaina me nā waiwai 1, null, 2 a me null hou.

ʻO wai nā hui waiwai e lawe i ka nui o ka nui o ka hakahaka ma ka poloka?

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 me X
  • ʻO B a me Y
  • ʻO C a me K
  • C a me Z
  • K a me Z
  • ʻO wau a me J
  • J a me X
  • Ua helu ʻia nā mea a pau

ʻO ka paneEia nā ʻāpana mai ka palapala (12.1.0.2) no ka mālama ʻana i nā ʻano ʻikepili like ʻole ma Oracle.

ʻAno ʻIkepili CHAR
Hōʻike ka ʻano ʻikepili CHAR i kahi kaula paʻa paʻa i loko o ka pūʻulu huaʻōlelo waihona. Hoʻonohonoho ʻoe i ka ʻano waihona waihona i ka wā e hana ai ʻoe i kāu waihona. Hoʻomaopopo ʻo Oracle i nā waiwai āpau i mālama ʻia i loko o kahi kolamu CHAR ka lōʻihi i kuhikuhi ʻia e ka nui i nā semantics lōʻihi i koho ʻia. Inā ʻoe e hoʻokomo i kahi waiwai i ʻoi aku ka pōkole ma mua o ka lōʻihi o ke kolamu, a laila hoʻopili ʻo Oracle blank-pad i ka waiwai i ka lōʻihi o ke kolamu.

VARCHAR2 ʻAno ʻikepili
Hōʻike ka ʻano ʻikepili VARCHAR2 i kahi kaula huaʻōlelo lōʻihi i loko o ka pūʻulu huaʻōlelo waihona. Hoʻonohonoho ʻoe i ka ʻano waihona waihona i ka wā e hana ai ʻoe i kāu waihona. Mālama ʻo Oracle i kahi waiwai i loko o kahi kolamu VARCHAR2 e like me kāu i kuhikuhi ai, me ka ʻole o ka padding blank, inā ʻaʻole i ʻoi aku ka waiwai ma mua o ka lōʻihi o ke kolamu.

NUMBER ʻAno ʻIkepili
Hoʻopaʻa ka ʻano ʻikepili NUMBER i nā helu helu a me nā helu paʻa maikaʻi a maikaʻi ʻole me nā waiwai kūʻokoʻa mai 1.0 x 10-130 a ʻaʻole naʻe me 1.0 x 10126. 1.0 x 10126, a laila hoʻihoʻi ʻo Oracle i kahi hewa. Pono kēlā me kēia waiwai NUMBER mai 1 a 22 bytes. Ma ka noʻonoʻo ʻana i kēia, hiki ke helu ʻia ka nui o ke kolamu i loko o nā bytes no kahi waiwai ʻikepili helu NUMBER(p), kahi p ka pololei o kahi waiwai i hāʻawi ʻia, hiki ke helu ʻia me ka hoʻohana ʻana i kēia ʻano: KA POE ((lōʻihi(p)+s)/2))+1 ma kahi o ka s i like me ka huahelu ina he maikai ka huina, a he s ka 1 ina he ino ka huina.

Eia kekahi, e lawe kākou i kahi ʻāpana mai ka palapala e pili ana i ka mālama ʻana i nā waiwai Null.

ʻO ka null ka nele o kahi waiwai ma kahi kolamu. Hōʻike nā nulls i nā ʻikepili nalo, ʻike ʻole a pili ʻole paha. Mālama ʻia nā nulls i ka waihona inā hāʻule lākou ma waena o nā kolamu me nā koina ʻikepili. I kēia mau hihia, pono lākou i 1 byte e mālama i ka lōʻihi o ke kolamu (zero). ʻAʻole pono ka mālama ʻana i nā mea ʻole ma ka lālani no ka mea e hōʻike ana ke poʻo lālani hou he null nā kolamu i koe ma ka lālani mua. No ka laʻana, inā he null nā kolamu hope ʻekolu o ka pākaukau, a laila ʻaʻohe ʻikepili i mālama ʻia no kēia mau kolamu.

Ma muli o kēia mau ʻikepili, kūkulu mākou i ka noʻonoʻo. Manaʻo mākou e hoʻohana ana ka waihona i ka hoʻopili ʻana AL32UTF8. Ma kēia hoʻopili ʻana, e noho nā leka Lūkini i 2 bytes.

1) A a me X, ʻo ka waiwai o ke kahua ʻo 'Y' e lawe i 1 byte, ʻo ka waiwai o ke kahua x 'D' e lawe i 2 bytes
2) B a me Y, 'Vasya' i loko o b e ho'opa'a 'ia ka waiwai me nā hakahaka a hiki i ka 10 hua'ōlelo a e lawe i 14 paita, 'Vasya' ma d e lawe i 8 paita.
3) C a me K. Loaʻa ka waiwai NULL o nā kahua ʻelua, ma hope o lākou he mau kahua koʻikoʻi, no laila noho lākou i 1 byte.
4) C a me Z. Loaʻa i nā māla ʻelua ka waiwai NULL, akā ʻo ka māla Z ka mea hope loa i ka papaʻaina, no laila ʻaʻole ia e lawe i kahi ākea (0 bytes). Loaʻa ka pā C i 1 byte.
5) K a me Z. E like me ka hihia mua. Aia ka waiwai ma ke kahua K i 1 byte, ma Z – 0.
6) I a me J. E like me ka palapala, e lawe nā waiwai ʻelua i 2 bytes. E helu mākou i ka lōʻihi me ka hoʻohana ʻana i ke ʻano i lawe ʻia mai ka palapala: puni((1 + 0)/2) +1 = 1 + 1 = 2.
7) J a me X. He 2 bytes ka waiwai ma ke kahua J, he 2 bytes ka waiwai ma ke kahua X.

ʻO ka huina, nā koho kūpono: C a me K, I a me J, J a me X.

He aha ke ʻano o ka hui pū ʻana o ka helu 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);

  • He ʻumi paha
  • Ma kahi o nā haneli
  • Ma kahi o nā tausani
  • Ma kahi o ʻumi tausani

ʻO ka paneWahi a Oracle palapala (i ʻōlelo ʻia mai 12.1):

No ka papa kuhikuhi kumu lāʻau B, e ana ka helu helu hui i ka hui kino o nā lālani e pili ana i kahi waiwai kuhikuhi.

ʻO ke kumu hoʻohui helu helu e kōkua i ka mea hoʻoponopono e hoʻoholo inā ʻoi aku ka maikaʻi o ka scan index a i ʻole ka papa ʻaina piha no kekahi mau nīnau). Hōʻike ʻia kahi helu hōʻuluʻulu haʻahaʻa i kahi scan index kūpono.

ʻO kahi kumu hoʻouluulu e pili kokoke ana i ka helu o nā poloka ma ka papaʻaina e hōʻike ana ua hoʻonohonoho kino ʻia nā lālani ma nā poloka papa e ke kī kuhikuhi. Inā hoʻokō ka waihona i ka papaʻaina piha, a laila makemake ka waihona e kiʻi i nā lālani e like me ka mālama ʻana ma ka disk i hoʻokaʻawale ʻia e ke kī kuhikuhi. ʻO kahi kumu hoʻohui pili kokoke i ka helu o nā lālani e hōʻike ana ua hoʻopuehu wale ʻia nā lālani ma nā poloka waihona e pili ana i ke kī kuhikuhi. Inā hana ka ʻikepili i ka nānā ʻana i ka papaʻaina piha, a laila ʻaʻole e kiʻi ka waihona i nā lālani i kēlā me kēia hoʻonohonoho ʻia e kēia kī kuhikuhi.

I kēia hihia, ua hoʻokaʻawale maikaʻi ʻia ka ʻikepili, no laila e like a kokoke paha ka helu clustering i ka helu o nā poloka i noho ʻia ma ka papaʻaina. No ka nui o ka poloka maʻamau o 8 kilobytes, hiki iā ʻoe ke manaʻo e pili ana i hoʻokahi tausani mau helu haiki e komo i loko o hoʻokahi poloka, no laila ka helu o nā poloka, a ma muli o ka hopena, e lilo ka kumu clustering. he umi paha.

He aha nā waiwai o N e hoʻokō maikaʻi ʻia ai kēia palapala i loko o kahi waihona maʻamau me nā hoʻonohonoho maʻamau?

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

ʻO ka paneWahi a Oracle palapala (i ʻōlelo ʻia mai 11.2):

Nā palena ʻikepili Logical

'ikamu
ʻAno palena
Waiwai palena

Nā kuhikuhi
Nui ka nui o ke kolamu i kuhikuhi ʻia
ʻO 75% o ka nui o ka waihona waihona me ka hoʻemi ʻana i ke poʻo

No laila, ʻaʻole pono ka nui o nā kolamu i kuhikuhi ʻia ma mua o 6Kb. ʻO ka mea e hiki mai ana ma muli o ka hoʻopāpā kumu i koho ʻia. No ka AL32UTF8 hoʻopāpā, hiki i hoʻokahi ʻano ke noho ma kahi o 4 paita kiʻekiʻe, no laila i ka hihia ʻino loa, 6 kilobytes e kūpono ma kahi o 1500 mau huaʻōlelo. No laila, ʻaʻole ʻae ʻo Oracle i ka hoʻokumu ʻana i ka index ma N = 400 (inā ʻo ka lōʻihi o ke kī ʻoi loa he 1600 mau huaʻōlelo * 4 bytes + lōʻihi rowid), ʻoiai. ma N = 200 (a emi mai paha) e hana ana ka index me ka pilikia ole.

Hoʻolālā ʻia ka mea hoʻohana INSERT me ka hōʻailona APPEND e hoʻouka i ka ʻikepili ma ke ʻano pololei. He aha ka hopena inā pili ia i ka pākaukau e kau ai ke kumu?

  • E hoʻoukaʻia kaʻikepili ma keʻano pololei, e hana ka mea hoʻomaka e like me ka mea i manaʻoʻia
  • E hoʻouka ʻia ka ʻikepili ma ke ʻano pololei, akā ʻaʻole e hoʻokō ʻia ke kumu
  • E hoʻouka ʻia ka ʻikepili ma ke ʻano maʻamau, e hana ka trigger e like me ka mea e pono ai
  • E hoʻouka ʻia ka ʻikepili ma ke ʻano maʻamau, akā ʻaʻole e hoʻokō ʻia ke kumu
  • ʻAʻole e hoʻouka ʻia ka ʻikepili, e hoʻopaʻa ʻia kahi hewa

ʻO ka paneʻO ke kumu, ʻoi aku kēia i kahi nīnau o ka loina. No ka loaʻa ʻana o ka pane pololei, manaʻo wau i kēia kumu hoʻohālike:

  1. Hana ʻia ka hoʻokomo ʻana ma ke ʻano pololei e ka hoʻokumu pololei ʻana i kahi poloka ʻikepili, e kaalo ana i ka mīkini SQL, e hōʻoiaʻiʻo ana i ka wikiwiki kiʻekiʻe. No laila, paʻakikī loa ka hōʻoia ʻana i ka hoʻokō ʻana i ke kumu, inā ʻaʻole hiki ʻole, a ʻaʻohe kumu o kēia, no ka mea, e hoʻolōʻihi loa ia i ka hoʻokomo.
  2. ʻO ka hoʻokō ʻole ʻana i ke kumu e alakaʻi i ka ʻoiaʻiʻo, inā like ka ʻikepili i ka papaʻaina, e hilinaʻi ka mokuʻāina o ka waihona ma ke ʻano holoʻokoʻa (nā papa ʻē aʻe) i ke ʻano i hoʻokomo ʻia ai kēia ʻikepili. E hoʻopau kēia i ka pono o ka ʻikepili a ʻaʻole hiki ke hoʻohana ʻia ma ke ʻano he hopena i ka hana ʻana.
  3. ʻO ka hiki ʻole ke hoʻokō i ka hana i noi ʻia ma ke ʻano he hewa. Eia naʻe, e hoʻomanaʻo mākou he hōʻailona ʻo APPEND, a ʻo ka loina maʻamau o nā hints e noʻonoʻo ʻia inā hiki, akā inā ʻaʻole, hoʻokō ʻia ka mea hoʻohana me ka ʻole o ka lawe ʻana i ka hint.

No laila, ʻo ka pane i manaʻo ʻia e hoʻouka ʻia ka ʻikepili ma ke ʻano maʻamau (SQL), e puhi ke kumu.

Wahi a Oracle palapala (i ʻōlelo ʻia mai 8.04):

ʻO ka uhaki ʻana i nā kapu e hoʻokō ʻia ka ʻōlelo ma ke ʻano serially, me ka hoʻohana ʻana i ke ala hoʻokomo maʻamau, me ka ʻole o nā ʻōlelo aʻo a i ʻole nā ​​memo hewa. ʻO kahi ʻokoʻa ka palena o nā ʻōlelo i ke komo ʻana i ka papaʻaina hoʻokahi ma mua o hoʻokahi manawa i kahi kālepa, hiki ke hoʻoulu i nā memo hewa.
No ka laʻana, inā loaʻa nā mea hoʻoulu a i ʻole ka ʻoiaʻiʻo kuhikuhi ma ka papaʻaina, a laila e nānā ʻole ʻia ka ʻōlelo APPEND ke hoʻāʻo ʻoe e hoʻohana i ka INSERT hoʻouka pololei (serial a i ʻole like), a me ka hint PARALLEL a i ʻole ka paukū, inā he.

He aha ka hopena ke hoʻokō ʻia kēia ʻatikala?

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

  • Hoʻopau lanakila
  • Haʻalele ma muli o ka hewa syntax
  • Hapa: ʻAʻole kūpono ka hana kūʻokoʻa
  • Ua pili ka hewa i ka ʻoi aku o ka nui loa o ka pūnana kelepona
  • Haʻihaʻi kiʻi haole
  • Kupa pili i nā laka

ʻO ka paneHana ʻia ka papaʻaina a me ka trigger a ʻaʻole pono kēia hana i nā pilikia. ʻAe ʻia nā hana kūʻokoʻa i kahi trigger, inā ʻaʻole hiki ke hoʻopaʻa inoa, no ka laʻana.

Ma hope o ka hoʻokomo ʻana i ka lālani mua, e hoʻokomo ʻia ka lālani lua me ka hoʻokomo ʻana i ka lālani ʻekolu, a pēlā aku a hiki i ka hāʻule ʻana o ka ʻōlelo ma muli o ka ʻoi aku o ka nui o ke kani ʻana o nā kelepona. Eia naʻe, hele mai kekahi mea maʻalahi. I ka manawa e hoʻokō ʻia ai ka hoʻomaka ʻana, ʻaʻole i pau ka commit no ka moʻolelo i hoʻokomo mua ʻia. No laila, ke ho'āʻo nei ka mea hoʻomaka e hoʻokomo i loko o ka papa ʻaina i kahi lālani e kuhikuhi ana i kahi kī haole i kahi moʻolelo i hana ʻole ʻia. Loaʻa kēia i kahi kali (kali ka hana kūʻokoʻa i ka hana nui e hana e ʻike inā hiki iā ia ke hoʻokomo i ka ʻikepili) a ma ka manawa like ke kali nei ka hana nui i ka hana kūʻokoʻa e hoʻomau i ka hana ma hope o ke kumu. Loaʻa kahi deadlock a, ma muli o ka hopena, ua kāpae ʻia ke kālepa kūʻokoʻa ma muli o nā kumu e pili ana i nā laka.

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

Ua paʻakikī i ka?

  • E like me nā manamana lima ʻelua, ua hoʻoholo koke wau i nā mea āpau me ka pololei.

  • ʻAʻole maoli, ua hewa wau i kekahi mau nīnau.

  • Ua hoʻoponopono pololei wau i ka hapalua o ia mea.

  • Ua kuhi au i ka pane ʻelua!

  • E kākau wau ma nā manaʻo

14 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 10.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka