使用存储过程插入表?

Posted

技术标签:

【中文标题】使用存储过程插入表?【英文标题】:Table insertions using stored procedures? 【发布时间】:2019-10-18 19:24:45 【问题描述】:

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


还有其他方法可以更快地使用存储过程执行表插入吗? 我开始构建一个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


还有其他想法吗?

【问题讨论】:

【参考方案1】:

几周前,雪花旅馆也有人问过这个问题。 鉴于您收到的答案,您是否仍然觉得没有答案,然后也许暗示一下原因?

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

【讨论】:

如果您有答案,请务必分享,我们可以在新的堆栈溢出空间中帮助彼此成长。我看到您非常热衷于帮助客户,谢谢!

以上是关于使用存储过程插入表?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:创建存储过程以将另一个存储过程的结果插入表中

将存储过程结果插入临时表

VB.net 使用存储过程插入多个相关表。只有第一个表接收插入的行

SQL Server:使用动态表名插入存储过程

如何使用 SQL 使用 DB2 中的存储过程插入表?

使用存储过程将数据插入从其他表派生的表中