如何使用存储过程在 redshift 上创建 10000 个表?
Posted
技术标签:
【中文标题】如何使用存储过程在 redshift 上创建 10000 个表?【英文标题】:How to create 10000 tables on redshift using stored procedure? 【发布时间】:2020-06-03 13:13:27 【问题描述】:我需要使用存储过程在 Redshift 数据库上创建 10000 个表。能否提供一个示例存储过程?
这是为 Snowflake 创建 100000 个表的存储过程
create or replace procedure tablecheck()
returns string
language javascript
strict
execute as owner
as
$$
var i = 1;
while (i < 1001)
var sql_command =
'create table performance.al55260.tab'+i+'(col1 int,col2 int,col3 int,col4 int,col5 int,col6 int,col7 int,col8 int,col9 int,col10 int,col11 int,col12 int,col13 int,col14 int,col15 int,col16 int,col17 int,col18 int,col19 int,col20 int,col21 int,col22 int,col23 int,col24 int,col25 int,col26 int,col27 int,col28 int,col29 int,col30 int,col31 int,col32 int,col33 int,col34 int,col35 int,col36 int,col37 int,col38 int,col39 int,col40 int,col41 int,col42 int,col43 int,col44 int,col45 int,col46 int,col47 int,col48 int,col49 int,col50 int);'
try
snowflake.execute (
sqlText: sql_command
);
// Return a success/error indicator.
catch (err)
return "Failed: " + err; // Return a success/error indicator.
i++;
return 'yes';
$$;
我正在寻找 Redshift 上的存储过程或函数来实现相同的目标。
如果您对以任何其他编程方式创建数百万个表有任何想法,那就太好了。
【问题讨论】:
问你一个问题 - 为什么?你的用例是什么?我认为您需要重新设计,所以请分享。 在your previous question 和这个中,您都谈到并标记了 Redshift,但您的程序(以及您对上一个问题的编辑中的评论)表明您正在使用 Snowflake Cloud平台,而不是 Redshift。你的实际架构是什么?而且,就 Jon Scott 的观点,以及之前版本的问题,你想做什么?整件事给人一种XY Problem 的感觉。 创建这么多表不太可能是您的数据的良好架构。如果所有表共享相同的架构,最好使用一个单个表,其中包含一个标识差异属性的列(例如al55260
),然后将该列设置为 SORTKEY。
这个想法是为了测试我们内部应用程序的性能。我们只想检查我们的应用程序是否处理大量数据。
【参考方案1】:
请注意,当前每个 Redshift 集群的最大表数为 9,900(对于较小的实例类型)或 20,000(对于较大的实例类型)。这记录在"Quotas and limits in Amazon Redshift"
这是我对 Redshift 存储过程的翻译:
CREATE OR REPLACE PROCEDURE tablecheck(
table_count IN INTEGER
, return_val OUT VARCHAR
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
schema_check BOOLEAN;
loop_count INTEGER;
sql_command VARCHAR(MAX);
BEGIN
SELECT NVL(TRUE,FALSE) INTO schema_check
FROM pg_namespace
WHERE nspowner > 1
AND nspname = 'tablecheck';
IF schema_check IS NULL THEN
CREATE SCHEMA tablecheck;
ELSE
DROP SCHEMA tablecheck CASCADE;
CREATE SCHEMA tablecheck;
END IF;
loop_count := 0;
WHILE (loop_count < table_count) LOOP
loop_count := loop_count + 1;
sql_command := 'CREATE TABLE tablecheck.tbl_' || loop_count
||'(col1 int, col2 int, col3 int, col4 int, col5 int,'
||' col6 int, col7 int, col8 int, col9 int, col10 int,'
||' col11 int, col12 int, col13 int, col14 int, col15 int,'
||' col16 int, col17 int, col18 int, col19 int, col20 int,'
||' col21 int, col22 int, col23 int, col24 int, col25 int,'
||' col26 int, col27 int, col28 int, col29 int, col30 int,'
||' col31 int, col32 int, col33 int, col34 int, col35 int,'
||' col36 int, col37 int, col38 int, col39 int, col40 int,'
||' col41 int, col42 int, col43 int, col44 int, col45 int,'
||' col46 int, col47 int, col48 int, col49 int, col50 int);';
EXECUTE sql_command;
RAISE INFO 'Create table: %', loop_count;
END LOOP;
SELECT 'Complete' INTO return_val;
DROP SCHEMA tablecheck CASCADE;
END
$$;
你在 Redshift 中调用这个存储过程如下:
BEGIN; CALL tablecheck(100); END;
-- …
-- INFO: Create table: 99
-- INFO: Create table: 100
-- return_val
-- ------------
-- Complete
--
-- Time: 720.729 ms
欲了解更多信息,请参阅"Overview of stored procedures in Amazon Redshift"
【讨论】:
以上是关于如何使用存储过程在 redshift 上创建 10000 个表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Redshift 中的 select 语句中使用存储过程