使用存储过程插入表?
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 所示。否则,如果您需要更多建议,请分享您的具体要求。
【讨论】:
如果您有答案,请务必分享,我们可以在新的堆栈溢出空间中帮助彼此成长。我看到您非常热衷于帮助客户,谢谢!以上是关于使用存储过程插入表?的主要内容,如果未能解决你的问题,请参考以下文章