1. 概述
1.1 版本
| FineBI 版本 | 功能变更 |
|---|---|
| 7.0 | - |
| 7.0.13 | 新增「获取额外信息」开关:可按需导出 traceID、完整 SQL、BI 查询描述; 「导出详细信息」产物由 .xlsx 改为 .zip 压缩包; 明细 Excel 新增 traceID 列; 「片段内容」列不再记录 SQL 语句,取消 SQL 超 3 万字符分 sheet 逻辑 |
1.2 应用场景
当用户遇到以下问题,即便反复检查仍无法确定原因时,可使用「性能分析」定位耗时环节。
1)创建自助数据集时,某些步骤执行速度较慢。
2)预览自助数据集时,某个步骤表现较为迟缓。
3)预览仪表板时,操作速度相对较慢。
4)编辑组件时,操作响应较为缓慢。
若问题需要交给数据库管理员(DBA)、帆软技术支持或运维人员进一步分析,通常还需要三类信息,可通过「获取额外信息」一次性拿到:
1)完整 SQL:交给 DBA 做执行计划分析或在数据库侧复测。
2)BI 查询描述:还原本次分析用到的维度、指标、过滤、排序,降低问题复现的沟通成本。
3)traceID:把本次前端查询与后端日志、运维平台链路分析关联起来。
1.3 功能简介
FineBI 提供「性能分析」功能,帮助用户快速定位仪表板预览与编辑、组件编辑、自助数据集编辑过程中的性能问题。
用户可在线查看核心信息与详细信息,也可将信息导出到本地用于协同排查。
2. 功能入口
本节说明可以在哪些界面启动性能分析。FineBI 多处支持「性能分析」功能。
| 内容 | 位置说明 |
|---|---|
数据 | 「我的分析」主题中,数据编辑界面,支持进行「性能分析」
|
| 组件 | 「我的分析」主题中,组件编辑界面,支持进行「性能分析」
|
| 仪表板 | 「我的分析」主题中,仪表板编辑界面,支持进行「性能分析」
|
「我的分析」主题中,仪表板预览界面,支持进行「性能分析」
| |
| 「目录」中查看仪表板时,支持进行「性能分析」
|
3. 查看核心信息
本节帮助用户在线初步判断性能问题出在哪个环节。
点击「性能分析」按钮后,弹窗中在线展示本次分析的「核心信息」,按查询逐条列出各阶段耗时。如下图所示:

「核心信息」表字段介绍如下表所示:
| 字段 | 说明 |
|---|---|
| 用户 | 触发性能分析的FineBI用户 |
| 一级资源名称 | 性能分析内容为数据时:一级资源名称为数据集名称 性能分析内容为仪表板时:一级资源名称为仪表板名称 |
| 二级资源名称 | 性能分析内容为数据时:二级资源名称为数据集中分析步骤名称 性能分析内容为仪表板时:二级资源名称为仪表板中组件名称 |
| 查询ID | UUID,每次查询请求的唯一编号 |
| 查询等待时间(ms) | 从用户点击查询到进入查询准备阶段的时间 |
| 查询准备阶段(ms) | 查询的执行计划解析 查询内容为直连数据时:代表生成 SQL 的阶段 查询内容为抽取数据时:代表抽取引擎的查询描述生成的阶段 |
| 查询执行时间(ms) | 查询内容为直连数据时:代表直连数据库执行时间 查询内容为抽取数据时:代表抽取引擎计算时间 |
| 数据传输时间(ms) | 查询结果返回给FineBI的时间 若直连引擎自己计算,则没有该时间 |
| 内存计算时间(ms) | 所有 FineBI 代码的计算时间 例如树引擎分页计算,二次计算等 |
| 前端渲染时间(ms) | 后端计算完毕之后,前端js计算、渲染和展示的时间之和 |
| 总查询时间(ms) | 从用户点击查询到前端加载完成的总时间 |
| 查询开始时间 | 用户触发性能检测的时间点,精确到秒 |
4. 查看详细信息
如需进一步确认性能问题原因、了解下一步处理方式,可查看单个查询的「详细信息」。
1)在性能分析弹窗中点击对应「查询ID」,进入该次查询的性能明细页面,查看各执行阶段的耗时与结果集情况。
2)在明细页面点击「导出查询计划」,可导出该次查询的查询计划文件。
注:若需要一次性获得该对象所有查询请求的详细信息,请使用「导出详细信息」。

「详细信息」表字段介绍如下表所示:
| 数据列名称 | 说明 |
|---|---|
| 用户 | 触发性能分析的FineBI用户 |
| 一级资源名称 | 性能分析内容为数据时:一级资源名称为数据集名称 性能分析内容为仪表板时:一级资源名称为仪表板名称 |
| 二级资源名称 | 性能分析内容为数据时:二级资源名称为数据集中分析步骤名称 性能分析内容为仪表板时:二级资源名称为仪表板中组件名称 |
| 组件类型 | 1:分组表 2:交叉表 3:明细表 4:图表 5:自助数据集 6:筛选控件 7:文本组件 |
| 查询ID | UUID,每次查询请求的唯一编号 |
| traceID | 7.0.13 及之后版本新增列,开启「获取额外信息」时记录 即链路追踪 ID,与 BI 后端日志、运维平台链路分析中的 traceID 一致,可直接用于跨系统关联定位,仅在导出的明细 Excel 中提供 |
| 执行阶段 | 1)等待开始阶段 因为浏览器的限制导致查询之前需要排队 2)查询准备
3)SQL 执行
4)数据传输 数据库返回的结果传给 BI 服务器花的时间 5)内存计算 直连引擎计算的时间 6)等待结束 等待结束阶段(把仪表的所有组件都打包成一个请求时会有该数据),最先出来的组件要等到最后出来的组件的等待时间 7)前端渲染
|
| 片段ID | 一次查询可能有多个查询请求 例如创建数据连接、SQL 执行、数据传输都可能拆分成多个请求,需分别统计 7.0.13 及之后版本,片段 ID 同时用于导出包中 SQL 文件与查询描述文件的命名,便于按片段对照查看 |
| 耗时(ms) | 若该阶段有统计时间,则记录该阶段的耗时 |
| 片段内容 | 创建数据连接阶段记录数据连接名 7.0.13及之后版本:SQL 执行阶段不在该列记录 SQL 语句,SQL 统一记录在压缩包内的{fragmentId}_{timestamp}.txt文件中,同时取消 SQL 超过 3 万字符分 sheet 的逻辑 7.0.12及之前版本:SQL 执行阶段记录执行的 SQL ,SQL 超过 3w 字符的,导出的文件会生成两个 sheet ,包含详细信息和超出 3w 字符的 SQL 如果有临时表注入逻辑,查询 SQL 前面会有,excel insert cost xxx | selcet * ....这样的标识符 |
| 返回结果集行数 | 记录数据传输阶段,内存计算阶段,前端渲染阶段的返回结果集行数 |
| 返回结果集列数 | 记录数据传输阶段,内存计算阶段,前端渲染阶段的返回结果集列数 |
| 执行引擎类型 | 抽取 直连 |
| 开始时间 | 「执行阶段」的开始时间 |
| 结束时间 | 「执行阶段」阶段的结束时间 |
| 异常信息 | 当某个阶段出现错误时,打印报错信息 |
| 查询请求合计 | 记录本次查询的所有执行阶段耗时总和 记录本次查询的开始和结束时间 |
| 总合计 | 记录所有查询的所有执行阶段耗时总和 记录所有查询的开始和结束时间 |
5. 获取额外信息
在排查问题时如需获取 traceID、完整 SQL 与 BI 查询描述,用于交付 DBA 调优、研发复现问题与运维做全链路分析,可启用「获取额外信息」开关。
5.1 操作步骤
1)进入出现性能问题的仪表板、组件或数据编辑界面。点击「性能分析」,打开性能分析弹窗。
2)在与「导出详细信息」按钮同一行的右侧区域,打开「获取额外信息」开关。

4)回到仪表板或数据界面,手动触发一次查询,例如刷新仪表板、切换筛选后点击查询、重新预览组件。

5)等待查询结束,即可在「性能分析」中导出包含额外信息的内容包。
注:开关仅记录开启后触发的查询,开启前已完成的历史查询不会补录。因此必须先开启开关,再触发查询。

