Bin sawun Highload++ Siberiya 2019 - ayyuka 8 akan Oracle

Sannu!

A ranar 24-25 ga Yuni, an gudanar da taron Highload++ Siberiya 2019 a Novosibirsk. rahoto "Tsarin bayanan kwantena na Oracle (CDB/PDB) da kuma amfani da su don haɓaka software", za mu buga sigar rubutu kaɗan kaɗan. Yayi sanyi, na gode olegbunin ga kungiyar, da kuma duk wanda ya zo.

Bin sawun Highload++ Siberiya 2019 - ayyuka 8 akan Oracle
A cikin wannan sakon, muna so mu raba tare da ku matsalolin da muke da su a rumfarmu don ku iya gwada ilimin ku na Oracle. A ƙasa yanke akwai matsaloli 8, zaɓuɓɓukan amsa da bayani.

Menene matsakaicin ƙimar jeri da za mu gani a sakamakon aiwatar da rubutun mai zuwa?

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'a, za a yi kuskure

AmsaDangane da takaddun Oracle (wanda aka nakalto daga 8.1.6):
A cikin bayanin SQL guda ɗaya, Oracle zai ƙara jerin sau ɗaya kawai a jere. Idan sanarwa ta ƙunshi tunani fiye da ɗaya zuwa NEXTVAL don jerin gwano, Oracle yana ƙara jerin sau ɗaya kuma ya dawo da ƙimar ɗaya ga duk abubuwan da suka faru na NEXTVAL. Idan sanarwa ta ƙunshi nassoshi ga CURRVAL da NEXTVAL, Oracle yana ƙara jerin kuma ya dawo da ƙima ɗaya ga duka CURRVAL da NEXTVAL ba tare da la'akari da odarsu a cikin bayanin ba.

Ta haka ne, Matsakaicin ƙimar zai dace da adadin layukan, wato 5.

Layuka nawa ne za su kasance a cikin tebur sakamakon gudanar da rubutun mai zuwa?

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

AmsaDangane da takaddun Oracle (wanda aka nakalto daga 11.2):

Kafin aiwatar da duk wata sanarwa ta SQL, Oracle yana nuna madaidaicin wurin ajiyewa (ba a gare ku). Sannan, idan bayanin ya gaza, Oracle yana mirgine ta ta atomatik kuma ya dawo da lambar kuskuren da ta dace zuwa SQLCODE a cikin SQLCA. Misali, idan bayanin INSERT ya haifar da kuskure ta ƙoƙarin saka ƙima mai kwafi a cikin fihirisar musamman, za a mayar da bayanin baya.

Ana kuma la'akari da kiran HP daga abokin ciniki kuma ana sarrafa shi azaman sanarwa guda ɗaya. Don haka, kiran farko na HP ya kammala cikin nasara, bayan shigar da bayanai guda uku; Kira na biyu na HP yana ƙare da kuskure kuma ya mayar da rikodin na huɗu wanda ya yi nasarar sakawa; kira na uku ya kasa, kuma akwai bayanai guda uku a cikin tebur.

Layuka nawa ne za su kasance a cikin tebur sakamakon gudanar da rubutun mai zuwa?

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

AmsaDangane da takaddun Oracle (wanda aka nakalto daga 11.2):

Ƙuntataccen bincike zai baka damar ƙididdige yanayin da kowane jere a cikin tebur dole ne ya gamsar. Don gamsar da ƙuntatawa, kowane jere a cikin tebur dole ne ya sanya yanayin ko dai GASKIYA ko ba a sani ba (saboda maras kyau). Lokacin da Oracle ya kimanta yanayin ƙuntatawar rajista don wani jeri na musamman, kowane sunaye a cikin yanayin yana nufin ƙimar ginshiƙi a waccan layin.

Don haka, ƙimar null za ta wuce rajistan, kuma za a aiwatar da block ɗin da ba a san shi ba cikin nasara har sai an yi ƙoƙarin saka ƙimar 3. Bayan haka, toshewar sarrafa kuskuren zai share fage, ba za a sake dawowa ba, kuma Za a bar layuka huɗu a cikin teburin tare da dabi'u 1, null, 2 da maras sake.

Wadanne nau'i-nau'i na dabi'u ne za su ɗauki adadin sarari ɗaya a cikin toshe?

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 da X
  • B da Y
  • C da K
  • C da Z
  • K da Z
  • I da J
  • J da X
  • Duk da aka jera

AmsaAnan akwai tsattsauran ra'ayi daga takaddun (12.1.0.2) akan adana nau'ikan bayanai daban-daban a cikin Oracle.

