Power BI Desktop连接Oracle加自定义SQL后取数永久卡在评估阶段
问题根因
当你在Oracle.Database函数中传入Query参数时,函数将直接返回你自定义SQL的执行结果,而非完整的数据库层级导航结构。你原代码中后续筛选Schema、提取指定表的步骤,相当于在SQL返回的结果集中寻找不存在的数据库层级节点,所以会永久卡在评估阶段。
可行解决方法
方案1:简化M查询,删除多余导航步骤
直接保留SQL查询步骤即可,无需后续的表导航操作,正确代码如下:
let Source = Oracle.Database("PPM_PROD", [HierarchicalNavigation=true, Query="SELECT * FROM PPM_DEV.BI_TIMESHEET WHERE (ACTUAL_TIME > 0) OR (OVERTIME > 0) "]) in Source
提示:测试阶段可以在SQL末尾加上
AND ROWNUM < 10,先验证查询逻辑是否能正常返回少量数据,确认无误后再移除限制加载全量数据。
方案2:使用查询折叠功能,无需手写SQL
如果你不想硬编码SQL语句,可以保留你最初能正常运行的查询,之后直接在Power Query界面添加筛选条件:筛选ACTUAL_TIME > 0 或 OVERTIME > 0,只要Power BI的查询折叠功能正常开启,筛选逻辑会自动转换为等效的Oracle SQL语句发送到数据库执行,执行效率和手写SQL完全一致,且后续调整筛选条件更灵活。
性能优化建议
- 请DBA在Oracle数据库侧为
ACTUAL_TIME和OVERTIME字段创建联合索引,200万行的表如果没有索引,全表扫描会大幅拉长查询时间 - 升级Power BI Desktop的Oracle连接驱动到官方最新版本,旧版本驱动存在已知的查询兼容性问题,可能导致加载卡顿
内容的提问来源于stack exchange,提问作者Burçin Kermen
相关产品推荐
相关产品推荐

