कर्सर के साथ गलत यह है कि उनका अक्सर दुरुपयोग किया जाता है, दोनों 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
एक खाली ट्रिगर के साथ सेकंड कुछ भी नहीं कर रहा है।