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

SQL में n यादृच्छिक पंक्तियों को अपडेट करें

मैं ROWID का उपयोग करूंगा:

UPDATE xyz SET x='Y' WHERE rowid IN (
    SELECT r FROM (
        SELECT ROWID r FROM xyz ORDER BY dbms_random.value
    ) RNDM WHERE rownum < n+1
)

ROWID का उपयोग करने का वास्तविक कारण दक्षता के लिए नहीं है, हालांकि (यह अभी भी एक पूर्ण तालिका स्कैन करेगा) - यदि कॉलम m तो आपका SQL आपकी इच्छित पंक्तियों की संख्या को अपडेट नहीं कर सकता है अद्वितीय नहीं है।

केवल 1000 पंक्तियों के साथ, आपको वास्तव में दक्षता (शायद सौ मिलियन पंक्तियों के साथ) के बारे में चिंतित नहीं होना चाहिए। इस तालिका में किसी भी अनुक्रमणिका के बिना, आप यादृच्छिक रिकॉर्ड का चयन करने के लिए एक पूर्ण तालिका स्कैन कर रहे हैं।

[संपादित करें:] "लेकिन अगर 100,000 पंक्तियां हों तो क्या होगा"

खैर, यह अभी भी 100 मिलियन से कम परिमाण के 3 आदेश हैं।

मैंने निम्नलिखित चलाया:

create table xyz as select * from all_objects;

[मेरे सिस्टम पर लगभग 50,000 पंक्तियां बनाईं - गैर-अनुक्रमित, बिल्कुल आपकी तालिका की तरह]

UPDATE xyz SET owner='Y' WHERE rowid IN (
     SELECT r FROM (
          SELECT ROWID r FROM xyz ORDER BY dbms_random.value
     ) RNDM WHERE rownum < 10000
);
commit;

इसमें लगभग 1.5 सेकंड का समय लगा। शायद यह 1 सेकंड था, शायद 3 सेकंड तक (औपचारिक रूप से इसे समय नहीं दिया, बस पलक झपकने में पर्याप्त समय लगा)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तिथि से युग-ओरेकल में कनवर्ट करें

  2. Oracle डेटाबेस:BLOB कैसे पढ़ा जाए?

  3. खराब हाइबरनेट सीधे चलने की तुलना में प्रदर्शन का चयन करें - कैसे डिबग?

  4. ORA-29024:प्रमाणपत्र सत्यापन विफलता

  5. संबंध जानकारी के साथ इकाई ढांचे में कई-से-अनेक संबंध