Nau'in Bayanan CHAR
Nau'in bayanan CHAR yana ƙayyadad da tsayayyen madauri mai tsayi a cikin saitin bayanan bayanan. Kuna ƙayyade saitin bayanan bayanan lokacin da kuke ƙirƙirar bayananku. Oracle yana tabbatar da cewa duk ƙimar da aka adana a cikin ginshiƙi na CHAR suna da tsayin da aka ƙayyade ta girman a cikin zaɓin tsawon tatsuniyoyi. Idan ka saka ƙima wacce ta fi tsayin shafi, to Oracle blank-pads yana darajar zuwa tsayin shafi.

Nau'in Bayanai na VARCHAR2
Nau'in bayanan VARCHAR2 yana ƙayyadaddun kirtani mai tsayi mai canzawa a cikin saitin halayen bayanan. Kuna ƙayyade saitin bayanan bayanan lokacin da kuke ƙirƙirar bayananku. Oracle yana adana ƙimar hali a cikin ginshiƙi na VARCHAR2 daidai kamar yadda kuka ƙididdige shi, ba tare da komai ba, muddin darajar ba ta wuce tsayin ginshiƙi ba.

Nau'in Bayanan NUMBER
Nau'in bayanan NUMBER yana adana sifili haka kuma tabbataccen lambobi masu inganci da mara kyau tare da cikakkiyar ƙima daga 1.0 x 10-130 zuwa amma ban haɗa da 1.0 x 10126 ba. Idan ka ƙididdige bayanin lissafi wanda ƙimarsa tana da cikakkiyar ƙima sama da ko daidai. 1.0 x 10126, sannan Oracle ya dawo da kuskure. Kowace ƙimar NUMBER tana buƙatar daga 1 zuwa 22 bytes. Yin la'akari da wannan, girman ginshiƙi a cikin bytes don takamaiman ƙimar bayanan lamba NUMBER(p), inda p shine madaidaicin ƙimar da aka bayar, ana iya ƙididdige shi ta amfani da dabara mai zuwa: ZAGAYA ((tsawon (p)+s)/2))+1 inda s yayi daidai sifili idan lambar ta tabbata, kuma s daidai 1 idan lambar ta kasance mara kyau.

Bugu da kari, bari mu dauki wani yanki daga cikin takaddun game da adana ƙimar Null.

Marasa shi ne rashin ƙima a cikin ginshiƙi. Nulls suna nuna ɓacewa, ba a sani ba, ko bayanan da ba su aiki ba. Ana adana nulls a cikin bayanan bayanai idan sun faɗi tsakanin ginshiƙai masu ƙimar bayanai. A cikin waɗannan lokuta, suna buƙatar 1 byte don adana tsawon ginshiƙi (sifili). Matsakaicin ɓarna a jere yana buƙatar ajiya saboda sabon jigon layi yana nuna alamun cewa ragowar ginshiƙan a jere na baya ba su da tushe. Misali, idan ginshiƙai uku na ƙarshe na tebur ba su da amfani, to ba a adana bayanai don waɗannan ginshiƙan.

Dangane da waɗannan bayanan, muna gina tunani. Muna ɗauka cewa bayanan yana amfani da rufaffiyar AL32UTF8. A cikin wannan rikodin, haruffan Rasha za su mamaye 2 bytes.

1) A da X, darajar filin a 'Y' yana ɗaukar 1 byte, ƙimar filin x 'D' yana ɗaukar bytes 2
2) B da Y, 'Vasya' a cikin b darajar za ta kasance tare da sarari har haruffa 10 kuma za su ɗauki 14 bytes, 'Vasya' a d zai ɗauki 8 bytes.
3) C da K. Dukansu filayen suna da darajar NULL, bayan su akwai filaye masu mahimmanci, don haka sun mamaye 1 byte.
4) C da Z. Dukansu filayen suna da darajar NULL, amma filin Z shine na ƙarshe a cikin tebur, don haka baya ɗaukar sarari (0 bytes). Filin C ya mamaye 1 byte.
5) K da Z. Kwatankwacin lamarin da ya gabata. Ƙimar da ke cikin filin K ta ƙunshi 1 byte, a cikin Z - 0.
6) I da J. Bisa ga takardun, duka dabi'u za su ɗauki 2 bytes. Muna lissafin tsawon ta amfani da dabarar da aka karɓa daga takaddun: zagaye ((1 + 0)/2) +1 = 1 + 1 = 2.
7) J da X. Ƙimar da ke cikin filin J zai ɗauki 2 bytes, ƙimar da ke cikin filin X zai ɗauki 2 bytes.

