Пас аз пайравӣ аз Highload++ Siberia 2019 - 8 вазифа дар Oracle

Салом!

Рӯзҳои 24-25 июн дар Новосибирск конфронси Highload++ Siberia 2019 баргузор гардид.Бачаҳои мо низ дар он ҷо буданд. гузориш "Маъзанҳои контейнерии Oracle (CDB/PDB) ва истифодаи амалии онҳо барои таҳияи нармафзор", мо версияи матниро каме дертар нашр хоҳем кард. Ин хуб буд, ташаккур олегбунин барои ташкилот, инчунин ба хар касе, ки омада буд.

Пас аз пайравӣ аз Highload++ Siberia 2019 - 8 вазифа дар Oracle
Дар ин паём, мо мехоҳем бо шумо мушкилотеро, ки дар стенди худ доштем, мубодила кунем, то шумо дониши Oracle-и худро санҷед. Дар зер 8 масъала, вариантҳои ҷавоб ва тавзеҳот оварда шудаанд.

Дар натиҷаи иҷрои скрипти зерин арзиши максималии пайдарпай чӣ гуна аст?

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
  • Не, хато мешавад

Ҷавоб диҳедМувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 8.1.6):
Дар доираи як изҳороти SQL, Oracle пайдарпаиро танҳо як маротиба дар як сатр афзоиш медиҳад. Агар изҳорот зиёда аз як истинод ба NEXTVAL барои пайдарпаӣ дошта бошад, Oracle пайдарпайро як маротиба зиёд мекунад ва барои ҳама рӯйдодҳои NEXTVAL ҳамон як арзишро бармегардонад. Агар изҳорот истинод ба ҳам ба CURRVAL ва ҳам NEXTVAL дошта бошад, Oracle пайдарпаиро афзоиш медиҳад ва новобаста аз тартиби онҳо дар дохили изҳорот ҳам барои CURRVAL ва ҳам NEXTVAL арзиши якхеларо бармегардонад.

Ҳамин тавр, арзиши максималӣ ба шумораи сатрҳо мувофиқат мекунад, яъне 5.

Дар натиҷаи иҷро кардани скрипти зерин дар ҷадвал чанд сатр хоҳад буд?

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

Ҷавоб диҳедМувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 11.2):

Пеш аз иҷрои ҳама гуна изҳороти SQL, Oracle нуқтаи нигоҳдории пинҳониро қайд мекунад (барои шумо дастрас нест). Сипас, агар изҳорот ноком шавад, Oracle онро ба таври худкор бармегардонад ва рамзи хатои мувофиқро ба SQLCODE дар SQLCA бармегардонад. Масалан, агар изҳороти INSERT бо кӯшиши ворид кардани арзиши такрорӣ ба индекси беназир хатогӣ ба вуҷуд орад, изҳорот баргардонида мешавад.

Занг задан ба HP аз муштарӣ низ ҳамчун як изҳорот баррасӣ ва коркард карда мешавад. Ҳамин тариқ, занги аввалини HP бо ворид кардани се сабт бомуваффақият анҷом меёбад; занги дуюми HP бо хатогӣ ба охир мерасад ва сабти чорумро, ки тавонист ворид кунад, баргардонад; занги сеюм ноком мешавад, ва дар ҷадвал се сабт мавҷуд аст.

Дар натиҷаи иҷро кардани скрипти зерин дар ҷадвал чанд сатр хоҳад буд?

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

Ҷавоб диҳедМувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 11.2):

Маҳдудияти чек ба шумо имкон медиҳад, ки шартеро муайян кунед, ки ҳар як сатри ҷадвал бояд қонеъ кунад. Барои қонеъ кардани маҳдудият, ҳар як сатри ҷадвал бояд шартро TRUE ё номаълум кунад (аз сабаби нул). Вақте ки Oracle ҳолати маҳдудияти чекро барои як сатри муайян арзёбӣ мекунад, ҳама гуна номҳои сутун дар ин ҳолат ба арзишҳои сутуни он сатр ишора мекунанд.

