Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle में अस्थायी डेटा के लिए प्रदर्शन विचार

अस्थायी टेबल प्रभावी रूप से कैशिंग और एसिंक्रोनस I/O के लिए इन-मेमोरी टेबल के समान होते हैं, और अस्थायी तालिका समाधान को SQL और PL/SQL के बीच कनवर्ट करने के लिए किसी ओवरहेड की आवश्यकता नहीं होती है।

परिणामों की पुष्टि

रनस्टैट्स के साथ दो संस्करणों की तुलना करने पर, अस्थायी तालिका संस्करण दिखता है बहुत खराब। रन1 में अस्थायी तालिका संस्करण के लिए वह सब जंक, और रन 2 में पीएल/एसक्यूएल संस्करण के लिए केवल थोड़ी अतिरिक्त मेमोरी। सबसे पहले ऐसा लगता है कि पीएल/एसक्यूएल स्पष्ट विजेता होना चाहिए।

Type  Name                              Run1 (temp) Run2 (PLSQL)         Diff
----- -------------------------------- ------------ ------------ ------------
...
STAT  physical read bytes                    81,920            0      -81,920
STAT  physical read total bytes              81,920            0      -81,920
LATCH cache buffers chains                  104,663          462     -104,201
STAT  session uga memory                    445,488      681,016      235,528
STAT  KTFB alloc space (block)            2,097,152            0   -2,097,152
STAT  undo change vector size             2,350,188            0   -2,350,188
STAT  redo size                           2,804,516            0   -2,804,516
STAT  temp space allocated (bytes)       12,582,912            0  -12,582,912
STAT  table scan rows gotten             15,499,845            0  -15,499,845
STAT  session pga memory                    196,608   19,857,408   19,660,800
STAT  logical read bytes from cache     299,958,272            0 -299,958,272

लेकिन दिन के अंत में केवल दीवार घड़ी का समय मायने रखता है। अस्थायी तालिकाओं के साथ लोडिंग और क्वेरी करने के चरण दोनों बहुत तेज़ी से चलते हैं।

PL/SQL संस्करण को बल्क कलेक्ट . के स्थान पर सुधारा जा सकता है साथ में . लेकिन यह अभी भी अस्थायी तालिका संस्करण की तुलना में काफी धीमा है।

अनुकूलित पठन

छोटी अस्थायी तालिका से पढ़ना केवल बफर कैश का उपयोग करता है, जो स्मृति में है। केवल क्वेरी भाग को कई बार चलाएँ, और देखें कि कैश से संगत कैसे प्राप्त होता है (स्मृति) बढ़ जाती है जबकि भौतिक कैशे पढ़ता है (डिस्क) वही रहें।

select name, value
from v$sysstat
where name in ('db block gets from cache', 'consistent gets from cache', 
'physical reads cache');

अनुकूलित लेखन

आदर्श रूप से कोई भौतिक I/O नहीं होगा, खासकर जब से अस्थायी तालिका ON COMMIT DELETE ROWS है . और ऐसा लगता है कि Oracle का अगला संस्करण इस तरह के तंत्र को पेश कर सकता है। लेकिन यह इस मामले में ज्यादा मायने नहीं रखता, डिस्क I/O चीजों को धीमा नहीं करता है।

लोड चरण को कई बार चलाएँ, और फिर select * from v$active_session_history क्रम से sample_time desc; चलाएँ . अधिकांश I/O पृष्ठभूमि है , जिसका अर्थ है कि कुछ भी इस पर प्रतीक्षा नहीं कर रहा है। मुझे लगता है कि अस्थायी तालिका आंतरिक तर्क नियमित डीएमएल तंत्र की एक प्रति है। सामान्य तौर पर, नया तालिका डेटा हो सकता है डिस्क पर लिखा जाना चाहिए, अगर यह प्रतिबद्ध है। ओरेकल इस पर काम करना शुरू कर सकता है, उदाहरण के लिए लॉग बफर से डिस्क पर डेटा ले जाकर, लेकिन वास्तविक COMMIT होने तक कोई जल्दी नहीं है। .

पीएल/एसक्यूएल समय कहां जाता है?

मेरे पास कोई सुराग नहीं है। क्या SQL और PL/SQL इंजन के बीच एकाधिक संदर्भ स्विच, या एकल रूपांतरण हैं? जहां तक ​​मुझे पता है कोई भी उपलब्ध मीट्रिक समय . नहीं दिखाता है SQL और PL/SQL के बीच स्विच करने पर खर्च किया गया।

हम शायद कभी नहीं जान पाएंगे कि पीएल/एसक्यूएल कोड धीमा क्यों है। मैं इसकी ज्यादा चिंता नहीं करता। सामान्य उत्तर यह है कि, डेटाबेस का अधिकांश काम वैसे भी SQL में किया जाना है। यह बहुत मायने रखता है अगर Oracle अपने डेटाबेस के मूल, SQL को एड-ऑन भाषा, PL/SQL की तुलना में अनुकूलित करने में अधिक समय व्यतीत करता है।

अतिरिक्त नोट

प्रदर्शन परीक्षण के लिए इससे कनेक्ट करें . को हटाना सहायक हो सकता है एक अलग कदम में तर्क। डेटा लोड करने के लिए SQL एक बेहतरीन ट्रिक है, लेकिन यह बहुत धीमी और संसाधन गहन हो सकती है। उस ट्रिक के साथ एक बार नमूना तालिका लोड करना और फिर उस तालिका से सम्मिलित करना अधिक यथार्थवादी है।

मैंने नई Oracle 12c सुविधा, अस्थायी पूर्ववत, और नई 18c सुविधा, निजी अस्थायी तालिकाओं का उपयोग करने का प्रयास किया। नियमित अस्थायी तालिकाओं की तुलना में किसी ने भी प्रदर्शन में सुधार नहीं किया।

मैं इस पर दांव नहीं लगाऊंगा, लेकिन मैं एक तरीका देख सकता हूं कि जैसे-जैसे डेटा बड़ा होता जाएगा, परिणाम पूरी तरह से बदल जाएंगे। लॉग बफ़र और बफ़र कैश केवल इतना बड़ा हो सकता है। और अंततः वह पृष्ठभूमि I/O जोड़ सकता है और कुछ प्रक्रियाओं को प्रभावित कर सकता है, पृष्ठभूमि को चालू कर सकता है एक फोरग्राउंड में प्रतीक्षा करें रुको। दूसरी तरफ, पीएल/एसक्यूएल समाधान के लिए केवल इतनी पीजीए मेमोरी है, और फिर चीजें दुर्घटनाग्रस्त हो जाती हैं।

अंत में, यह आंशिक रूप से "इन-मेमोरी डेटाबेस" के मेरे संदेह की पुष्टि करता है। कैशिंग कोई नई बात नहीं है, डेटाबेस दशकों से ऐसा कर रहे हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 1985-02-07T00:00:00.000Z (ISO8601) को Oracle में दिनांक मान में कैसे बदलें?

  2. Django ओरेकल डीबी सेटिंग्स

  3. PLSQL बेनामी ब्लॉक पूरा होने पर कोई आउटपुट क्यों नहीं?

  4. Oracle डेटाबेस में बल्क इंसर्ट:कौन सा बेहतर है:कर्सर लूप या साधारण सेलेक्ट के लिए?

  5. oracle - किन कथनों को करने की आवश्यकता है?