Лучший выбор вместо функций для нескольких вставок - PullRequest
0 голосов
/ 28 февраля 2020

в моей базе данных 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) не вариант, потому что мне нужно больше всего случайных значений.

Сделать обновление после вставки даже хуже.

Я пропустил какую-то очевидную альтернативу?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Гораздо проще (и быстрее) тело функции:

RETURN GREATEST(0, p_value);

Или, применяя это к решению Давида:

insert into table_AAA
   SELECT 
         GREATEST(0, round(X + rand() * 10 - rand() * 10 )) AS x,
         GREATEST(0, round(Y + rand() * 10 - rand() * 10 )) AS y
      FROM db_numbers d /* table of numbers from 1 to 1M*/
      limit 100000) v;
1 голос
/ 28 февраля 2020

ВЫ можете использовать подзапрос:

insert into table_AAA
SELECT CASE WHEN v.x<0 THEN 0 ELSE v.x END,
  CASE WHEN v.y<0 THEN 0 ELSE v.y END,
FROM (
SELECT 
 round(X + rand() * 10 - rand() * 10   ) AS x
, round(Y + rand() * 10 - rand() * 10   ) AS y
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000) v;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...