Ҳамин тариқ, арзиши null аз санҷиш мегузарад ва блоки беном то кӯшиши ворид кардани арзиши 3 бомуваффақият иҷро карда мешавад. Пас аз ин, блоки коркарди хато истисноро тоза мекунад, ягон баргашт рӯй намедиҳад ва дар ҷадвал чор қатор боқӣ мемонад бо арзишҳои 1, null, 2 ва боз null.

Кадом ҷуфтҳои арзишҳо дар блок миқдори якхеларо ишғол мекунанд?

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, 'Д', 'Вася');

  • А ва X
  • Б ва Ю
  • C ва К
  • C ва З
  • К ва З
  • Ман ва Ҷ
  • J ва X
  • Ҳама номбар шудаанд

Ҷавоб диҳедДар ин ҷо иқтибосҳо аз ҳуҷҷатҳо (12.1.0.2) оид ба нигоҳдории намудҳои гуногуни маълумот дар Oracle оварда шудаанд.

Навъи маълумот CHAR
Навъи маълумоти CHAR сатри аломатҳои дарозии собитро дар маҷмӯи аломатҳои пойгоҳи додаҳо муайян мекунад. Ҳангоми сохтани пойгоҳи додаи худ шумо маҷмӯи аломатҳои пойгоҳи додаро муайян мекунед. Oracle кафолат медиҳад, ки ҳамаи арзишҳои дар сутуни CHAR нигоҳ дошташуда дарозии аз рӯи андоза дар семантикаи дарозии интихобшуда муайяншударо доранд. Агар шумо арзише гузоред, ки аз дарозии сутун кӯтоҳтар бошад, пас Oracle қиматро ба дарозии сутун холӣ мекунад.

VARCHAR2 Навъи маълумот
Навъи маълумоти VARCHAR2 сатри аломатҳои дарозии тағирёбандаро дар маҷмӯи аломатҳои пойгоҳи додаҳо муайян мекунад. Ҳангоми сохтани пойгоҳи додаи худ шумо маҷмӯи аломатҳои пойгоҳи додаро муайян мекунед. Oracle арзиши аломатро дар сутуни VARCHAR2 маҳз ҳамон тавре, ки шумо онро муайян кардаед, бидуни пуркунии холӣ нигоҳ медорад, ба шарте ки арзиш аз дарозии сутун зиёд набошад.

Навъи маълумот NUMBER
Навъи додаҳои NUMBER сифр, инчунин рақамҳои собити мусбат ва манфиро бо қимматҳои мутлақи аз 1.0 x 10-130 то 1.0 x 10126 нигоҳ медорад. Агар шумо ифодаи арифметикиро муайян кунед, ки арзиши он аз арзиши мутлақи калонтар ё баробар аст 1.0 x 10126, пас Oracle хатогиро бармегардонад. Ҳар як арзиши NUMBER аз 1 то 22 байтро талаб мекунад. Бо дарназардошти ин, андозаи сутунро бо байтҳо барои арзиши мушаххаси маълумоти ададӣ NUMBER(p), ки дар он p дақиқи арзиши додашуда аст, бо формулаи зерин ҳисоб кардан мумкин аст: ROUND((дарозӣ(р)+с)/2))+1 ки s ба сифр баробар аст, агар адад мусбат бошад ва s ба 1 баробар бошад, агар шумора манфӣ бошад.

Илова бар ин, биёед иқтибосро аз ҳуҷҷатҳо дар бораи нигоҳ доштани арзишҳои Null гирем.