5.2 效果说明
开关开启后,可在导出包中获得下表三类信息。
| 额外信息 | 作用 | 获取位置 |
|---|---|---|
| traceID | 与 BI 后端日志、运维平台链路分析中的 traceID 一致,可直接检索本次查询的全链路信息 | 导出包中的性能分析明细 Excel,见新增的 traceID 列 |
| 完整查询 SQL | 不受字符数限制的完整 SQL,可直接交给 DBA 做执行计划分析或在数据库侧复测 | 导出包中按片段 ID 命名的 .txt 文件 |
| BI 查询描述 | 本次查询用到的维度、指标、过滤、排序等完整分析上下文,便于研发或技术支持还原分析场景 | 导出包中以 queryRecorders 开头的 .json 文件 |

6. 导出信息
本章说明如何把性能分析信息导出到本地,以及导出包中各文件的用途。
6.1 操作步骤
1)在性能分析弹窗中确认需要导出的查询已执行结束。
2)点击「导出详细信息」按钮。
3)浏览器下载获取压缩包,按需将文件提供给 DBA、技术支持或运维人员。
注1:时间戳格式为 yyyyMMdd_HHmmss,取触发导出操作的时间,用于区分多次导出的批次。
注2:查询执行过程中「导出详细信息」按钮为灰化状态,需等待查询结束后再导出。
注3:性能分析弹窗中显示了哪些查询的信息,导出内容即包含哪些查询。

6.2 导出包内容说明
导出内容为压缩包(.zip),包内文件与开关状态的对应关系如下表所示:
| 文件 | 格式 | 文件名 | 内容说明 | 获取额外信息开关关闭 | 获取额外信息开关开启 |
|---|---|---|---|---|---|
| 性能分析明细 | .xlsx | PerformAnalysisDetail_{时间戳}.xlsx | 各查询各执行阶段的明细数据,字段说明详见本文「5. 查看详细信息」;新增 traceID 列 | 有 | 有 |
| 查询 SQL | .txt | 以片段 ID 开头,形如 {片段ID}_{时间戳}_{查询标识}.txt | 每条 SQL 一个独立文件。若本次导出包含 N 条 SQL,则包内有 N 个 .txt 文件 | 有,SQL 可能被截断 | 有,为完整 SQL,不受字符数限制 |
| BI 查询描述 | .json | 形如 queryRecorders_{片段ID}_{时间戳}_{查询标识}.json | 开关开启后触发的查询请求的查询描述,每个查询一个独立文件,内容为 JSON 数组 | 无 | 有 |
注:SQL 文件与查询描述文件均以「片段ID」开头命名,可与明细 Excel 中的「片段ID」列一一对照。

7. 性能反馈
1)非超管用户发现模板问题后,可点击「性能分析>性能反馈」按钮,将模板性能反馈给管理员。如下图所示:

2)超管收到性能反馈消息提示,可根据反馈督促对应人员优化仪表板/数据集。

