मैं नीचे सूचीबद्ध प्रक्रिया के साथ समाप्त हुआ। यह काम करता है लेकिन मुझे यकीन नहीं है कि यह लगातार श्रेणियों की पहचान करने के लिए सभी प्रश्नों के साथ कुशल है या नहीं। इसे निम्नलिखित तर्कों (उदाहरण) के साथ कहा जा सकता है:
call chunkUpdate('SET var=0','someTable','theKey',500000);
मूल रूप से, पहला तर्क अद्यतन कमांड है (उदाहरण के लिए "सेट x =..."), उसके बाद MySQL तालिका का नाम, उसके बाद एक संख्यात्मक (पूर्णांक) कुंजी जिसे अद्वितीय होना चाहिए, उसके बाद आकार संसाधित किए जाने वाले टुकड़े। उचित प्रदर्शन के लिए कुंजी में एक सूचकांक होना चाहिए। नीचे दिए गए कोड में "n" वेरिएबल और "सेलेक्ट" स्टेटमेंट को हटाया जा सकता है और ये केवल डिबगिंग के लिए हैं।
delimiter //
CREATE PROCEDURE chunkUpdate (IN cmd VARCHAR(255), IN tab VARCHAR(255), IN ky VARCHAR(255),IN sz INT)
BEGIN
SET @sqlgetmin = CONCAT("SELECT MIN(",ky,")-1 INTO @minkey FROM ",tab);
SET @sqlgetmax = CONCAT("SELECT MAX(",ky,") INTO @maxkey FROM ( SELECT ",ky," FROM ",tab," WHERE ",ky,">@minkey ORDER BY ",ky," LIMIT ",sz,") AS TMP");
SET @sqlstatement = CONCAT("UPDATE ",tab," ",cmd," WHERE ",ky,">@minkey AND ",ky,"<[email protected]");
SET @n=1;
PREPARE getmin from @sqlgetmin;
PREPARE getmax from @sqlgetmax;
PREPARE statement from @sqlstatement;
EXECUTE getmin;
REPEAT
EXECUTE getmax;
SELECT cmd,@n AS step, @minkey AS min, @maxkey AS max;
EXECUTE statement;
set @[email protected];
set @[email protected]+1;
UNTIL @maxkey IS NULL
END REPEAT;
select CONCAT(cmd, " EXECUTED IN ",@n," STEPS") AS MESSAGE;
END//