您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

NO_INLINE 和 INLINE 提示

SQLScript 编译器结合语句来优化代码。提示使您能够阻止或强制内嵌表变量。

备注使用 HINT 时,需要仔细考虑。在某些情况下,使用 HINT 最终可能会更昂贵。

冻结语句内嵌

SQLScript 中的整体优化指导原则表明如有可能,会合并相关语句。例如,您有两个表变量分配,如下所示:

tab   = select A, B, C from T where A = 1;

tab2 = select C from :tab where C = 0;

这些语句合并为一个语句并执行:

select C from (select A,B,C from T where A = 1) where C=0;

但是,在某些情况下,合并语句会导致非最佳计划,从而导致所执行语句的性能低于最佳性能。在这些情况下,有助于冻结特定语句的组合。因此,SAP 引入了名为 HINT 的 NO_INLINE。通过将该 HINT 置于 select 语句的末尾,它将阻塞该语句的组合(或内联)到其它语句中。以下是使用此项的示例:

tab   = select A, B, C from T where A = 1 WITH HINT(NO_INLINE);

tab2 = select C from :tab where C = 0;

通过向表变量 tab 中添加 WITH HINT (NO_INLINE),可以冻结该语句的组合,并确保这两个语句分别执行。

强制语句内嵌

如果要将嵌套过程的 语句合并到外部过程中,使用名为 INLINE 的提示将有所帮助。

目前,属于嵌套过程的 语句不会合并到调用过程的 语句中。在以下示例中,您定义了两个过程。

CREATE PROCEDURE procInner (OUT tab2 TABLE(I int)) 

LANGUAGE SQLSCRIPT READS SQL DATA

AS

BEGIN

tab2 = SELECT I FROM T;

END;

CREATE PROCEDURE procCaller (OUT table2 TABLE(I int))

LANGUAGE SQLSCRIPT READS SQL DATA

AS

BEGIN

call procInner (outTable);

table2 = select I from :outTable where I > 10;

END;

通过执行过程 ProcCaller,可单独执行两个表分配。如果要合并这两个语句,可以通过在输出表变量的 语句中使用 WITH HINT (INLINE) 来实现。使用此示例,编写方式如下:

CREATE PROCEDURE procInner (OUT tab2 TABLE(I int)) 

LANGUAGE SQLSCRIPT READS SQL DATA

AS

BEGIN

tab2 = SELECT I FROM T WITH HINT (INLINE);

END;

现在,如果执行过程 ProcCaller,则 ProcInner 中的表变量 tab2 的 语句将合并到 tab 过程中变量 ProcCaller 的 语句中:

SELECT I FROM (SELECT I FROM T WITH HINT (INLINE)) where I > 10;