8. 注意事项
8.1 逻辑详解
核心信息中的各个时间段,以及详细信息中的各个执行阶段,匹配和计算逻辑可参考下表:
核心信息 时间段 | 详细信息 执行阶段 | 说明 |
|---|---|---|
| 查询等待时间 | 等待开始阶段 | 定义说明: 从用户点击查询到进入查询准备阶段的时间,因为浏览器的限制导致查询之前需要排队 一般6个浏览器发送请求未返回时,会阻塞第7个及之后浏览器的请求 计算逻辑: [(请求返回的时间点-开始发请求的时间点)-后端查询消耗的时间点] 异常排查方向: 1)查询并发过高 2)超出浏览器并发限制 |
| 查询准备阶段 | 执行计划构建 | 定义说明: FineBI直连引擎在拿到查询请求时构建如何组织查询的阶段 计算逻辑: Widget生成BICriteria或者HyperCriteria的过程 ETLContext生成ETLFlow的过程 异常排查方向: 数据集/模板/组件太复杂 |
| SQL生成及优化 | 定义说明: 对应的查询转换成 SQL 以及对 SQL 进行优化的阶段 计算逻辑: SQL 的生成和优化的时间 | |
| - | 创建数据库连接 | 定义说明: SQL执行前,需要获取和数据库的连接 计算逻辑: DataBaseSouceEngine中数据库连接创建的时间 |
| 查询执行时间 | SQL执行 | 定义说明: 数据库执行查询的时间或TCERID引擎执行时间 由于执行时间包括临时表的时间,因此SQL执行时间可能比日志中要长 SQL 执行阶段记录执行的 SQL ,SQL 超过 3w 字符的,导出的文件会生成两个 sheet ,包含详细信息和超出 3w 字符的 SQL 如果有临时表注入逻辑,查询 SQL 前面会有excel insert cost xxx | selcet * ....之类的标识符 计算逻辑: DataBaseSouceEngine中数据库的查询时间 异常排查方向: 1)数据库性能问题 2)SQL语句需要优化 |
| 数据传输时间 | 数据传输(数据库-BI) | 定义说明: 数据库的查询结果返回给FineBI服务器的时间, 计算逻辑: 数据库查询结果集传输到BI服务器的时长+数据压缩时长/数据模型生成时长 如果没有这两部分,时间为0是正常的 异常排查方向: 1)若数据库查询结果集传输到BI服务器的时长过大,请排查服务器网络问题 2)若数据模型构建耗时过大,请优化分析逻辑 |
| 内存计算时间 | 内存计算 | 定义说明: 直连引擎计算的时间,所有BI代码的计算时间 计算逻辑: 自助数据集无内存计算时间,仪表板中包含以下过程: 分组时间:postGroup time 排序计算时间:tree sort 分页计算时间:groupPage procedure time: 依据排序计算时间:treeSortGist 树过滤计算时间:groupTreeFilter 树构建时间:treeMaker time 异常排查方向: 查询返回的结果集过大,需要优化分析逻辑 |
| 前端渲染时间 | 数据传输(BI服务器-用户浏览器) | 定义说明: FineBI服务器将数据传给用户浏览器的时间 计算逻辑: 后端结束的时间点-前端接收到数据的时间点 |
| 前端渲染 | 定义说明: 后端计算完毕之后,前端js计算、渲染和展示的时间之和 计算逻辑: 组件最终渲染出来的时间点-前端拿到数据的时间点 异常排查方向: 分页行数过大 | |
| 总查询时间 | - | 从用户点击查询到前端加载完成的总时间 |
| 查询开始时间 | - | 用户触发性能检测的时间 |
8.2 常见问题
| 问题描述 | 原因分析 |
|---|---|
| 「导出详细信息」按钮为灰色,无法导出 | 原因分析:正在执行查询中,无法同时导出详细信息 解决方案:请耐心等待查询结束,即可导出详细信息 |
| 查询等待时间为负数 | 原因分析: 6.0.15及之前,查询等待时间=请求返回的响应中服务端开始时间StartTime(BI服务器时间)- 查询请求的开始时间(用户浏览器的时间) 由于浏览器和服务器时区/时间可能不一致,导致毫秒级的差异,因此存在时间为负数的情况 解决方案:请升级工程至6.0.16及以上版本,查询等待时间逻辑优化 |
| 查询执行时间为0 | 原因分析:查询命中了缓存,没有从数据库全新取数 解决方案:可先修改单表的缓存策略,再进行性能分析 |
| 查询执行时间与后台日志时间不一致 | 原因分析: 数据集使用临时表制作,性能分析时会计算临时表的执行时间,而后台日志中不计算此段时间,因此两者不一致 解决方案:正常情况,无需解决 |
| 总查询时间≠分项耗时合计值 | 原因分析: 一个组件可能触发了多个SQL,而多条SQL并不一定是依次执行的。 查询执行时间=所有SQL执行时间总和 总查询时间中的查询执行时间=从第一条SQL执行开始,到最后一条SQL执行结束的时长 两者并不相等,因此总查询时间可能会小于分项耗时合计值 解决方案:无 |
| 单个查询的详细信息中,存在多个SQL生成及优化阶段 | 原因分析: 一个组件可能触发了多个SQL 例如去重、中位数、fixed等操作,由于需要计算父节点的合计值,就需要发送多条SQL 解决方案:正常情况,无需解决 |
