Open SQL 进阶练习

Open SQL 进阶练习 (10题)

#practice #open-sql #sql-joins #database #table-buffer #lobs

相关概念

📌核心模式(点击查看)
关键词 答案
FOR ALL ENTRIES 空表 读取整个数据库表 – 始终检查 NOT INITIAL
JOIN 绕过缓冲 表缓冲对 JOIN 无效
聚合函数 COUNT、SUM、AVG、MAX、MIN 配合 GROUP BY
左外连接 左表所有行 + 右表匹配;右侧仅一个表
LOB 流 最多 16 个同时打开;尽快关闭

第1题 - 表缓冲类型 [记忆]

说出三种 SAP 表缓冲类型及其各自的使用场景。

📌点击查看答案
缓冲类型 行为
完全缓冲 首次访问时加载整个表。用于小且很少更改的表。
泛型缓冲 加载匹配泛型键区域的记录。用于按部分键聚簇访问的场景。
单条记录缓冲 按需加载单条记录。用于大表且分散访问的场景。

第2题 - 缓冲绕过 [记忆]

哪些 Open SQL 语句或附加项会绕过 SAP 表缓冲?

📌点击查看答案
以下内容会绕过表缓冲:
  • JOIN(任何类型)
  • 子查询WHERE col IN (SELECT ...)
  • 聚合函数(SUM、COUNT、AVG 等)
  • GROUP BY / HAVING
  • ORDER BY(当不使用排序表时)
  • DISTINCT
  • SELECT ... FOR UPDATE
  • Native SQL

第3题 - INTO 变体 [记忆]

INTO TABLEAPPENDING TABLE 有什么区别?

📌点击查看答案
  • INTO TABLE itab:用结果集覆盖内表。之前的内容丢失。
  • APPENDING TABLE itab:将结果集追加到内表的已有内容中。之前的行保留。

第4题 - PACKAGE SIZE [应用]

需要处理数据库表中的 100 万条记录,但要限制内存使用。如何实现?

📌点击查看答案
使用 PACKAGE SIZE
1
2
3
4
SELECT * FROM large_table INTO TABLE lt_data PACKAGE SIZE 10000
WHERE conditions.
" 处理 lt_data(每次 10,000 行)
ENDSELECT.

PACKAGE SIZE n 每次获取 n 行,保持内存使用受控。SELECT…ENDSELECT 循环重复直到所有行处理完毕。


第5题 - INNER vs OUTER JOIN [记忆]

用示例解释 INNER JOIN 和 LEFT OUTER JOIN 的区别。

📌点击查看答案
  • INNER JOIN:仅返回两表中 ON 条件都匹配的行。
  • LEFT OUTER JOIN:返回左表的所有行,加上右表中匹配的行。如果没有匹配,右侧列为初始值。

示例:SBOOK INNER JOIN SCARR -> 仅有匹配航空公司的预订。SBOOK LEFT OUTER JOIN STRAVELAG -> 所有预订,包括没有旅行社的(旅行社字段为初始值)。


第6题 - FOR ALL ENTRIES 陷阱 [应用]

如果执行 SELECT ... FOR ALL ENTRIES IN lt_empty ...,其中 lt_empty 没有行,会发生什么?如何预防?

📌点击查看答案
如果驱动表为FOR ALL ENTRIES 读取整个数据库表(无边界条件)。这会导致严重的性能问题。

预防方法:

1
2
3
4
5
IF lt_driving IS NOT INITIAL.
SELECT * FROM dbtab INTO TABLE lt_result
FOR ALL ENTRIES IN lt_driving
WHERE key = lt_driving-key.
ENDIF.

始终在 FOR ALL ENTRIES 之前检查 IS NOT INITIAL


第7题 - 子查询 [应用]

编写一个 SELECT 读取至少有一个航班连接的所有航空公司。

📌点击查看答案
1
2
SELECT * FROM scarr INTO TABLE lt_carriers
WHERE carrid IN ( SELECT DISTINCT carrid FROM spfli ).

子查询返回 SPFLI 表中存在的所有承运人 ID。仅从 SCARR 中选择匹配的承运人。


第8题 - 聚合函数 [应用]

编写一个 SELECT 返回每个航空公司的预订总数和最高价格。

📌点击查看答案
1
2
3
4
5
6
SELECT carrid,
COUNT(*) AS booking_count,
MAX( price ) AS max_price
FROM sbook
GROUP BY carrid
INTO TABLE lt_result.

GROUP BY carrid 按航空公司分组,COUNT(*) 计算每组的预订数,MAX(price) 找出每组的最高价格。


第9题 - LOB 定位器 [分析]

比较 LOB 定位器和 LOB 流。各在什么时候使用?

📌点击查看答案
方面 定位器
访问模式 对子序列的随机访问 顺序读/写
关键方法 GET_LENGTH, GET_SUBSTRING, FIND READ(length), DATA_AVAILABLE, SKIP
复制 LOB 可在数据库端复制而不传输 不用于复制
资源使用 较高的数据库资源消耗 较低的数据库资源使用
与内表兼容 兼容 不兼容
最大打开数 每个 LUW 1000 同时 16 个

当需要元数据、子字符串或在数据库端复制 LOB 时使用定位器。当需要顺序处理大 LOB 时(如逐段读取大文本文件)使用


第10题 - 游标处理 [分析]

比较 SELECT ... INTO TABLE(数组读取)与基于游标的处理(OPEN CURSOR / FETCH)。各在什么时候更优?

📌点击查看答案
方面 INTO TABLE 游标 (OPEN/FETCH)
数据传输 一次性全部 分块 (FETCH)
内存 高(整个结果集) 受控(按次获取)
数据库游标 自动管理 显式管理
可重复 否(必须重新 SELECT) 是(RESET 游标)
使用场景 中小型结果集 超大数据集,顺序处理

INTO TABLE 更简单,适用于可管理的结果集。游标适用于无法同时将所有行保存在内存中的超大数据集。PACKAGE SIZE 提供类似的内存控制而无需显式游标管理。


📌模式总结(点击查看)
关键词 答案
缓冲类型 完全、泛型、单条记录
缓冲绕过 JOIN、子查询、聚合、GROUP/ORDER/DISTINCT
INTO vs APPENDING INTO 覆盖,APPENDING 添加
FOR ALL ENTRIES 始终先检查 NOT INITIAL
INNER vs OUTER JOIN INNER=两边都匹配;LEFT OUTER=左表全部+匹配
聚合 COUNT、SUM、AVG、MAX、MIN 配合 GROUP BY
定位器 vs 流 随机访问 vs 顺序;1000 vs 16 限制