Gabaɗaya, zaɓuɓɓukan da suka dace sune: C da K, I da J, J da X.

Yaya kusan zai zama ma'anar tari na T_I index?

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

  • Game da goma
  • Kimanin ɗaruruwa
  • Kimanin dubbai
  • Kimanin dubun dubatar

AmsaDangane da takaddun Oracle (wanda aka nakalto daga 12.1):

Don fihirisar itacen B, ma'aunin tari na fihirisa yana auna haɗawar layuka na zahiri dangane da ƙimar fihirisa.

Fa'idodin tari mai ƙididdigewa yana taimaka wa mai ingantawa yanke shawarar ko duban fihirisa ko cikakken sikanin tebur ya fi dacewa ga wasu tambayoyi). Ƙananan ma'aunin tari yana nuna ingantaccen sikanin fihirisa.

Maɓalli mai tari wanda ke kusa da adadin tubalan a cikin tebur yana nuna cewa an yi odar layuka a zahiri a cikin tubalan tebur ta hanyar maɓalli. Idan ma'aunin bayanai ya yi cikakken sikanin tebur, to, ma'adanin yana son maido da layuka kamar yadda ake adana su a faifai da aka jera su ta hanyar maɓalli. Alamar tari da ke kusa da adadin layuka yana nuna cewa layuka sun warwatse ba da gangan ba a cikin toshe bayanan bayanai dangane da maɓalli. Idan ma'aunin bayanai ya yi cikakken sikanin tebur, to, ma'aunin bayanai ba zai dawo da layuka ba a kowane tsari da aka tsara ta wannan maþallin fihirisar.

A wannan yanayin, bayanan an tsara su sosai, don haka ma'aunin tari zai zama daidai ko kusa da adadin tubalan da aka mamaye a cikin tebur. Don daidaitaccen girman girman 8 kilobytes, zaku iya tsammanin cewa kusan ƙimar kunkuntar lamba dubu za su shiga cikin toshe ɗaya, don haka adadin tubalan, kuma a sakamakon haka, ƙimar tari zai kasance. kusan goma.

A wace ƙimar N za a iya aiwatar da rubutun mai zuwa cikin nasara a cikin bayanan yau da kullun tare da daidaitattun saitunan?

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

AmsaDangane da takaddun Oracle (wanda aka nakalto daga 11.2):

Iyakokin Bayanan Bayanai

Item
Nau'in Iyaka
Iyakance Ƙimar

Sharuɗɗa
Jimlar girman ginshiƙi mai maƙasudi
Kashi 75% na girman toshe bayanan bayanai ban da wasu sama da ƙasa

Don haka, jimlar girman ginshiƙai bai kamata ya wuce 6Kb ba. Abin da zai faru na gaba ya dogara da zaɓaɓɓen rufaffiyar tushe. Don shigar da AL32UTF8, haruffa ɗaya na iya ɗaukar iyakar 4 bytes, don haka a cikin mafi munin yanayi, kusan haruffa 6 zasu dace cikin kilobytes 1500. Saboda haka, Oracle zai hana ƙirƙirar fihirisar a N = 400 (lokacin da mafi munin tsawon maɓalli shine haruffa 1600 * 4 bytes + tsayin layi), yayin da a N = 200 (ko ƙasa da haka) ƙirƙirar index zai yi aiki ba tare da matsaloli ba.

An tsara ma'aikacin INSERT tare da alamar APPEND don loda bayanai a yanayin kai tsaye. Menene zai faru idan an shafa shi a kan teburin da abin fararwa ya rataye a kai?

  • Za a ɗora bayanan a cikin yanayin kai tsaye, mai kunnawa zai yi aiki kamar yadda aka sa ran
  • Za a ɗora bayanan a yanayin kai tsaye, amma ba za a aiwatar da faɗakarwa ba
  • Za a ɗora bayanan a cikin yanayin al'ada, ƙaddamarwa zai yi aiki kamar yadda ya kamata
  • Za a ɗora bayanan a yanayin al'ada, amma ba za a aiwatar da faɗakarwa ba
  • Ba za a loda bayanan ba, za a yi rikodin kuskure

