PawSQL对TPC-H基准的Q2进行的自动性能优化后,性能提升了160250.60%。本文将深入探讨 PawSQL 对 TPC-H 基准测试中 Q2 查询的优化过程,重点分析查询重写、索引优化和执行计划改进的具体策略。通过详细的定量分析,评估这些优化策略对性能提升的实际效果。
本文的案例可在线查看:https://www.pawsql.com/statement/1837384704930025474
Q2 查询涉及 6 个表(supplier, nation, partsupp, part, lineitem),结构复杂,包含多层嵌套子查询和多个连接条件。查询的主要目标是找出特定国家(如 ALGERIA)中,供应某类零件(名称以 "green" 开头)且具有最低成本的供应商。
select supplier.s_name, supplier.s_address
from supplier, nation
where supplier.s_suppkey in (
select partsupp.ps_suppkey
from partsupp
where partsupp.ps_partkey in (
select part.p_partkey
from part
where part.p_name like 'green%')
and partsupp.ps_availqty > (select 0.5 * sum(lineitem.l_quantity)
from lineitem
where lineitem.l_partkey = partsupp.ps_partkey
and lineitem.l_suppkey = partsupp.ps_suppkey
and lineitem.l_shipdate >= date '1997-01-01'
and lineitem.l_shipdate < date '1997-01-01' + interval '1' YEAR))
and supplier.s_nationkey = nation.n_nationkey
and nation.n_name = 'ALGERIA'
order by supplier.s_name
PawSQL 通过将 IN
子查询转换为更高效的 EXISTS
子查询,优化了SQL 结构:
select /*QB_1*/ supplier.s_name, supplier.s_address
from supplier, nation
where exists (
select /*QB_3*/ partsupp.ps_suppkey
from partsupp, part
where part.p_name like 'green%'
and part.p_partkey = partsupp.ps_partkey
and partsupp.ps_availqty > (select /*QB_2*/ 0.5 * sum(lineitem.l_quantity)
from lineitem
where lineitem.l_partkey = partsupp.ps_partkey
and lineitem.l_suppkey = partsupp.ps_suppkey
and lineitem.l_shipdate >= date '1997-01-01'
and lineitem.l_shipdate < date '1997-01-01' + interval '1' YEAR)
and partsupp.ps_suppkey = supplier.s_suppkey)
and supplier.s_nationkey = nation.n_nationkey
and nation.n_name = 'ALGERIA'
order by supplier.s_name
part
和 partsupp
表的条件合并,减少中间结果集的大小。PawSQL 建议为 Q2 查询创建以下索引:
CREATE INDEX PAWSQL_IDX0357178651 ON tpch.nation(N_NAME,N_NATIONKEY,N_REGIONKEY);
CREATE INDEX PAWSQL_IDX0327029402 ON tpch.part(P_NAME);
CREATE INDEX PAWSQL_IDX0485218972 ON tpch.lineitem(L_PARTKEY,L_SUPPKEY,L_SHIPDATE);
CREATE INDEX PAWSQL_IDX0214365528 ON tpch.supplier(S_NATIONKEY,S_SUPPKEY,S_NAME,S_ADDRESS);
nation.n_name
的查找,支持快速定位国家。part.p_name
的模糊匹配查询,提升过滤效率。nation
表的连接及最终结果的排序输出。PAWSQL_IDX0327029402
索引,扫描行数从 2000 行降至 16 行。PAWSQL_IDX0485218972
索引,显著减少处理行数。lineitem
表上的多余索引,以优化 DML 操作性能。nation.n_name = 'ALGERIA'
),优先使用索引匹配。PawSQL 在处理复杂查询优化时展现了强大的能力,以下是关键结论:
PawSQL专注于数据库性能优化自动化和智能化,提供的解决方案覆盖SQL开发、测试、运维的整个流程,广泛支持MySQL、PostgreSQL、OpenGauss、Oracle等主流商用和开源数据库,以及openGauss,人大金仓、达梦等国产数据库,为开发者和企业提供一站式的创新SQL优化解决方案;有效解决了数据库SQL性能及质量问题,提升了数据库系统的稳定性、应用性能和基础设施利用率,为企业节省了大量的运维成本和时间投入。