Есть ли функция, аналогичная функции generate_series, в PostgreSQL? - PullRequest
1 голос
/ 16 февраля 2020

Функция generate_series в PostgreSQL очень быстро генерирует большой объем данных. Но поскольку я не знаком с MySQL, я написал хранимую процедуру и обнаружил, что скорость генерации данных очень низкая.

delimiter $$
CREATE PROCEDURE inst_para_select(IN n int)
BEGIN    
    DECLARE i INT DEFAULT 1;
    WHILE i <= n  DO
        INSERT INTO `para_select` VALUES(i,CONCAT(i,'_test'),NOW());
        SET i = i+1;
    END WHILE;
END $$
delimiter;

Существует ли лучший способ быстрого создания больших объемов данных в MySQL, функции или хранимые процедуры?

1 Ответ

0 голосов
/ 17 февраля 2020

Каждое хорошо работающее решение, которое я видел для MySQL, должно использовать какую-то существующую таблицу чисел или представление. Это ограничивает вас количеством строк в таблице или представлении.

Вы можете составить таблицу последовательных целых чисел настолько большой, насколько вам это может понадобиться, и с этим покончено.

Одна из наиболее интересных сгенерированных реализаций, с которыми я столкнулся, - Маркус Винанд . Он создает представление от 0 до 15. Затем использует перекрестные соединения и битовую математику, чтобы генерировать представления больших и больших последовательностей.

CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1  UNION ALL SELECT 2  UNION ALL 
  SELECT 3   UNION ALL SELECT 4  UNION ALL SELECT 5  UNION ALL
  SELECT 6   UNION ALL SELECT 7  UNION ALL SELECT 8  UNION ALL
  SELECT 9   UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
  SELECT 12  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
  SELECT 15;

CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
    FROM generator_16 lo, generator_16 hi;

CREATE OR REPLACE VIEW generator_4k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
    FROM generator_256 lo, generator_16 hi;

CREATE OR REPLACE VIEW generator_64k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
    FROM generator_256 lo, generator_256 hi;

CREATE OR REPLACE VIEW generator_1m
AS SELECT ( ( hi.n << 16 ) | lo.n ) AS n
    FROM generator_64k lo, generator_16 hi;

Представления всегда формируют полный декартовой продукт. Хотя вы можете ограничить результат с помощью предложения where, работа по созданию всех строк все еще выполняется. Это просто фильтрация ненужного. Это означает, что очень неэффективно использовать большое представление генератора, если вам нужно всего несколько строк.

Всегда используйте наименьший возможный генератор для лучшей производительности.

...