Redash主查询关联大表子查询性能优化方案咨询
解决Redash跨库关联时全量加载大表导致的查询崩溃问题
针对你遇到的主查询因全量加载百万级users表而崩溃的问题,这里提供几个可行的优化方案:
方案1:拆分查询链路,按需拉取用户数据
核心思路是先过滤出目标公司的产品,再仅拉取这些产品对应的创建者用户,避免全量加载users表:
- 修改
query_2,先过滤目标公司的产品
-- query_2(修改后) SELECT id, name, created_by_id, company_id FROM product WHERE company_id = {{ company_id }}
- 新增
query_3,提取该公司产品对应的唯一用户ID
-- query_3 SELECT DISTINCT created_by_id FROM query_2
- 修改
query_1,仅拉取关联到的用户
-- query_1(修改后) SELECT id, name, company_id FROM users WHERE id IN (SELECT created_by_id FROM query_3) AND company_id = {{ company_id }}
- 主查询保持原有关联逻辑
-- main query SELECT * FROM query_2 p JOIN query_1 u on u.id = p.created_by_id WHERE ... -- 保留其他需要的过滤条件
这样query_1只会拉取目标公司下实际参与产品创建的用户,数据量会大幅压缩。
方案2:直接编写跨库关联主查询(绕过查询结果数据源的全量加载)
如果你的Redash数据源配置支持跨库访问,且底层数据库允许跨库关联,可以直接把查询合并,避免先全量拉取子查询结果:
-- main query(直接跨库关联示例) SELECT p.*, u.name AS creator_name FROM [产品库标识].product p JOIN [用户库标识].users u ON u.id = p.created_by_id WHERE p.company_id = {{ company_id }} AND ... -- 其他过滤条件
替换[产品库标识]和[用户库标识]为实际的数据库名称或实例标识,确保Redash有权限同时访问两个库。
方案3:用预过滤的静态查询结果替代全量子查询
- 手动运行一次带目标
company_id的query_1,将结果保存为Redash的已保存查询结果(作为静态数据源); - 主查询改用这个预过滤后的静态数据源关联
query_2; - 若需支持多公司,可针对不同公司创建对应的预过滤查询结果,或通过Redash的调度功能定期刷新数据。
内容的提问来源于stack exchange,提问作者DragonPow
相关产品推荐
相关产品推荐

