snowflake-cloud-data-platform - 使用存储过程插入表?
问题描述
(为雪花用户投稿,希望得到更多帮助)
是否有另一种方法可以更快地使用存储过程执行表插入?我开始构建一个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
还有其他想法吗?
解决方案
几周前,雪花旅馆也有人问过这个问题。鉴于您收到的答案,您是否仍然觉得没有答案,然后可能暗示为什么?
如果您只想要一个包含单列序列号的表,请使用 GENERATOR() ,如上面的 #3 所示。否则,如果您需要更多建议,请分享您的具体要求。
推荐阅读
- vhdl - 无法以“r”模式打开文件
- angular - 无法读取 Ionic 4、Angular 8 上未定义的属性“订阅”
- android - 如何将数据从 PageAdapter 传递到 Fragment?
- javascript - Angular-Highcharts:更改 plotOptions 后快速重绘图表
- naudio - 保存音频文件时处理动态采样率
- swift - 故事板不包含带有标识符错误的视图控制器?
- scala - 找到第二个匹配的隐式
- c++ - 有没有办法通过 using 声明来增加可见性?
- fortran - 如何在属于同一多态变量的两个元素之间进行交换?
- django - 来自 genericforeignkey 字段模型的 Django Rest Framework search_fields 视图集