Нул ин набудани арзиш дар сутун аст. Нулҳо маълумоти гумшуда, номаълум ё ғайри қобили амалро нишон медиҳанд. Нулҳо дар пойгоҳи додаҳо нигоҳ дошта мешаванд, агар онҳо дар байни сутунҳо бо арзишҳои додаҳо афтанд. Дар ин ҳолатҳо, онҳо барои нигоҳ доштани дарозии сутун (сифр) 1 байт лозиманд. Нулҳои паси дар як сатр нигоҳдорӣ талаб намекунанд, зеро сарлавҳаи сатри нав нишон медиҳад, ки сутунҳои боқимондаи сатри қаблӣ сифр мебошанд. Масалан, агар се сутуни охирини ҷадвал сифр бошад, пас барои ин сутунҳо ягон маълумот нигоҳ дошта намешавад.

Дар асоси ин маълумот, мо далелҳо месозем. Мо тахмин мезанем, ки пойгоҳи дода рамзгузории AL32UTF8-ро истифода мебарад. Дар ин рамзгузорӣ ҳарфҳои русӣ 2 байтро ишғол мекунанд.

1) A ва X, арзиши майдони a 'Y' 1 байт, арзиши майдони x 'D' 2 байт мегирад
2) B ва Y, 'Вася' дар b арзиш бо фосилаҳои то 10 аломат пур карда мешавад ва 14 байт, "Вася" дар d 8 байт мегирад.
3) C ва K. Ҳарду майдон қимати NULL доранд, пас аз онҳо майдонҳои назаррас мавҷуданд, бинобар ин онҳо 1 байтро ишғол мекунанд.
4) C ва Z. Ҳарду майдон қимати NULL доранд, аммо майдони Z дар ҷадвал охирин аст, бинобар ин он ҷой намегирад (0 байт). Майдони C 1 байтро ишғол мекунад.
5) К ва З. Ба ҳолати қаблӣ монанд. Қимат дар майдони K 1 байтро ишғол мекунад, дар Z – 0.
6) I ва J. Мувофиқи ҳуҷҷатҳо, ҳарду арзишҳо 2 байт мегиранд. Мо дарозиро бо формулаи аз ҳуҷҷат гирифташуда ҳисоб мекунем: round( (1 + 0)/2) +1 = 1 + 1 = 2.
7) J ва X. Қимат дар майдони J 2 байт, қимат дар майдони X 2 байт мегирад.

Дар маҷмӯъ, вариантҳои дуруст инҳоянд: C ва K, I ва J, J ва X.

Омили кластеризатсияи индекси 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);

  • Тақрибан даҳҳо
  • Тақрибан садҳо
  • Тақрибан ҳазорҳо
  • Тақрибан даҳҳо ҳазор

Ҷавоб диҳедМувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 12.1):

Барои шохиси дарахти B, омили кластерсозии индекс гурӯҳбандии физикии сатрҳоро дар робита бо арзиши индекс чен мекунад.

Омили кластеризатсияи индекс ба оптимизатор кӯмак мекунад, ки муайян кунад, ки сканкунии индекс ё ​​сканкунии пурраи ҷадвал барои дархостҳои муайян самараноктар аст). Омили пасти кластерӣ сканкунии самараноки индексро нишон медиҳад.

Омили кластерӣ, ки ба шумораи блокҳои ҷадвал наздик аст, нишон медиҳад, ки сатрҳо дар блокҳои ҷадвал бо калиди индекс ҷисмонӣ тартиб дода шудаанд. Агар базаи маълумот скани пурраи ҷадвалро иҷро кунад, пас базаи маълумотҳо майл дорад, ки сатрҳоро аз рӯи калиди индекс мураттаб карда дар диск нигоҳ дошта шавад. Омили кластерӣ, ки ба шумораи сатрҳо наздик аст, нишон медиҳад, ки сатрҳо дар блокҳои пойгоҳи додаҳо дар робита ба калиди индекс ба таври тасодуфӣ пароканда шудаанд. Агар пойгоҳи додаҳо сканкунии пурраи ҷадвалро иҷро кунад, он гоҳ базаи маълумот сатрҳоро бо ягон тартиби мураттабшуда аз рӯи ин калиди индекс дарёфт намекунад.

