在推出针对MySQL、PostgreSQL等开源数据库的智能索引推荐工具Paw Index Advisor之后,PawSQL近日推出了一站式的SQL性能优化工具PawSQL Advisor。PawSQL Advisor除了集成了Paw Index Advisor强大的索引推荐功能外,还把业界关于关系数据库查询优化最佳实践整合其中,从正确性和性能两个方面对SQL进行审查和重写优化,一站解决SQL性能优化问题。
Note:PawSQL Advisor已在IntelliJ应用市场上线,有兴趣的朋友请下载试用。
PawSQL Advisor的功能框架如下,
索引的作用有如下三个:
PawSQL Advisor继承了Paw Index Advisor的智能索引推荐能力,它针对不同的语法结构,结合系统的数据字典、统计信息,分析评估所有的索引可选项,基于启发式算法和基于代价的算法,进行索引的推荐。具体信息请参考Paw Index Advisor的相关介绍。
PawSQL Advisor提供一个对推荐出来的SQL和索引进行验证的功能,它连接到一个测试库,并收集推荐之前、执行之后的执行计划及估算的代价等信息,对推荐信息进行验证,并把验证后有效的推荐呈现给用户。所以最终我们可以在最终的推荐结果里看到:
同时,所有推荐的索引都是在某个SQL的执行计划中出现过,并对此SQL的性能有帮助的。
和Paw Index Advisor一样,PawSQL Advisor也以常用IDE的插件提供服务,对于基于IntelliJ的IDE,
查看pawTuningSummary文件获取优化的整体信息,主要包括四部分。
/********************************************************************\* ** PawSQL Optimization Summary ** ** Powered by PawSQL(2022- ) ** *\********************************************************************/1. Optimization Summary- There are 104 query analyzed;- There are 3 optimization rewrites for 2 queries;- There are 207 violations of optimization rule against 68 queries;- There are 79 indices recommended for 76 queries;- There is 7151.69% performance improvement.2. Optimization Rule Violations- RuleCntGtThanZeroRewrite: [query41.sql-stmt1]- RuleFuncWithColumnInPredicate: [query8.sql-stmt1, query64.sql-stmt1]- RuleNoCond4NonAggSelect: [query8.sql-stmt1, query33.sql-stmt1, query77.sql-stmt1]- RuleNumOfJoinTables: [query46.sql-stmt1, query84.sql-stmt1 ...]...3. Recommended Indices- CREATE INDEX PAW_IDX0571264614 ON TPDS.ITEM(I_CURRENT_PRICE,I_ITEM_SK,I_ITEM_ID);- CREATE INDEX PAW_IDX0205789795 ON TPDS.ITEM(I_CATEGORY,I_CURRENT_PRICE);- CREATE INDEX PAW_IDX0866411600 ON TPDS.ITEM(I_MANUFACT_ID,I_PRODUCT_NAME);- CREATE INDEX PAW_IDX1917304708 ON TPDS.ITEM(I_MANAGER_ID,I_ITEM_SK);...4. Optimized Query List- query1.sql-stmt1, performance improves by 438790.26%[costBefore=71231.89,costAfter=16.23]-- Contributing indices:[PAW_IDX0410610163, PAW_IDX0827928186, , PRIMARY, PRIMARY]- query10.sql-stmt1, performance improves by 3974905.54%[costBefore=1097101.53,costAfter=27.59]-- Contributing indices:[PAW_IDX0410610163, PAW_IDX0426775377, PRIMARY, PAW_IDX0410610163, PAW_IDX0127412485, PAW_IDX0410610163, PAW_IDX1696683664, PRIMARY, PRIMARY]- query11.sql-stmt1, performance improves by 28.56%[costBefore=322948.99,costAfter=251195.7199]-- Contributing indices:[PAW_IDX0410610163, PAW_IDX2001631254, PRIMARY, PAW_IDX1991665978, PRIMARY, PRIMARY]... 主要包括:
/********************************************************************\* ** SQL Tuning(Query and Index) Details ** ** Powered by PawSQL(2022 - ) ** *\*******************************************************************/1. Original Query(formatted)select c_orders.c_count, count(*) as custdist from (select customer.c_custkey, count(orders.o_orderkey) as c_count from TPCH.customer left outer join TPCH.orders on (customer.c_custkey = orders.o_custkey and orders.o_comment not like '%pending%deposits%') group by customer.c_custkey) as c_orders group by c_orders.c_count order by custdist desc, c_orders.c_count desc2. Rewritten Query3. Auditing Rule Violations- Rule:RulePredicateLikeStartWithWildcard- Violation Parts:orders.o_comment not like '%pending%deposits%';4. Index Tuning- CREATE INDEX PAW_IDX2038863975 ON TPCH.CUSTOMER(C_CUSTKEY,C_NAME(16));- CREATE INDEX PAW_IDX0890500073 ON TPCH.ORDERS(O_CUSTKEY,O_COMMENT(16),O_ORDERKEY);5. Validation details5.1 Performance improves by 69246.63%[cost_before=8.089240324150001E9,after_cost=1.166493588E7]5.2 Query Plan(before)-> Sort: custdist DESC, c_orders.c_count DESC -> Table scan on -> Aggregate using temporary table -> Table scan on c_orders (cost=2.50..2.50 rows=0) -> Materialize (cost=2.50..2.50 rows=0) -> Table scan on -> Aggregate using temporary table -> Left hash join (orders.O_CUSTKEY = customer.C_CUSTKEY) (cost=8089149945.61 rows=80891468955) -> Table scan on customer (cost=90373.50 rows=795135) -> Hash -> Filter: (not((orders.O_COMMENT like '%pending%deposits%'))) (cost=0.02 rows=101733) -> Table scan on orders (cost=0.02 rows=101733)5.3 Query Plan(after)-> Sort: custdist DESC, c_orders.c_count DESC -> Table scan on -> Aggregate using temporary table -> Table scan on c_orders (cost=0.01..102760.96 rows=8220678) -> Materialize (cost=4611746.21..4714507.16 rows=8220678) -> Group aggregate: count(orders.O_ORDERKEY) (cost=3789678.43 rows=8220678) -> Nested loop left join (cost=2967610.67 rows=8220678) -> Index scan on customer using PAW_IDX2038863975 (cost=90373.50 rows=795135) -> Filter: (not((orders.O_COMMENT like '%pending%deposits%'))) (cost=2.58 rows=10) -> Index lookup on orders using PAW_IDX0890500073 (O_CUSTKEY=customer.C_CUSTKEY) (cost=2.58 rows=10) 对PawSQL Advisor感兴趣的小伙伴请在公众号申请试用。PawSQL专注数据库性能优化工具研发,有兴趣的小伙伴请关注公众号 PawSQL,
| 留言与评论(共有 0 条评论) “” |