हाईलोड++ साइबेरिया 2019 के नक्शेकदम पर चलते हुए - Oracle पर 8 कार्य

हाय!

24-25 जून को हाईलोड++ साइबेरिया 2019 सम्मेलन नोवोसिबिर्स्क में आयोजित किया गया था। हमारे लोग भी वहां थे रिपोर्ट good "ओरेकल कंटेनर डेटाबेस (सीडीबी/पीडीबी) और सॉफ्टवेयर विकास के लिए उनका व्यावहारिक उपयोग", हम थोड़ी देर बाद एक पाठ संस्करण प्रकाशित करेंगे। यह अच्छा था, धन्यवाद ओलेगबुनिन संगठन के लिए, साथ ही आए सभी लोगों के लिए।

हाईलोड++ साइबेरिया 2019 के नक्शेकदम पर चलते हुए - Oracle पर 8 कार्य
इस पोस्ट में, हम आपके साथ उन समस्याओं को साझा करना चाहेंगे जो हमारे बूथ पर थीं ताकि आप अपने 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 इसे स्वचालित रूप से वापस रोल करता है और SQLCA में लागू त्रुटि कोड को SQLCODE पर लौटाता है। उदाहरण के लिए, यदि एक INSERT कथन एक अद्वितीय सूचकांक में डुप्लिकेट मान डालने का प्रयास करके त्रुटि उत्पन्न करता है, तो कथन वापस ले लिया जाता है।

क्लाइंट से एचपी को कॉल करने को भी एकल स्टेटमेंट के रूप में माना और संसाधित किया जाता है। इस प्रकार, तीन रिकॉर्ड डालने पर पहली एचपी कॉल सफलतापूर्वक पूरी हो जाती है; दूसरी एचपी कॉल एक त्रुटि के साथ समाप्त होती है और चौथे रिकॉर्ड को वापस लाती है जिसे वह सम्मिलित करने में कामयाब रही थी; तीसरी कॉल विफल, और तालिका में तीन रिकॉर्ड हैं.

निम्नलिखित स्क्रिप्ट चलाने के परिणामस्वरूप तालिका में कितनी पंक्तियाँ होंगी?

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 से उद्धृत):

एक चेक बाधा आपको एक शर्त निर्दिष्ट करने देती है जिसे तालिका की प्रत्येक पंक्ति को पूरा करना होगा। बाधा को पूरा करने के लिए, तालिका की प्रत्येक पंक्ति को शर्त को सत्य या अज्ञात (शून्य के कारण) बनाना होगा। जब Oracle किसी विशेष पंक्ति के लिए चेक बाधा स्थिति का मूल्यांकन करता है, तो स्थिति में कोई भी कॉलम नाम उस पंक्ति में कॉलम मानों को संदर्भित करता है।

इस प्रकार, मान शून्य जांच पास कर लेगा, और मान 3 सम्मिलित करने का प्रयास होने तक अनाम ब्लॉक सफलतापूर्वक निष्पादित किया जाएगा। इसके बाद, त्रुटि प्रबंधन ब्लॉक अपवाद को साफ़ कर देगा, कोई रोलबैक नहीं होगा, और तालिका में चार पंक्तियाँ शेष रहेंगी मान 1, शून्य, 2 और फिर से शून्य के साथ।

मूल्यों के कौन से जोड़े ब्लॉक में समान मात्रा में स्थान लेंगे?

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

  • ए और एक्स
  • बी और वाई
  • सी और के
  • सी और जेड
  • के और जेड
  • मैं और जे
  • जे और एक्स
  • ऊपर के सभी

जवाबयहां Oracle में विभिन्न प्रकार के डेटा संग्रहीत करने पर दस्तावेज़ (12.1.0.2) के अंश दिए गए हैं।

