过程或表用户定义函数中的每个表分配都通过选择、投影等传统关系运算符指定某些数据的转换。然后, 语句的结果将绑定到一个变量,该变量由后续语句数据转换用作输入,或者用作过程的输出变量之一。为了描述过程的数据流, 语句绑定在过程主体的其他位置引用的新变量。
此方法会产生没有负面影响的数据流。定义业务逻辑的声明性质在指定算法时可能需要更深入的思考,但它为 SAP HANA 数据库提供了优化数据流的自由,这可能会导致更好的性能。
以下示例显示在 SQLScript 中实现的简单过程。为了更好地说明高级概念,我们省略了一些详细信息。
CREATE PROCEDURE getOutput( IN cnt INTEGER, IN currency VARCHAR(3),
OUT output_pubs tt_publishers, OUT output_year tt_years)
LANGUAGE SQLSCRIPT READS SQL DATA AS
BEGIN
big_pub_ids = SELECT publisher AS pid FROM books -- Query Q1 GROUP BY publisher HAVING COUNT(isbn) > :cnt;
big_pub_books = SELECT title, name, publisher, -- Query Q2 year, price
FROM :big_pub_ids, publishers, books
WHERE pub_id = pid AND pub_id = publisher
AND crcy = :currency;
output_pubs = SELECT publisher, name, -- Query Q3
SUM(price) AS price, COUNT(title) AS cnt FROM :big_pub_books GROUP BY publisher, name;
output_year = SELECT year, SUM(price) AS price, -- Query Q4 COUNT(title) AS cnt
FROM :big_pub_books GROUP BY year;
END;
此 SQLScript 示例定义一个只读过程,该过程具有 2 个标量输入参数和 2 个表类型的输出参数。第一行包含一个 SQL 查询 Q1,该查询根据出版的书籍数来标识大出版商(使用输入参数 cnt)。接下来,可以在查询 Q2 中确定有关这些出版商及其相应书籍的详细信息。最后,此信息在查询 Q3(按发布者聚合)和 Q4(每年聚合)中分别以 2 种不同的方式聚合。结果表构成了函数的输出表。
SQLScript 中仅使用声明式结构的过程可以完全转换为非循环数据流图,其中每个节点代表一个数据转换。上述示例可以表示为下图中显示的数据流图形。与 SQL 查询类似,图形在执行前进行分析和优化。也可以从另一个过程中调用过程。在数据流图形方面,这种嵌套过程调用可视为使用中间结果并将其输出返回到后续节点的子图。为了进行优化,调用过程的子图与调用过程的图形合并,然后优化生成的图形。优化应用与 SQL 优化器用于逻辑优化(例如过滤器下推)类似的规则。然后,将计划转换为由物理数据库操作(例如,散列连接)组成的物理计划。转换为物理计划涉及使用成本模型和启发式进一步优化。