SQL优化:理解SQL的意图

如果你的系统中,通过statspack report或awr report,发现这样的SQL执行比较频繁,而且test表的记录数比较多,test表中附合status = '1'的记录数也非常多,占test表记录数90%的比例吧,从statspack report或awr report可以发现该SQL的逻辑读会相当大,假定该表没有任何索引,那DBA该如何着手进行SQL的优化呢?
SELECT seller_id
FROM (SELECT * FROM (SELECT seller_id, max(gmt_create) FROM test WHERE status = 1 GROUP BY seller_id)
ORDER BY gmt_create DESC)
WHERE rownum <= 10;

[@more@]

方案A
假如test表需要存储空间4g,在test表的(status,gmt_create,sellerid)字段上创建组合索引需要存储空间1g,那在test表(status,gmt_create,sellerid)上创建索引,确实可以有效地提高SQL的性能,因为从全表扫描转换成快速索引全扫描,需要扫描的索引块数虽然远远少于全表扫描时的数据块数,但实际上需要计算的记录数并没有减少,逻辑读还是相当大。
SQL> explain plan for SELECT seller_id
2 FROM (SELECT *
3 FROM (SELECT seller_id, max(gmt_create) AS gmt_create
4 FROM test
5 WHERE status = 1
6 GROUP BY seller_id)
7 ORDER BY gmt_create DESC)
8 WHERE rownum <= 10;
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------
| Id |Operation | Name | Rows |Bytes |Cost |
-----------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 10 | 180 | 7916 |
|* 1 | COUNT STOPKEY | | | | |
| 2 | VIEW | | 14194 | 249K| 7916 |
|* 3 | SORT ORDER BY STOPKEY | | 14194 | 609K| 7916 |
| 4 | SORT GROUP BY | | 14194 | 609K| 7916 |
|* 5 | INDEX FAST FULL SCAN|IDX_TEST_STATUS| 849K| 35M| 1066 |
-----------------------------------------------------------------------
方案B
那我们该如何进一步进行优化呢?现在需要分析一下该SQL的意图,只有明白了SQL的意图,才可以找到更有效的优化方法:该SQL最内层的意图很明显,就是把记录按seller_id进行分组,并按gmt_create进行逆向排序;外层意图就更简单啦,取创建时间最新的10条记录。即然是取最新的10条记录,那我们就可以把该SQL演化一下:
SQL> explain plan for SELECT seller_id
2 FROM (SELECT *
3 FROM (SELECT seller_id, max(gmt_create) AS gmt_create
4 FROM test
5 WHERE status = 1
6 AND gmt_create >= sysdate - 1/24
7 GROUP BY seller_id)
8 ORDER BY gmt_create DESC)
9 WHERE rownum <= 10;
SQL> select * from table(dbms_xplan.display);
---------------------------------------------------------------------
| Id |Operation | Name |Rows |Bytes |Cost |
---------------------------------------------------------------------
| 0 |SELECT STATEMENT | | 10 | 180 | 495 |
|* 1 | COUNT STOPKEY | | | | |
| 2 | VIEW | |13523 | 237K| 495 |
|* 3 | SORT ORDER BY STOPKEY| |13523 | 581K| 495 |
| 4 | SORT GROUP BY | |13523 | 581K| 495 |
|* 5 | INDEX RANGE SCAN |IDX_TEST_STATUS|42482 | 1825K| 78 |
---------------------------------------------------------------------
说明:即然是取最新的10记录,其实是没有必要把所有的数据都group by一次的,所以我们可以取最近一小时的数据,做group by就可以满足需求,如果增量数据很大,也可以考虑取走分钟(5/1440)的增量数据等,通过查询条件gmt_create >= sysdate - 1/24,把许多不需要进行group by的记录都排除了。

也就是说,进行SQL调优时,理解SQL的意图很重要。。。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16648/viewspace-968243/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16648/viewspace-968243/

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值