繁体   English   中英

PostgreSQL 中是否有类似于 generate_series 函数的函数?

[英]Is there a function similar to generate_series function in PostgreSQL?

PostgreSQL 中的 generate_series 函数可以非常快速地生成大量数据。 但是因为对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、函数或存储过程中快速创建大量数据?

我见过的每个 MySQL 性能良好的解决方案都必须使用某种现有的数字表或视图。 这限制了您在表或视图中有多少行。

您可以制作一个尽可能大的连续整数表并完成它。

我遇到的更有趣的生成实现之一是 Markus Winand 他创建了一个从 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 子句限制结果,但生成所有行的工作仍然完成。 它只是过滤不需要的。 这意味着,如果您只需要几行,那么使用大型生成器视图是非常低效的。

始终使用尽可能小的发电机以获得最佳性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM