虽然有时需要使用游标,但它们还意味着逐行处理。因此,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 数据库的运行时堆栈减少调用。它还可能受益于内部优化,例如缓冲和并行执行。