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 TABLE和APPENDING TABLE有什么区别?
📌点击查看答案
INTO TABLE itab:用结果集覆盖内表。之前的内容丢失。APPENDING TABLE itab:将结果集追加到内表的已有内容中。之前的行保留。
第4题 - PACKAGE SIZE [应用]
需要处理数据库表中的 100 万条记录,但要限制内存使用。如何实现?
📌点击查看答案
PACKAGE SIZE:1 | SELECT * FROM large_table INTO TABLE lt_data PACKAGE SIZE 10000 |
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 | IF lt_driving IS NOT INITIAL. |
始终在 FOR ALL ENTRIES 之前检查 IS NOT INITIAL!
第7题 - 子查询 [应用]
编写一个 SELECT 读取至少有一个航班连接的所有航空公司。
📌点击查看答案
1 | SELECT * FROM scarr INTO TABLE lt_carriers |
子查询返回 SPFLI 表中存在的所有承运人 ID。仅从 SCARR 中选择匹配的承运人。
第8题 - 聚合函数 [应用]
编写一个 SELECT 返回每个航空公司的预订总数和最高价格。
📌点击查看答案
1 | SELECT carrid, |
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 限制 |