用一个案例讲解应用程序越来越慢的原因
2009-05-12 20:37:36来源:未知 阅读 ()
这篇论坛文章(赛迪网技术社区)主要介绍了一个导致应用程序越来越慢的的实际案例,详细内容请参考下文:
案例:
发现应用程序慢,开始把目光放在检查商业逻辑的SQL上面,觉得没什么问题,但是执行时间大大超出我的预期。
后来询问开发人员,原来最初会取工单表里面的最近工单时间,最早工单时间来做对比。
根据经验,对索引字段做MAX或者MIN是很快的,因为索引是有序,优化器直接到索引头或者尾部去取rowid就可以了。
但是打开程序一看,SQLpreparement里面的句子是这样的:
select min(billtime),MAX(billtime) from billcontent
觉得有问题了,一看执行计划,恍然大悟:
Execution Plan
----------------------------------------------------------
Plan hash value: 1499044795
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 5126 (3)| 00:01:02 | | |
| 1 | SORT AGGREGATE | | 1 | 8 | | | | |
| 2 | PARTITION RANGE SINGLE| | 7653K| 58M| 5126 (3)| 00:01:02 | 1 | 1 |
| 3 | PARTITION LIST ALL | | 7653K| 58M| 5126 (3)| 00:01:02 | 1 | 21 |
| 4 | INDEX FAST FULL SCAN| IDX_ANALYSE_CONTENT_2 | 7653K| 58M| 5126 (3)| 00:01:02 | 1 | 21 |
------------------------------------------------------------
Statistics
----------------------------------------------------------
26745 consistent gets
是INDEX FAST FULL SCAN,26745 个一致读,5126 的Cost,大概查了一下,该索引拥有27632个块,现在对索引做了完全扫描。
对于一致读和Cost的计算方法,这里暂不多述。
只查一个极限值话:
select min(billtime) from billcontent;
Execution Plan
----------------------------------------------------------
Plan hash value: 4137395070
-----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 3 (0)| 00:00:01 | | |
| 1 | SORT AGGREGATE | | 1 | 8 | | | | |
| 2 | PARTITION RANGE SINGLE | | 7653K| 58M| 3 (0)| 00:00:01 | 1 | 1 |
| 3 | PARTITION LIST ALL | | 7653K| 58M| 3 (0)| 00:00:01 | 1 | 21 |
| 4 | INDEX FULL SCAN (MIN/MAX)| IDX_ANALYSE_CONTENT_2 | 7653K| 58M| 3 (0)| 00:00:01 | 1 | 21 |
--------------------------------------------------------------
Statistics
----------------------------------------------------------
42 consistent gets
计划是INDEX FULL SCAN (MIN/MAX),(MIN/MAX)表明只会访问索引的头或尾,开销大大减小,只有42个一致读和极低的Cost,正常情况只能是
这个的两倍多。
马上动手改为:
SELECT
(select min(calltime) from analyse_content ),
(select MAX(calltime) from analyse_content )
FROM dual
Execution Plan
----------------------------------------------------------
Plan hash value: 2326664376
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- sql查询慢是什么原因 2019-12-04
- SQL Server数据体系和应用程序逻辑详解 2009-05-12
- SQL Server应用程序的高级Sql注入 2009-05-12
- 大内存SQL Server数据库的加速剂 2009-05-12
- 解析SQL Server数据体系和应用程序逻辑 2009-05-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash