
1.6 诊断智能扫描错误结果集
Exadata的智能扫描功能涉及计算节点和存储节点的很多模块,其中的任何一个模块出现问题,都有可能导致智能扫描的结果集出现异常。智能扫描功能涉及的层次和模块如表1.5所示。
表1.5 智能扫描涉及的模块及说明

1.6.1 智能扫描流程图
如图1.9所示是计算节点数据库和存储节点上智能扫描的整个流程图及实现智能扫描的主要模块。

图1.9 智能扫描流程图
ROWSRC模块用于在Exadata进行表扫描、索引快速全扫描的时候决定是否使用直接路径读取。在这种情况下,将在KDS(数据层)、KTR(事务层)和KCBL(直接路径读)中积累元数据,然后再传递给KCFIS模块。KCFIS模块是Exadata中的一个新模块,它负责在数据库上驱动智能IO。KCFIS模块使用一个与ASM相关的名为KFIS的模块,实现数据库的数据文件地址空间到存储节点Griddisk地址空间的转换。
KCFIS模块使用LIBCELL库实现了与Exadata存储节点的通信接口,元数据和Griddisk的块号列表、它们的偏移量及其长度都会被发送到存储节点(LIBCELL库使用SKGXP提供可靠的网络接口)。存储节点的CELLSRV进程接收这些信息,启动Block IO和/或Flash IO,并使用FPLIB库来应用智能IO卸载操作。在智能扫描过程中,FPLIB库创建的结果集最终被发送回计算节点的数据库。
下面对存储节点上的智能扫描部分进一步细化,存储节点上智能扫描的整个流程图及实现智能扫描的主要模块如图1.10所示。

图1.10 存储节点智能扫描流程图
■ 存储节点CELLSRV进程中的PredicateDisk模块通过PredicateDiskRead代码发布IO请求。
■ PredicateDiskRead代码向Storage Idx进行咨询,检查是否有必要向底层的存储发布这些IO请求。
■ 在StorageIdx Metadata元数据的帮助下,Storage Idx和FPLIB库将决定是否应该发布IO。对于给定的谓词,如果Storage Idx表明不需要发布IO扫描,那么PredicateDiskRead将不会为那些IO请求发出真实的IO扫描。
■ 如果Storage Idx表明IO请求需要发出IO扫描,那么PredicateDiskRead将向FlashCache,也可能是Griddisk(也即硬盘),发出真实的IO扫描操作。
■ 如果PredicateDiskRead实际上发布了真正的IO扫描操作,那么扫描的IO将通过PredicateFilter模块进行过滤操作。
■ PredicateFilter模块使用FPLIB库执行筛选动作,FPLIB库可以使用CommitCache和NLS库,生成的结果将被发送回计算节点的数据库。
1.6.2 智能扫描错误结果集的诊断
正如在前面所看到的,智能扫描操作中涉及许多层面和模块,错误结果集可能出自任何一个层面或模块中的软件缺陷。有选择地关闭这些层面或模块,可以帮助确认是哪些层面或模块代码导致了智能扫描操作产生错误结果集。
1.cell_offload_processing参数
该数据库参数的默认值为true,也即开启智能扫描。如果将该参数设置为false,则表示关闭智能扫描。
当某条SQL语句出现错误的结果集问题时,首先要做的是禁用智能扫描,并检查是否仍然存在错误结果集的问题。
将这个参数设置为false,也即关闭智能扫描,如果问题不再发生,则说明这是智能扫描特性引发的问题;如果问题仍然发生,则说明这并不是智能扫描特性引发的问题,很可能出自更高层次的数据层。
2._kcfis_cell_passthru_enabled参数
该数据库参数的默认值为false,也即禁用存储节点的pass-thru模式进行智能扫描,而选用smart-io模式进行智能扫描。如果该参数值设置为true,则表明支持使用存储节点的pass-thru模式进行智能扫描。
将这个参数设置为true,如果问题不再发生,则说明是FPLIB库的问题;如果问题仍然发生,则说明这并不是FPLIB库的问题,而很可能是KCFIS模块、Storage Index模块、PredicateDisk模块、FlashCache模块的问题。
3._kcfis_storageidx_disabled参数
该数据库参数的默认值为false,也即启用存储索引特性。如果该参数值设置为true,则表示关闭存储索引特性。
存储索引特性会依赖于存储索引元数据,同时在FPLIB库的帮助下避免了智能扫描所不需要的IO扫描。
将这个参数设置为true,如果问题不再发生,则说明是存储索引特性引发的问题;如果问题仍然发生,则说明不是存储索引特性引发的问题。
4._kcfis_kept_in_cellfc_enabled参数
该数据库参数的默认值为true,也即在智能扫描时,允许从FlashCache中获取需要的数据;如果该参数值设置为false,则表明在智能扫描时,不允许从FlashCache中获取需要的数据。
将这个参数设置为false,如果问题不再发生,则说明是FlashCache传输的问题或FlashCache与智能扫描交互过程中产生的问题;如果问题仍然发生,则说明不是FlashCache引发的问题。
注意:直到11.2.0.2版本,数据库中才出现了_kcfis_kept_in_cellfc_enabled参数。在11.2.0.1版本中,与之对应的数据库参数为_kcfis_control1,其参数值为0或1。其中0为默认值,表示在Smart Scan时,允许从FlashCache中获取需要的数据,而参数值为1,则表示在智能扫描时,不允许从FlashCache中获取需要的数据。
5._kcfis_rdbms_blockio_enabled参数
该数据库参数的默认值为false,也即禁用计算节点数据库的Block IO模式。如果该参数值设置为true,则表示开启计算节点数据库的Block IO模式。
将这个参数设置为true,如果问题不再发生,则这个问题变得有点费解了。也许仍然是KCFIS模块的问题,可能需要提交Exadata研发部门进一步确认。如果问题仍然发生,则说明很可能是计算节点数据库的KCFIS模块引发的问题。
针对SQL语句在智能扫描过程中出现了错误的结果集,可以参照图1.11所示的过程进行一一排查。

图1.11 智能扫描出现错误结果集排错流程图
如果按照图1.11所示流程进行排查,仍无法定位是什么模块导致出现错误的结果集,则需要向Oracle官方提交“服务请求”。在提交“服务请求”时,可以依据MOS文档Exadata:How to diagnose smart scan and wrong results(Doc ID 1260804.1)来收集相关的信息。