मैं 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 सेकंड तक (औपचारिक रूप से इसे समय नहीं दिया, बस पलक झपकने में पर्याप्त समय लगा)।