CHAR डेटा प्रकार
CHAR डेटा प्रकार डेटाबेस वर्ण सेट में एक निश्चित-लंबाई वर्ण स्ट्रिंग निर्दिष्ट करता है। जब आप अपना डेटाबेस बनाते हैं तो आप डेटाबेस वर्ण सेट निर्दिष्ट करते हैं। Oracle यह सुनिश्चित करता है कि CHAR कॉलम में संग्रहीत सभी मानों की लंबाई चयनित लंबाई शब्दार्थ में आकार द्वारा निर्दिष्ट हो। यदि आप कोई ऐसा मान सम्मिलित करते हैं जो स्तंभ की लंबाई से छोटा है, तो Oracle मान को स्तंभ की लंबाई के अनुसार रिक्त कर देता है।

VARCHAR2 डेटा प्रकार
VARCHAR2 डेटा प्रकार डेटाबेस वर्ण सेट में एक चर-लंबाई वर्ण स्ट्रिंग निर्दिष्ट करता है। जब आप अपना डेटाबेस बनाते हैं तो आप डेटाबेस वर्ण सेट निर्दिष्ट करते हैं। Oracle एक वर्ण मान को VARCHAR2 कॉलम में ठीक उसी तरह संग्रहीत करता है जैसा आप इसे निर्दिष्ट करते हैं, बिना किसी रिक्त-पैडिंग के, बशर्ते मान कॉलम की लंबाई से अधिक न हो।

संख्या डेटा प्रकार
NUMBER डेटा प्रकार शून्य के साथ-साथ सकारात्मक और नकारात्मक निश्चित संख्याओं को 1.0 x 10-130 से निरपेक्ष मानों के साथ संग्रहीत करता है, लेकिन 1.0 x 10126 को शामिल नहीं करता है। यदि आप एक अंकगणितीय अभिव्यक्ति निर्दिष्ट करते हैं जिसका मान निरपेक्ष मान से अधिक या उसके बराबर है 1.0 x 10126, तो Oracle एक त्रुटि देता है। प्रत्येक NUMBER मान के लिए 1 से 22 बाइट्स की आवश्यकता होती है। इसे ध्यान में रखते हुए, किसी विशेष संख्यात्मक डेटा मान NUMBER(p) के लिए बाइट्स में कॉलम आकार, जहां p किसी दिए गए मान की सटीकता है, की गणना निम्न सूत्र का उपयोग करके की जा सकती है: राउंड((लंबाई(पी)+एस)/2))+1 यदि संख्या सकारात्मक है तो s शून्य के बराबर है, और यदि संख्या नकारात्मक है तो s 1 के बराबर है।

इसके अलावा, आइए शून्य मानों को संग्रहीत करने के बारे में दस्तावेज़ से एक अंश लें।

शून्य किसी कॉलम में मान की अनुपस्थिति है। शून्य गुम, अज्ञात या अनुपयुक्त डेटा को दर्शाता है। यदि शून्य डेटा मान वाले स्तंभों के बीच आते हैं तो उन्हें डेटाबेस में संग्रहीत किया जाता है। इन मामलों में, उन्हें कॉलम की लंबाई (शून्य) संग्रहीत करने के लिए 1 बाइट की आवश्यकता होती है। एक पंक्ति में अनुगामी शून्य को भंडारण की आवश्यकता नहीं होती है क्योंकि एक नया पंक्ति शीर्षलेख संकेत देता है कि पिछली पंक्ति में शेष कॉलम शून्य हैं। उदाहरण के लिए, यदि किसी तालिका के अंतिम तीन कॉलम शून्य हैं, तो इन कॉलमों के लिए कोई डेटा संग्रहीत नहीं किया जाता है।

इन आंकड़ों के आधार पर हम तर्क बनाते हैं। हम मानते हैं कि डेटाबेस AL32UTF8 एन्कोडिंग का उपयोग करता है। इस एन्कोडिंग में, रूसी अक्षर 2 बाइट्स पर कब्जा कर लेंगे।

1) ए और एक्स, फ़ील्ड ए 'वाई' का मान 1 बाइट लेता है, फ़ील्ड एक्स 'डी' का मान 2 बाइट लेता है
2) बी और वाई, बी में 'वास्या' का मान 10 अक्षरों तक रिक्त स्थान के साथ भरा जाएगा और 14 बाइट्स लेगा, डी में 'वास्या' 8 बाइट्स लेगा।
3) सी और के। दोनों फ़ील्ड का मान NULL है, उनके बाद महत्वपूर्ण फ़ील्ड हैं, इसलिए वे 1 बाइट पर कब्जा कर लेते हैं।
4) सी और जेड। दोनों फ़ील्ड का मान NULL है, लेकिन फ़ील्ड Z तालिका में अंतिम है, इसलिए यह स्थान (0 बाइट्स) नहीं लेता है। फ़ील्ड C 1 बाइट घेरता है।
5) K और Z. पिछले मामले के समान। K फ़ील्ड में मान Z-1 में 0 बाइट घेरता है।
6) I और J. दस्तावेज़ के अनुसार, दोनों मान 2 बाइट्स लेंगे। हम दस्तावेज़ीकरण से लिए गए सूत्र का उपयोग करके लंबाई की गणना करते हैं: गोल ((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 से उद्धृत):

बी-ट्री इंडेक्स के लिए, इंडेक्स क्लस्टरिंग कारक इंडेक्स मान के संबंध में पंक्तियों के भौतिक समूहन को मापता है।

इंडेक्स क्लस्टरिंग फैक्टर ऑप्टिमाइज़र को यह तय करने में मदद करता है कि इंडेक्स स्कैन या फुल टेबल स्कैन कुछ प्रश्नों के लिए अधिक कुशल है या नहीं)। कम क्लस्टरिंग कारक एक कुशल सूचकांक स्कैन को इंगित करता है।

एक क्लस्टरिंग कारक जो किसी तालिका में ब्लॉकों की संख्या के करीब है, इंगित करता है कि पंक्तियों को इंडेक्स कुंजी द्वारा तालिका ब्लॉकों में भौतिक रूप से क्रमबद्ध किया गया है। यदि डेटाबेस पूर्ण तालिका स्कैन करता है, तो डेटाबेस पंक्तियों को पुनः प्राप्त करता है क्योंकि वे इंडेक्स कुंजी द्वारा क्रमबद्ध डिस्क पर संग्रहीत होते हैं। एक क्लस्टरिंग कारक जो पंक्तियों की संख्या के करीब है, इंगित करता है कि पंक्तियाँ सूचकांक कुंजी के संबंध में डेटाबेस ब्लॉकों में बेतरतीब ढंग से बिखरी हुई हैं। यदि डेटाबेस पूर्ण तालिका स्कैन करता है, तो डेटाबेस इस सूचकांक कुंजी द्वारा किसी भी क्रमबद्ध क्रम में पंक्तियों को पुनर्प्राप्त नहीं करेगा।

इस मामले में, डेटा को आदर्श रूप से क्रमबद्ध किया गया है, इसलिए क्लस्टरिंग कारक तालिका में कब्जे वाले ब्लॉक की संख्या के बराबर या उसके करीब होगा। 8 किलोबाइट के मानक ब्लॉक आकार के लिए, आप उम्मीद कर सकते हैं कि लगभग एक हजार संकीर्ण संख्या मान एक ब्लॉक में फिट होंगे, इसलिए ब्लॉक की संख्या, और परिणामस्वरूप, क्लस्टरिंग कारक होगा लगभग दसियों.

एन के किस मान पर निम्नलिखित स्क्रिप्ट को मानक सेटिंग्स के साथ नियमित डेटाबेस में सफलतापूर्वक निष्पादित किया जाएगा?

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 बाइट्स + पंक्ति लंबाई है), जबकि एन = 200 (या उससे कम) पर इंडेक्स बनाने से बिना किसी समस्या के काम होगा।

