Saya berakhir dengan prosedur yang tercantum di bawah ini. Ini berfungsi tetapi saya tidak yakin apakah itu efisien dengan semua kueri untuk mengidentifikasi rentang berurutan. Itu dapat dipanggil dengan argumen berikut (contoh):
call chunkUpdate('SET var=0','someTable','theKey',500000);
Pada dasarnya, argumen pertama adalah perintah update (misalnya sesuatu seperti "set x =..."), diikuti dengan nama tabel mysql, diikuti dengan kunci numerik (bilangan bulat) yang harus unik, diikuti dengan ukuran tabel. potongan untuk diproses. Kunci harus memiliki indeks untuk kinerja yang wajar. Variabel "n" dan pernyataan "pilih" dalam kode di bawah ini dapat dihapus dan hanya untuk debugging.
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//