首页 > 解决方案 > 使用存储过程插入表?

问题描述

(为雪花用户投稿,希望得到更多帮助)


是否有另一种方法可以更快地使用存储过程执行表插入?我开始构建一个usp,目的是将数百万行左右的测试数据插入到一个表中,以进行负载测试。

我到了下面的这个阶段,并将迭代值设置为 10,000。

这需要 10 多分钟来迭代 10,000 次,以便每次迭代将单个整数插入表中

是的 - 我正在使用 XS 数据仓库,但即使将其增加到 MAX - 这也是一种放慢速度的方式。

--建立一个测试表

CREATE OR REPLACE TABLE myTable
(
   myInt NUMERIC(18,0)
);

--使用while语句测试js usp,目的是在表中插入多行(百万)以进行负载测试

CREATE OR REPLACE PROCEDURE usp_LoadTable_test()
RETURNS float
LANGUAGE javascript
EXECUTE AS OWNER
AS
$$
//set the number of iterations
   var maxLoops = 10;
//set the row Pointer
   var rowPointer = 1;
//set the Insert sql statement
   var sql_insert = 'INSERT INTO myTable VALUES(:1);';   
//Insert the fist Value
       sf_startInt = rowPointer + 1000;
       resultSet = snowflake.execute( {sqlText: sql_insert, binds: [sf_startInt] });
//Loop thorugh to insert all other values
   while (rowPointer < maxLoops)
   {
       rowPointer += 1;
       sf_startInt = rowPointer + 1000;
       resultSet = snowflake.execute( {sqlText: sql_insert, binds: [sf_startInt] });
   }

   return rowPointer;
$$;
CALL usp_LoadTable_test();

到目前为止,我收到了以下建议:

建议 #1

您可以做的一件事是使用包含 1000 或更多行的“馈线表”而不是INSERT ... VALUES,例如:

INSERT INTO myTable SELECT <some transformation of columns> FROM "feeder table"

建议 #2

当您执行一百万个单行插入时,您会消耗一百万个微分区——每个 16MB。

您的 Snowflake 账单上可能会显示 16 TB 的存储块......普通表在删除后至少保留 7 天。

为了优化存储,您可以定义一个集群键并按升序加载表,每个块尽可能多地填充一个微分区。


建议#3

如果您需要连续整数,请使用运行速度非常快的数据生成函数:https ://docs.snowflake.net/manuals/sql-reference/functions/seq1.html


还有其他想法吗?

标签: snowflake-cloud-data-platform

解决方案


几周前,雪花旅馆也有人问过这个问题。鉴于您收到的答案,您是否仍然觉得没有答案,然后可能暗示为什么?

如果您只想要一个包含单列序列号的表,请使用 GENERATOR() ,如上面的 #3 所示。否则,如果您需要更多建议,请分享您的具体要求。


推荐阅读