APPEND संकेत के साथ INSERT ऑपरेटर को डेटा को सीधे मोड में लोड करने के लिए डिज़ाइन किया गया है। यदि इसे उस मेज पर लगाया जाए जिस पर ट्रिगर लटका हुआ है तो क्या होगा?

  • डेटा डायरेक्ट मोड में लोड किया जाएगा, ट्रिगर उम्मीद के मुताबिक काम करेगा
  • डेटा डायरेक्ट मोड में लोड किया जाएगा, लेकिन ट्रिगर निष्पादित नहीं किया जाएगा
  • डेटा पारंपरिक मोड में लोड किया जाएगा, ट्रिगर उसी तरह काम करेगा जैसा उसे करना चाहिए
  • डेटा पारंपरिक मोड में लोड किया जाएगा, लेकिन ट्रिगर निष्पादित नहीं किया जाएगा
  • डेटा लोड नहीं किया जाएगा, एक त्रुटि दर्ज की जाएगी

जवाबमूलतः, यह तर्क का प्रश्न है। सही उत्तर खोजने के लिए, मैं निम्नलिखित तर्क मॉडल का सुझाव दूंगा:

  1. प्रत्यक्ष मोड में सम्मिलन SQL इंजन को दरकिनार करते हुए डेटा ब्लॉक के प्रत्यक्ष गठन द्वारा किया जाता है, जो उच्च गति सुनिश्चित करता है। इस प्रकार, ट्रिगर के निष्पादन को सुनिश्चित करना असंभव नहीं तो बहुत कठिन है, और इसका कोई मतलब नहीं है, क्योंकि यह अभी भी सम्मिलन को मौलिक रूप से धीमा कर देगा।
  2. ट्रिगर को निष्पादित करने में विफलता इस तथ्य को जन्म देगी कि, यदि तालिका में डेटा समान है, तो संपूर्ण डेटाबेस (अन्य तालिकाओं) की स्थिति उस मोड पर निर्भर करेगी जिसमें यह डेटा डाला गया था। यह स्पष्ट रूप से डेटा अखंडता को नष्ट कर देगा और इसे उत्पादन में समाधान के रूप में लागू नहीं किया जा सकता है।
  3. अनुरोधित ऑपरेशन करने में असमर्थता को आम तौर पर एक त्रुटि के रूप में माना जाता है। लेकिन यहां हमें याद रखना चाहिए कि APPEND एक संकेत है, और संकेतों का सामान्य तर्क यह है कि यदि संभव हो तो उन्हें ध्यान में रखा जाता है, लेकिन यदि नहीं, तो ऑपरेटर को संकेत को ध्यान में रखे बिना निष्पादित किया जाता है।

तो अपेक्षित उत्तर है डेटा सामान्य (एसक्यूएल) मोड में लोड किया जाएगा, ट्रिगर सक्रिय हो जाएगा।

Oracle दस्तावेज़ के अनुसार (8.04 से उद्धृत):

प्रतिबंधों का उल्लंघन, बिना किसी चेतावनी या त्रुटि संदेश के, पारंपरिक सम्मिलन पथ का उपयोग करके, कथन को क्रमिक रूप से निष्पादित करने का कारण बनेगा। एक अपवाद एक लेन-देन में एक ही तालिका तक एक से अधिक बार पहुंचने वाले बयानों पर प्रतिबंध है, जो त्रुटि संदेशों का कारण बन सकता है।
उदाहरण के लिए, यदि ट्रिगर या संदर्भात्मक अखंडता तालिका में मौजूद है, तो जब आप डायरेक्ट-लोड INSERT (सीरियल या समानांतर) का उपयोग करने का प्रयास करेंगे तो APPEND संकेत को नजरअंदाज कर दिया जाएगा, साथ ही PARALLEL संकेत या खंड, यदि कोई हो।

निम्नलिखित स्क्रिप्ट निष्पादित होने पर क्या होगा?

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 उपयोगकर्ता अनुपस्थित रहे।

स्रोत: www.habr.com

एक टिप्पणी जोड़ें