在领导节点上支持的 SQL 函数
一些 Amazon Redshift 查询是在计算节点上分发和运行的;而另一些查询仅在领导节点上运行。
每当查询引用用户创建的表或系统表(具有 STL 或 STV 前缀的表和具有 SVL 或 SVV 前缀的系统视图)时,领导节点就会将 SQL 分发到计算节点。仅引用目录表(驻留在领导节点上的、具有 PG 前缀的表,如 PG_TABLE_DEF)或不引用任何表的查询在领导节点上以独占方式运行。
部分 Amazon Redshift SQL 函数仅在领导节点上受支持,在计算节点上不受支持。使用领导节点函数的查询必须在领导节点上而不是计算节点上以独占方式执行,否则它将返回错误。
必须在领导节点上以独占方式运行的每个函数的文档包含一个注释,指示该函数将在引用用户定义的表或 Amazon Redshift 系统表时返回错误。有关在领导节点上以独占方式运行的函数的列表,请参阅仅领导节点函数。
示例
以下示例使用示例 TICKIT 数据库。有关示例数据库的更多信息,请转到示例数据库。
CURRENT_SCHEMA
CURRENT_SCHEMA 函数是仅适用于领导节点的函数。在此示例中,查询不会引用表,因此它将在领导节点上以独占方式运行。
select current_schema();
current_schema --------------- public
在下一个示例中,查询引用系统目录表,因此它将在领导节点上以独占方式运行。
select * from pg_table_def where schemaname = current_schema() limit 1;
schemaname | tablename | column | type | encoding | distkey | sortkey | notnull ------------+-----------+--------+----------+----------+---------+---------+--------- public | category | catid | smallint | none | t | 1 | t
在下一个示例中,查询引用驻留在计算节点上的 Amazon Redshift 系统表,因此它将返回错误。
select current_schema(), userid from users;
INFO: Function "current_schema()" not supported. ERROR: Specified types or functions (one per INFO message) not supported on Amazon Redshift tables.
SUBSTR
SUBSTR 也是一个仅适用于领导节点的函数。在下面的示例中,由于查询没有引用表,因此在领导节点上以独占方式运行。
SELECT SUBSTR('amazon', 5);
+--------+ | substr | +--------+ | on | +--------+
在下面的示例中,查询引用驻留在计算节点上的表。这会导致错误。
SELECT SUBSTR(catdesc, 1) FROM category LIMIT 1;
ERROR: SUBSTR() function is not supported (Hint: use SUBSTRING instead)
要成功运行前一个查询,请使用 SUBSTRING。
SELECT SUBSTRING(catdesc, 1) FROM category LIMIT 1;
+---------------------------------+ | substring | +---------------------------------+ | National Basketball Association | +---------------------------------+
FACTORIAL()
FACTORIAL() 是仅适用于主节点的函数。在下面的示例中,由于查询没有引用表,因此在领导节点上以独占方式运行。
SELECT FACTORIAL(5);
factorial ------------- 120
在下面的示例中,查询引用驻留在计算节点上的表。使用查询编辑器 v2 运行时会导致错误。
create table t(a int); insert into t values (5); select factorial(a) from t;
ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables. Info: Function "factorial(bigint)" not supported.