Дар ин ҳолат, маълумот ба таври идеалӣ мураттаб карда мешавад, бинобар ин, омили кластеркунӣ ба шумораи блокҳои ишғолшудаи ҷадвал баробар ё наздик хоҳад буд. Барои андозаи стандартии блоки 8 килобайт, шумо метавонед интизор шавед, ки тақрибан ҳазор арзиши рақами танг ба як блок мувофиқат мекунанд, аз ин рӯ шумораи блокҳо ва дар натиҷа омили кластерӣ хоҳад буд. тақрибан даҳҳо.

Дар кадом арзишҳои N скрипти зерин дар пойгоҳи додаҳои муқаррарӣ бо танзимоти стандартӣ бомуваффақият иҷро карда мешавад?

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

Ҷавоб диҳедМувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 11.2):

Маҳдудиятҳои мантиқии пойгоҳи додаҳо

Банди
Навъи лимити
Арзиши маҳдуд

нишондиҳандаҳои
Андозаи умумии сутуни индексатсияшуда
75% андозаи блоки пойгоҳи додаҳо бо назардошти хароҷоти изофӣ

Ҳамин тариқ, ҳаҷми умумии сутунҳои индексатсияшуда набояд аз 6Kb зиёд бошад. Оянда чӣ рӯй медиҳад, аз рамзгузории асосии интихобшуда вобаста аст. Барои рамзгузории AL32UTF8 як аломат метавонад ҳадди аксар 4 байтро ишғол кунад, аз ин рӯ дар бадтарин сенария тақрибан 6 аломат ба 1500 килобайт мувофиқат мекунад. Аз ин рӯ, Oracle эҷоди индексро дар N = 400 манъ мекунад (вақте ки дарозии калиди бадтарин 1600 аломат * 4 байт + дарозии rowid аст), дар ҳоле ки дар N = 200 (ё камтар) эҷод кардани индекс бе мушкилот кор хоҳад кард.

Оператори INSERT бо ишораи APPEND барои бор кардани маълумот дар реҷаи мустақим тарҳрезӣ шудааст. Агар он ба ҷадвале, ки триггер дар он овезон аст, татбиқ карда шавад, чӣ мешавад?

  • Маълумот дар реҷаи мустақим бор карда мешавад, триггер мувофиқи интизорӣ кор мекунад
  • Маълумот дар реҷаи мустақим бор карда мешавад, аммо триггер иҷро намешавад
  • Маълумот дар реҷаи муқаррарӣ бор карда мешавад, триггер тавре кор мекунад, ки бояд бошад
  • Маълумот дар реҷаи муқаррарӣ бор карда мешавад, аммо триггер иҷро намешавад
  • Маълумот бор карда намешавад, хатогӣ сабт мешавад

Ҷавоб диҳедАслан, ин бештар саволи мантиқ аст. Барои пайдо кардани ҷавоби дуруст, ман модели зеринро пешниҳод мекунам:

  1. Воридшавӣ дар реҷаи мустақим тавассути ташаккули мустақими блоки додаҳо, канорагирӣ аз муҳаррики SQL, ки суръати баландро таъмин мекунад, анҷом дода мешавад. Ҳамин тариқ, таъмини иҷрои триггер хеле душвор аст, агар ғайриимкон бошад ва дар ин ҳеҷ маъное вуҷуд надорад, зеро он ҳоло ҳам воридшавиро ба таври куллӣ суст мекунад.
  2. Иҷро накардани триггер ба он оварда мерасонад, ки агар маълумот дар ҷадвал якхела бошад, ҳолати базаи маълумот дар маҷмӯъ (ҷадвалҳои дигар) аз реҷаи ворид кардани ин маълумот вобаста хоҳад буд. Ин бешубҳа якпорчагии маълумотро вайрон мекунад ва онро ҳамчун роҳи ҳалли истеҳсолот истифода бурдан мумкин нест.
  3. Қобилияти иҷро накардани амалиёти дархостшуда одатан ҳамчун хато ҳисоб карда мешавад. Аммо дар ин љо бояд дар хотир дошт, ки APPEND як ишора аст ва мантиќи умумии ишорањо ин аст, ки агар имкон бошад, онњо ба инобат гирифта мешаванд, вале агар не, оператор бе назардошти ишора ба иљро мешавад.

Ҳамин тавр, ҷавоби интизоршуда аст маълумот дар ҳолати муқаррарӣ (SQL) бор карда мешавад, триггер оташ мегирад.

Мувофиқи ҳуҷҷатҳои Oracle (иқтибос аз 8.04):

Вайрон кардани маҳдудиятҳо боиси он мегардад, ки изҳорот бо истифода аз роҳи муқаррарии воридкунӣ бидуни огоҳӣ ё паёмҳои хатогӣ ба таври пай дар пай иҷро шавад. Истисно ин маҳдудияти дастрасӣ ба изҳоротҳо ба як ҷадвал дар як транзаксия мебошад, ки метавонад паёмҳои хатогиро ба вуҷуд орад.
Масалан, агар дар ҷадвал триггерҳо ё якпорчагии истинод мавҷуд бошанд, пас ҳангоми кӯшиши истифодаи INSERT-и мустақим (сериалӣ ё мувозӣ), инчунин ишора ё банди PARALLEL, агар мавҷуд бошад, ишораи APPEND нодида гирифта мешавад.

Вақте ки скрипти зерин иҷро мешавад, чӣ мешавад?

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

  • Иҷрои бомуваффақият
  • Нокомӣ аз сабаби хатогии синтаксис
  • Хатогӣ: Муомилоти мустақил эътибор надорад
  • Хатогии марбут ба зиёд кардани ҳадди ниҳоии занги занг
  • Хатогии вайронкунии калиди хориҷӣ
  • Хатогии марбут ба қулфҳо

Ҷавоб диҳедҶадвал ва триггер комилан дуруст сохта шудаанд ва ин амалиёт набояд ба мушкилот оварда расонад. Муомилоти автономӣ дар триггер низ иҷозат дода мешавад, вагарна сабти ном, масалан, имконнопазир аст.

Пас аз ворид кардани сатри аввал, тирандозии бомуваффақияти триггер боиси гузоштани сатри дуюм мегардад, ки боиси дубора оташ задани триггер, ворид кардани сатри сеюм ва ғайра мешавад, то он даме, ки изҳорот аз сабаби зиёд шудани ҳадди ниҳоии лонаҳои зангҳо ноком шавад. Бо вуҷуди ин, боз як нуқтаи нозук ба бозӣ меояд. Ҳангоми иҷро шудани триггер, ӯҳдадорӣ барои сабти аввалини воридшуда ҳанӯз ба анҷом нарасидааст. Аз ин рӯ, триггере, ки дар амалиёти худмухтор иҷро мешавад, кӯшиш мекунад, ки ба ҷадвал сатреро ворид кунад, ки ба калиди хориҷӣ ба сабти ҳанӯз содирнашуда ишора мекунад. Ин боиси интизорӣ мегардад (амалиёти автономӣ интизори анҷом додани транзаксияи асосӣ аст, то бубинад, ки оё он метавонад маълумотро ворид кунад) ва ҳамзамон транзаксияи асосӣ интизор мешавад, ки транзаксияи мустақил пас аз триггер идома ёбад. Бунбаст ба амал меояд ва дар натиҷа, муомилоти мустақил бо сабабҳои марбут ба қуфлҳо бекор карда мешавад..

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Душвор буд?

  • Мисли ду ангушт ман дарҳол ҳама чизро дуруст қарор додам.

  • Аслан не, ман дар як чанд савол хато кардам.

  • Ман нисфи онро дуруст ҳал кардам.

  • Ман ҷавобро ду маротиба тахмин кардам!

  • Ман дар шарҳҳо менависам

14 корбар овоз доданд. 10 корбар худдорӣ карданд.

Манбаъ: will.com

Илова Эзоҳ