в моей базе данных sql У меня есть процедура, которую нужно вставить в таблицу тонн случайно сгенерированных записей. Примерно так:
insert into table_AAA
SELECT
, round(X + rand() * 10 - rand() * 10 )
, round(Y + rand() * 10 - rand() * 10 )
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000;
это занимает 3 секунды, звучит разумно по сравнению с другими процедурами моих серверов.
Тогда я должен был сделать это, если результат round () равен> = 0
Для этого я сделал функцию:
CREATE FUNCTION `fn_normalize`(`p_value` INT) RETURNS int(11)
BEGIN
declare v_output INT;
IF p_value < 0 THEN
SET v_output = 0 ;
ELSE SET v_output = p_value ;
END IF;
RETURN (v_output);
END
, и моя вставка стала:
insert into table_AAA
SELECT
, fn_normalize(round(X + rand() * 10 - rand() * 10 ))
, fn_normalize(round(Y + rand() * 10 - rand() * 10 ))
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000;
очень медленной, в 10 раз оригинальной, вероятно потому, что Функция работает с каждым значением индивидуально
Я подумал использовать CASE WHEN:
insert into table_AAA
SELECT
, case when(round(X + rand() * 10 - rand() * 10 )) < 0 then 0 else (round(X + rand() * 10 - rand() * 10 )) end
, case when(round(Y + rand() * 10 - rand() * 10 )) < 0 then 0 else (round(X + rand() * 10 - rand() * 10 )) end
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000;
Но остальное перезапустит функцию rand, поэтому я не уверен, что это положительное число. Использование rand (x) не вариант, потому что мне нужно больше всего случайных значений.
Сделать обновление после вставки даже хуже.
Я пропустил какую-то очевидную альтернативу?
Большое спасибо