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

避免使用游标

虽然有时需要使用游标,但它们还意味着逐行处理。因此,SQL 引擎缺少优化机会。因此,您应该考虑用 SQL 语句中的循环替换游标。

只读访问

若要对游标进行只读访问,请考虑使用简单的 select 或 joins:

CREATE PROCEDURE foreach_proc LANGUAGE SQLSCRIPT AS

Reads SQL DATA

BEGIN

DECLARE val decimal(34,10) = 0;

DECLARE CURSOR c_cursor1 FOR

SELECT isbn, title, price FROM books;

FOR r1 AS c_cursor1 DO

val = :val + r1.price;

END FOR;

END;

此总和也可以由 SQL 引擎计算:

SELECT sum(price) into val FROM books;

在 SQL 引擎中计算此聚合可能会导致在 SQL 执行程序中对多个 CPU 并行执行。

更新和删除

对于更新和删除,请考虑使用以下内容:

CREATE PROCEDURE foreach_proc LANGUAGE SQLSCRIPT AS

BEGIN

DECLARE val INT = 0;

DECLARE CURSOR c_cursor1 FOR

SELECT isbn, title, price FROM books;

FOR r1 AS c_cursor1 DO

IF r1.price > 50 THEN

DELETE FROM Books WHERE isbn = r1.isbn;

END IF;

END FOR;

END;

此删除也可以由 SQL 引擎计算:

DELETE FROM Books 

WHERE isbn IN (SELECT isbn FROM books WHERE price > 50);

在 SQL 引擎中计算此项会通过 SAP HANA 数据库的运行时堆栈减少调用。它还可能受益于内部优化,例如缓冲和并行执行。

插入到表中

CREATE PROCEDURE foreach_proc LANGUAGE SQLSCRIPT AS

BEGIN

DECLARE val INT = 0;

DECLARE CURSOR c_cursor1 FOR SELECT isbn, title, price FROM books;

FOR r1 AS c_cursor1 DO

IF r1.price > 50

THEN

INSERT INTO ExpensiveBooks VALUES(..., r1.title, ...);

END IF;

END FOR;

END;

此插入也可以由 SQL 引擎计算:

SELECT ..., title, ... FROM Books WHERE price > 50 

INTO ExpensiveBooks;

与更新和删除类似,在 SQL 引擎中计算此语句会通过 SAP HANA 数据库的运行时堆栈减少调用。它还可能受益于内部优化,例如缓冲和并行执行。