Ni atẹle ni awọn igbesẹ ti Highload++ Siberia 2019 - Awọn iṣẹ-ṣiṣe 8 lori Oracle

Hi!

Ni Oṣu Karun ọjọ 24-25, apejọ Highload ++ Siberia 2019 ti waye ni Novosibirsk paapaa iroyin “Awọn apoti isura infomesonu Oracle (CDB/PDB) ati lilo ilowo wọn fun idagbasoke sọfitiwia”, a yoo ṣe atẹjade ẹya ọrọ kan diẹ sẹhin. O dara, o ṣeun olegbunin fún ètò àjọ náà, àti fún gbogbo àwọn tó wá.

Ni atẹle ni awọn igbesẹ ti Highload++ Siberia 2019 - Awọn iṣẹ-ṣiṣe 8 lori Oracle
Ninu ifiweranṣẹ yii, a yoo fẹ lati pin pẹlu rẹ awọn iṣoro ti a ni ni agọ wa ki o le ṣe idanwo imọ Oracle rẹ. Ni isalẹ gige ni awọn iṣoro 8, awọn aṣayan idahun ati alaye.

Kini iye ọkọọkan ti o pọju ti a yoo rii bi abajade ti ṣiṣe iwe afọwọkọ atẹle naa?

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
  • Rara, aṣiṣe yoo wa

IdahunGẹgẹbi iwe Oracle (ti a sọ lati 8.1.6):
Laarin alaye SQL ẹyọkan, Oracle yoo pọ si ọkọọkan ni ẹẹkan ni ọna kan. Ti alaye kan ba ni itọkasi diẹ sii ju ọkan lọ si NEXTVAL fun ọkọọkan kan, Oracle ṣe afikun ọkọọkan ni ẹẹkan ati da iye kanna pada fun gbogbo awọn iṣẹlẹ ti NEXTVAL. Ti alaye kan ba ni awọn itọkasi si CURRVAL ati NEXTVAL mejeeji, Oracle ṣe afikun ọkọọkan ati da iye kanna pada fun mejeeji CURRVAL ati NEXTVAL laibikita aṣẹ wọn laarin alaye naa.

Ni ọna yi, iye ti o pọ julọ yoo ṣe deede si nọmba awọn laini, iyẹn jẹ 5.

Awọn ori ila melo ni yoo wa ninu tabili bi abajade ti nṣiṣẹ iwe afọwọkọ atẹle naa?

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

IdahunGẹgẹbi iwe Oracle (ti a sọ lati 11.2):

Ṣaaju ṣiṣe eyikeyi alaye SQL, Oracle samisi aaye ipamọ ti ko tọ (ko si fun ọ). Lẹhinna, ti alaye naa ba kuna, Oracle yiyi pada laifọwọyi ati da koodu aṣiṣe to wulo pada si SQLCODE ni SQLCA. Fun apẹẹrẹ, ti alaye INSERT ba fa aṣiṣe nipa igbiyanju lati fi iye ẹda-iwe sii sinu atọka alailẹgbẹ, alaye naa yoo yi pada.

Pipe HP lati ọdọ alabara ni a tun gbero ati ni ilọsiwaju bi alaye kan. Nitorinaa, ipe HP akọkọ pari ni aṣeyọri, ti fi awọn igbasilẹ mẹta sii; ipe HP keji dopin pẹlu aṣiṣe kan ati yipo igbasilẹ kẹrin ti o ṣakoso lati fi sii; ipe kẹta kuna, ati pe awọn igbasilẹ mẹta wa ninu tabili.

Awọn ori ila melo ni yoo wa ninu tabili bi abajade ti nṣiṣẹ iwe afọwọkọ atẹle naa?

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

IdahunGẹgẹbi iwe Oracle (ti a sọ lati 11.2):

Idiwọn ayẹwo jẹ ki o pato ipo kan ti ila kọọkan ninu tabili gbọdọ ni itẹlọrun. Lati ni itẹlọrun idiwọ naa, ila kọọkan ninu tabili gbọdọ ṣe ipo boya TÒÓTỌ tabi aimọ (nitori asan). Nigbati Oracle ṣe iṣiro ipo idiwọ ayẹwo fun ila kan pato, eyikeyi awọn orukọ ọwọn ninu ipo tọka si awọn iye ọwọn ni ọna yẹn.

Nitorinaa, asan iye yoo kọja ayẹwo naa, ati pe bulọọki ailorukọ yoo ṣiṣẹ ni aṣeyọri titi igbiyanju lati fi iye naa sii 3. Lẹhin eyi, bulọọki mimu aṣiṣe yoo mu imukuro kuro, ko si ipadasẹhin yoo waye, ati awọn ila mẹrin yoo wa ni osi ni tabili pẹlu awọn iye 1, asan, 2 ati asan lẹẹkansi.

Awọn orisii awọn iye wo ni yoo gba iye aaye kanna ni bulọọki naa?

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 ati X
  • B ati Y
  • C ati K
  • C ati Z
  • K ati Z
  • Emi ati J
  • J ati X
  • Gbogbo akojọ

IdahunEyi ni awọn abajade lati inu iwe-ipamọ (12.1.0.2) lori titoju awọn oniruuru data ni Oracle.

CHAR Data Iru
Iru data CHAR ni pato okun ohun kikọ ipari-ipari ninu ṣeto ohun kikọ data. O pato eto kikọ ibi ipamọ data nigbati o ṣẹda aaye data rẹ. Oracle ṣe idaniloju pe gbogbo awọn iye ti o fipamọ sinu iwe CHAR kan ni gigun ti a ṣalaye nipasẹ iwọn ni awọn atunmọ ipari ti a yan. Ti o ba fi iye kan sii ti o kuru ju ipari ọwọn lọ, lẹhinna Oracle òfo-paadi iye si ipari iwe.

VARCHAR2 Data Iru
Iru data VARCHAR2 tọkasi okun ohun kikọ gigun-ipari ninu eto kikọ data. O pato eto kikọ ibi ipamọ data nigbati o ṣẹda aaye data rẹ. Oracle tọju iye ohun kikọ kan sinu iwe VARCHAR2 gangan bi o ṣe sọ pato rẹ, laisi eyikeyi padding ofo, ti iye ko ba kọja ipari ti iwe naa.

NOMBA Data Iru
Iru data NUMBER n tọju odo bi daradara bi awọn nọmba ti o wa titi rere ati odi pẹlu awọn iye pipe lati 1.0 x 10-130 si ṣugbọn kii ṣe pẹlu 1.0 x 10126. Ti o ba pato ikosile isiro ti iye rẹ ni iye pipe ti o tobi ju tabi dogba si 1.0 x 10126, lẹhinna Oracle da aṣiṣe kan pada. Iye NỌMBA kọọkan nilo lati 1 si 22 baiti. Ti o ba gba eyi sinu akọọlẹ, iwọn iwe ni awọn baiti fun iye data nomba kan pato NUMBER(p), nibiti p jẹ deede ti iye ti a fun, le ṣe iṣiro nipa lilo agbekalẹ atẹle: YIKA((ipari(p)+s)/2))+1 ibi ti s dogba odo ti o ba ti awọn nọmba jẹ rere, ati s dogba 1 ti o ba ti nọmba jẹ odi.

Ni afikun, jẹ ki a mu yiyan lati inu iwe nipa titoju awọn iye Null.

Asan ni isansa iye kan ninu iwe kan. Nulls tọkasi sonu, aimọ, tabi data ti ko wulo. Nulls ti wa ni ipamọ ni ibi ipamọ data ti wọn ba ṣubu laarin awọn ọwọn pẹlu awọn iye data. Ni awọn iṣẹlẹ wọnyi, wọn nilo 1 baiti lati tọju ipari ti iwe naa (odo). Titọpa awọn asan ni ọna kan ko nilo ibi ipamọ nitori akọsori ila tuntun n ṣe ifihan pe awọn ọwọn to ku ni ila ti tẹlẹ jẹ asan. Fun apẹẹrẹ, ti awọn ọwọn mẹta ti o kẹhin ti tabili jẹ asan, lẹhinna ko si data ti o fipamọ fun awọn ọwọn wọnyi.

Da lori awọn data wọnyi, a kọ ero. A ro pe ibi ipamọ data naa nlo fifi koodu AL32UTF8. Ninu fifi koodu yii, awọn lẹta Russian yoo gba awọn baiti 2.

1) A ati X, iye aaye a 'Y' gba 1 baiti, iye aaye x 'D' gba 2 baiti
2) B ati Y, 'Vasya' ni b iye yoo wa ni fifẹ pẹlu awọn alafo to 10 kikọ ati ki o yoo gba 14 baiti, 'Vasya' ni d yoo gba 8 baiti.
3) C ati K. Awọn aaye mejeeji ni iye NULL, lẹhin wọn awọn aaye pataki wa, nitorina wọn gba 1 baiti.
4) C ati Z. Awọn aaye mejeeji ni iye NULL, ṣugbọn aaye Z ni o kẹhin ninu tabili, nitorina ko gba aaye (0 baiti). Aaye C gba 1 baiti.
5) K ati Z. Iru si ti tẹlẹ nla. Iye ninu aaye K gba 1 baiti, ni Z – 0.
6) I ati J. Gẹgẹbi iwe-ipamọ, awọn iye mejeeji yoo gba awọn baiti 2. A ṣe iṣiro gigun nipa lilo agbekalẹ ti o gba lati inu iwe: yika ((1 + 0)/2) +1 = 1 + 1 = 2.
7) J ati X. Iye ni aaye J yoo gba 2 baiti, iye ti o wa ni aaye X yoo gba 2 baiti.

Lapapọ, awọn aṣayan to pe ni: C ati K, I ati J, J ati X.

Kini isunmọ yoo jẹ ipin iṣupọ ti atọka 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);

  • Nipa mewa
  • Nipa awọn ọgọọgọrun
  • Nipa egbegberun
  • Nipa mewa ti egbegberun

IdahunGẹgẹbi iwe Oracle (ti a sọ lati 12.1):

Fun atọka B-igi, ifosiwewe iṣupọ atọka ṣe iwọn awọn akojọpọ ti ara ti awọn ori ila ni ibatan si iye atọka kan.

Okunfa iṣupọ atọka ṣe iranlọwọ fun olumudara lati pinnu boya ọlọjẹ atọka tabi ọlọjẹ tabili kikun jẹ daradara siwaju sii fun awọn ibeere kan). Idiwọn iṣupọ kekere kan tọkasi ọlọjẹ atọka ti o munadoko.

Okunfa iṣupọ ti o sunmọ nọmba awọn bulọọki ninu tabili tọkasi pe awọn ori ila ti wa ni aṣẹ ni ti ara ni awọn bulọọki tabili nipasẹ bọtini atọka. Ti ibi-ipamọ data ba ṣe ọlọjẹ tabili ni kikun, lẹhinna aaye data duro lati gba awọn ori ila pada bi wọn ti wa ni ipamọ lori disiki lẹsẹsẹ nipasẹ bọtini atọka. Okunfa iṣupọ ti o sunmọ nọmba awọn ori ila tọkasi pe awọn ori ila ti tuka laileto kọja awọn bulọọki data data ni ibatan si bọtini atọka. Ti ibi-ipamọ data ba ṣe ọlọjẹ tabili ni kikun, lẹhinna aaye data ko ni gba awọn ori ila pada ni eyikeyi tito lẹsẹsẹ nipasẹ bọtini atọka yii.

Ni ọran yii, data ti wa ni lẹsẹsẹ ni pipe, nitorinaa ifosiwewe iṣupọ yoo dogba si tabi sunmọ nọmba awọn bulọọki ti o tẹdo ninu tabili. Fun iwọn bulọọki boṣewa ti 8 kilobytes, o le nireti pe nipa ẹgbẹrun awọn iye nọmba dín yoo baamu si bulọọki kan, nitorinaa nọmba awọn bulọọki, ati bi abajade, ipin iṣupọ yoo jẹ. nipa mewa.

Ni awọn iye wo ti N yoo ṣe iwe afọwọkọ atẹle ni aṣeyọri ni ibi ipamọ data deede pẹlu awọn eto boṣewa?

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

IdahunGẹgẹbi iwe Oracle (ti a sọ lati 11.2):

Mogbonwa aaye data

ohun
Iru Ifilelẹ
Idiyele iye

Awọn itọkasi
Lapapọ iwọn ọwọn itọka
75% ti iwọn bulọọki data iyokuro diẹ ninu awọn oke

Nitorinaa, apapọ iwọn awọn ọwọn itọka ko yẹ ki o kọja 6Kb. Ohun ti o ṣẹlẹ ni atẹle da lori fifi koodu ipilẹ ti o yan. Fun fifi koodu AL32UTF8, ohun kikọ kan le gba iwọn awọn baiti 4 ti o pọju, nitorinaa ninu oju iṣẹlẹ ti o buruju, awọn ohun kikọ 6 yoo baamu si 1500 kilobytes. Nitorinaa, Oracle yoo kọ idasilẹ ẹda atọka ni N = 400 (nigbati ipari bọtini ọran ti o buru julọ jẹ awọn kikọ 1600 * 4 baiti + gigun gigun), lakoko ni N = 200 (tabi kere si) ṣiṣẹda atọka yoo ṣiṣẹ laisi awọn iṣoro.

Oniṣẹ INSERT pẹlu itọka APPEND jẹ apẹrẹ lati gbe data ni ipo taara. Ohun ti o ṣẹlẹ ti o ba ti o ti wa ni loo si awọn tabili lori eyi ti awọn okunfa kọorí?

  • Awọn data yoo wa ni ti kojọpọ ni taara mode, awọn okunfa yoo ṣiṣẹ bi o ti ṣe yẹ
  • Awọn data yoo wa ni ti kojọpọ ni taara mode, ṣugbọn awọn okunfa yoo wa ko le ṣe
  • Awọn data yoo wa ni ti kojọpọ ni mora mode, awọn okunfa yoo ṣiṣẹ bi o ti yẹ
  • Awọn data yoo wa ni ti kojọpọ ni mora mode, ṣugbọn awọn okunfa yoo wa ko le ṣe
  • Awọn data yoo wa ko le kojọpọ, ohun ašiše yoo wa ni gba silẹ

IdahunNi ipilẹ, eyi jẹ ibeere diẹ sii ti ọgbọn. Lati wa idahun ti o pe, Emi yoo daba awoṣe ero wọnyi:

  1. Fi sii ni ipo taara ni a ṣe nipasẹ dida taara ti bulọọki data kan, lilọ kiri ẹrọ SQL, eyiti o ṣe idaniloju iyara giga. Nitorinaa, aridaju ipaniyan ti okunfa naa nira pupọ, ti ko ba ṣeeṣe, ati pe ko si aaye ninu eyi, nitori pe yoo tun fa fifalẹ fifi sii.
  2. Ikuna lati ṣiṣẹ okunfa yoo yorisi otitọ pe, ti data ti o wa ninu tabili jẹ kanna, ipo data data lapapọ (awọn tabili miiran) yoo dale lori ipo ti a ti fi data yii sii. Eyi yoo han gbangba pa iduroṣinṣin data run ati pe a ko le lo bi ojutu kan ni iṣelọpọ.
  3. Ailagbara lati ṣe iṣẹ ṣiṣe ti o beere ni gbogbogbo ṣe itọju bi aṣiṣe. Ṣugbọn nibi o yẹ ki a ranti pe APPEND jẹ ofiri, ati imọran gbogbogbo ti awọn amọran ni pe wọn gba sinu apamọ ti o ba ṣeeṣe, ṣugbọn bi ko ba ṣe bẹ, a ṣe oniṣẹ ẹrọ laisi akiyesi ifọkansi naa.

Nitorinaa idahun ti a nireti jẹ awọn data yoo wa ni ti kojọpọ ni deede (SQL) mode, awọn okunfa yoo sana.

Gẹgẹbi iwe Oracle (ti a sọ lati 8.04):

Awọn irufin awọn ihamọ yoo fa ki alaye naa ṣiṣẹ ni tẹlentẹle, ni lilo ọna ifibọ aṣa, laisi awọn ikilọ tabi awọn ifiranṣẹ aṣiṣe. Iyatọ jẹ ihamọ lori awọn alaye ti n wọle si tabili kanna diẹ sii ju ẹẹkan lọ ni idunadura kan, eyiti o le fa awọn ifiranṣẹ aṣiṣe.
Fun apẹẹrẹ, ti awọn okunfa tabi iṣotitọ itọkasi wa lori tabili, lẹhinna ofiri APPEND yoo jẹ kọbikita nigbati o gbiyanju lati lo fifuye taara INSERT (tẹlentẹle tabi ni afiwe), bakanna bi itọka PARALLEL tabi gbolohun ọrọ, ti eyikeyi.

Kini yoo ṣẹlẹ nigbati iwe afọwọkọ atẹle ba ti ṣiṣẹ?

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

  • Ipari aṣeyọri
  • Ikuna nitori aṣiṣe sintasi
  • Aṣiṣe: Idunadura Aladani Ko wulo
  • Aṣiṣe ti o ni ibatan si ti o pọju tiwon ipe ti o pọju
  • Aṣiṣe Iwa-ipa-ipa ajeji
  • Aṣiṣe ti o ni ibatan si awọn titiipa

IdahunTabili ati okunfa ni a ṣẹda ni deede ati pe iṣiṣẹ yii ko yẹ ki o ja si awọn iṣoro. Awọn iṣowo adase ni okunfa tun gba laaye, bibẹẹkọ gedu kii yoo ṣee ṣe, fun apẹẹrẹ.

Lẹhin ti o ti fi ila akọkọ sii, aṣeyọri ti o nfa fifa yoo jẹ ki a fi sii ila keji, ti o mu ki okunfa naa tun ina lẹẹkansi, fifi sii ila kẹta, ati bẹbẹ lọ titi ti alaye naa yoo kuna nitori ti o pọju itẹ-ẹiyẹ awọn ipe. Sibẹsibẹ, aaye arekereke miiran wa sinu ere. Ni akoko ti o ti ṣiṣẹ okunfa naa, adehun ko tii ti pari fun igbasilẹ akọkọ ti a fi sii. Nitorinaa, okunfa kan ti n ṣiṣẹ ni idunadura adase kan gbiyanju lati fi sii sinu tabili ni ila kan ti o tọka bọtini ajeji si igbasilẹ ti ko tii ṣe. Eyi ṣe abajade ni idaduro (idunadura adase duro fun idunadura akọkọ lati ṣe lati rii boya o le fi data sii) ati ni akoko kanna idunadura akọkọ nduro fun iṣowo adase lati tẹsiwaju ṣiṣẹ lẹhin ti o nfa. Titiipa kan waye ati, bi abajade, idunadura adase ti fagile nitori awọn idi ti o ni ibatan si awọn titiipa.

Awọn olumulo ti o forukọsilẹ nikan le kopa ninu iwadi naa. wọle, Jowo.

O je soro lati?

  • Bi awọn ika ọwọ meji, Mo pinnu lẹsẹkẹsẹ ohun gbogbo ni deede.

  • Kii ṣe looto, Mo jẹ aṣiṣe lori awọn ibeere meji kan.

  • Mo yanju idaji rẹ ni deede.

  • Mo gboju idahun lemeji!

  • Emi yoo kọ ninu awọn asọye

14 olumulo dibo. 10 olumulo abstained.

orisun: www.habr.com

Fi ọrọìwòye kun