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

कर्सर के साथ क्या गलत है?

कर्सर के साथ गलत यह है कि उनका अक्सर दुरुपयोग किया जाता है, दोनों Oracle . में और MS SQL . में ।

कर्सर एक स्थिर परिणाम रखने के लिए है जिसे आप पंक्ति-दर-पंक्ति पुनर्प्राप्त कर सकते हैं। जब आपकी क्वेरी चलती है, तो वे अंतर्निहित रूप से बनाई जाती हैं, और समाप्त होने पर बंद हो जाती हैं।

बेशक इस तरह के परिणाम सेट को रखने के लिए कुछ संसाधनों की आवश्यकता होती है:locks , latches , memory , यहां तक ​​कि disk space

ये संसाधन जितनी तेज़ी से मुक्त होंगे, उतना ही अच्छा होगा।

कर्सर को खुला रखना फ्रिज के दरवाजे को खुला रखने जैसा है

आप इसे बिना आवश्यकता के घंटों तक नहीं करते हैं, लेकिन इसका मतलब यह नहीं है कि आपको कभी भी अपना फ्रिज नहीं खोलना चाहिए।

इसका मतलब है कि:

  • आपको अपने परिणाम पंक्ति-दर-पंक्ति नहीं मिलते हैं और उनका योग करते हैं:आप SQL को कॉल करते हैं का SUM इसके बजाय।
  • आप पूरी क्वेरी निष्पादित नहीं करते हैं और कर्सर से पहला परिणाम प्राप्त करते हैं:आप एक rownum <= 10 जोड़ते हैं आपकी क्वेरी के लिए शर्त

, आदि.

जहां तक ​​Oracle का सवाल है , एक प्रक्रिया के अंदर अपने कर्सर को संसाधित करने के लिए कुख्यात SQL/PLSQL context switch की आवश्यकता होती है जो हर बार SQL . का परिणाम मिलने पर होता है कर्सर से क्वेरी करें।

इसमें थ्रेड्स के बीच बड़ी मात्रा में डेटा पास करना और थ्रेड्स को सिंक्रोनाइज़ करना शामिल है।

यह Oracle . में सबसे अधिक परेशान करने वाली चीजों में से एक है ।

उस व्यवहार के कम स्पष्ट परिणामों में से एक यह है कि यदि संभव हो तो Oracle में ट्रिगर से बचा जाना चाहिए।

एक ट्रिगर बनाना और एक DML को कॉल करना फ़ंक्शन अपडेट की गई पंक्तियों को चुनने वाले कर्सर को खोलने और इस कर्सर की प्रत्येक पंक्ति के लिए ट्रिगर कोड को कॉल करने के बराबर है।

केवल ट्रिगर का अस्तित्व (यहां तक ​​कि खाली ट्रिगर भी) एक DML को धीमा कर सकता है ऑपरेशन 10 times या अधिक।

10g . पर एक परीक्षण स्क्रिप्ट :

SQL> CREATE TABLE trigger_test (id INT NOT NULL)
  2  /

Table created

Executed in 0,031 seconds
SQL> INSERT
  2  INTO   trigger_test
  3  SELECT level
  4  FROM   dual
  5  CONNECT BY
  6     level <= 1000000
  7  /

1000000 rows inserted

Executed in 1,469 seconds
SQL> COMMIT
  2  /

Commit complete

Executed in 0 seconds
SQL> TRUNCATE TABLE trigger_test
  2  /

Table truncated

Executed in 3 seconds
SQL> CREATE TRIGGER trg_test_ai
  2  AFTER INSERT
  3  ON trigger_test
  4  FOR EACH ROW
  5  BEGIN
  6     NULL;
  7  END;
  8  /

Trigger created

Executed in 0,094 seconds
SQL> INSERT
  2  INTO   trigger_test
  3  SELECT level
  4  FROM   dual
  5  CONNECT BY
  6     level <= 1000000
  7  /

1000000 rows inserted

Executed in 17,578 seconds

1.47 ट्रिगर के बिना सेकंड, 17.57 एक खाली ट्रिगर के साथ सेकंड कुछ भी नहीं कर रहा है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ईबीएस 12.2 . में वेब पोर्ट कैसे बदलें

  2. plsql का उपयोग करके उपयोगकर्ता परिभाषित कस्टम कुल फ़ंक्शन

  3. मैं सप्ताह के एक गैर-मानक सप्ताह के पहले दिन का उपयोग करके Oracle में वर्ष के सप्ताह की गणना कैसे करूं?

  4. Oracle में किसी दृश्य के परिणामों के अद्यतन की अनुमति कैसे दें?

  5. INST_TOP (ओरेकल R12 INSTANCE_HOME) डिकोड किया गया