簡體   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