AmsaAinihin, wannan shine ƙarin tambaya na hankali. Don nemo madaidaicin amsa, zan ba da shawarar samfurin tunani mai zuwa:

  1. Ana yin shigarwa cikin yanayin kai tsaye ta hanyar samar da bayanan toshe kai tsaye, ƙetare injin SQL, wanda ke tabbatar da babban gudu. Don haka, tabbatar da aiwatar da abin fashewa yana da matukar wahala, idan ba zai yiwu ba, kuma babu ma'ana a cikin wannan, tunda har yanzu zai rage saurin shigar da shi.
  2. Rashin aiwatar da faɗakarwa zai haifar da gaskiyar cewa, idan bayanan da ke cikin tebur iri ɗaya ne, yanayin ma'aunin bayanai gaba ɗaya (sauran tebur) zai dogara ne akan yanayin da aka shigar da wannan bayanan. Wannan ba shakka zai lalata amincin bayanai kuma ba za a iya amfani da shi azaman mafita a samarwa ba.
  3. Rashin iya yin aikin da ake buƙata gabaɗaya ana ɗaukarsa azaman kuskure. Amma a nan ya kamata mu tuna cewa APPEND alama ce, kuma gabaɗayan ma'anar alamu ita ce ana la'akari da su idan zai yiwu, amma idan ba haka ba, ana aiwatar da ma'aikaci ba tare da la'akari da alamar ba.

Don haka amsar da ake sa ran ita ce za a ɗora bayanan a yanayin al'ada (SQL), mai kunnawa zai ƙone.

Dangane da takaddun Oracle (wanda aka nakalto daga 8.04):

Cin zarafin ƙuntatawa zai sa bayanin yin aiki a jere, ta amfani da hanyar saka ta al'ada, ba tare da faɗakarwa ko saƙon kuskure ba. Banda shi ne ƙuntatawa akan maganganun shiga tebur ɗaya fiye da sau ɗaya a cikin ma'amala, wanda zai iya haifar da saƙon kuskure.
Misali, idan abubuwan da suka jawo ko ingantacciyar magana suna nan akan tebur, to za a yi watsi da alamar APPEND lokacin da kake ƙoƙarin amfani da INSERT mai ɗaukar nauyi kai tsaye (serial ko layi daya), da kuma alamar PARALLEL ko magana, idan akwai.

Menene zai faru idan aka aiwatar da rubutun mai zuwa?

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

  • Nasarar kammalawa
  • Rashin gazawa saboda kuskuren daidaitawa
  • Kuskure: Ma'amala Mai Zaman Kanta Ba ta Da inganci
  • Kuskuren da ke da alaƙa da ƙetare iyakar ƙira
  • Kuskuren Ketare Maɓalli
  • Kuskure mai alaƙa da makullai

AmsaAn ƙirƙiri tebur da faɗakarwa daidai kuma wannan aikin bai kamata ya haifar da matsaloli ba. Hakanan ana ba da izinin ma'amaloli masu cin gashin kansu a cikin faɗakarwa, in ba haka ba ba zai yiwu ba, misali.

Bayan shigar da layin farko, harbe-harbe mai nasara zai haifar da shigar da layin na biyu, wanda zai haifar da sake kunna wuta, saka layi na uku, da sauransu har sai bayanin ya gaza saboda wuce iyakar gida na kira. Koyaya, wani batu mai dabara ya zo cikin wasa. A lokacin da aka aiwatar da faɗakarwa, ƙaddamarwa ba a kammala ba don shigar da rikodin farko. Don haka, mai faɗakarwa da ke gudana a cikin ma'amala mai cin gashin kansa yana ƙoƙarin shigar da layi a cikin tebur wanda ke nuni da maɓallin ketare zuwa rikodin da ba a yi ba tukuna. Wannan yana haifar da jira (ma'amala mai cin gashin kansa yana jiran babban ma'amala don ƙaddamarwa don ganin ko zai iya saka bayanai) kuma a lokaci guda babban ma'amala yana jiran ciniki mai cin gashin kansa ya ci gaba da aiki bayan faɗakarwa. Makulli yana faruwa kuma, a sakamakon haka, an soke ciniki mai cin gashin kansa saboda dalilai masu alaƙa da kullewa.

Masu amfani da rajista kawai za su iya shiga cikin binciken. Shigadon Allah.

Yana da wuya?

  • Kamar yatsu biyu, nan da nan na yanke shawarar komai daidai.

  • Ba da gaske ba, nayi kuskure akan tambayoyi biyu.

  • Na warware rabinsa daidai.

  • Na tsinkayi amsar sau biyu!

  • Zan rubuta a cikin sharhi

Masu amfani 14 sun kada kuri'a. Masu amfani 10 sun kaurace.

source: www.habr.com

Add a comment