优化器 #
SphereEx-DBPlusEngine 内置了两种优化器:分片下推引擎和联邦查询引擎。前者是在语句可准备命中分片的情况下进行工作,后者则可针对更为广泛的场景。联邦查询引擎对关联查询、子查询等复杂查询进行优化,同时支持跨多个数据库实例的分布式查询,内部使用关系代数优化查询计划,通过最优计划查询出结果。目前联邦查询优化引擎属于试用功能,虽基本功能可用,但仍需不断完善。
启用联邦查询引擎 #
联邦查询引擎,缺省是不启动的,需要修改参数才能启动。
sql-federation-enabled = true
可使用联邦查询场景 #
联邦查询引擎,主要是工作在不能准确命中分片的情况,下面通过示例进行说明。
- 子查询
子查询和外层查询未同时指定分片键,或分片键的值不一致时,由联邦查询引擎提供支持。
SELECT * FROM (SELECT * FROM t_order) o;
SELECT * FROM (SELECT * FROM t_order) o WHERE o.order_id = 1;
SELECT * FROM (SELECT * FROM t_order WHERE order_id = 1) o;
SELECT * FROM (SELECT * FROM t_order WHERE order_id = 1) o WHERE o.order_id = 2;
- 跨库关联查询
当关联查询中的多个表分布在不同的数据库实例上时,由联邦查询引擎提供支持。假设 t_order 和 t_order_item 是多数据节点的分片表,并且未配置绑定表规则,t_user和t_user_role是分布在不同的数据库实例上的单表,那么联邦查询引擎能够支持如下常用的关联查询:
SELECT * FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 1;
SELECT * FROM t_order o INNER JOIN t_user u ON o.user_id = u.user_id WHERE o.user_id = 1;
SELECT * FROM t_order o LEFT JOIN t_user_role r ON o.user_id = r.user_id WHERE o.user_id = 1;
SELECT * FROM t_order_item i LEFT JOIN t_user u ON i.user_id = u.user_id WHERE i.user_id = 1;
SELECT * FROM t_order_item i RIGHT JOIN t_user_role r ON i.user_id = r.user_id WHERE i.user_id = 1;
SELECT * FROM t_user u RIGHT JOIN t_user_role r ON u.user_id = r.user_id WHERE u.user_id = 1;