那个会更好?

简介: 例子摘自:《oracle高效设计》select *from big_table t1where last_ddl_time = (select max(last_ddl_time) from big_table t2 where t2.

例子摘自:《oracle高效设计》
select *
from big_table t1
where last_ddl_time = (select max(last_ddl_time)
from big_table t2
where t2.owner = t1.owner )
/

select *
from big_table t1, ( select owner, max(last_ddl_time) max_time
from big_table
group by owner ) t2
where t1.owner = t2.owner
and t1.last_ddl_time = t2.max_time
/

select owner, last_ddl_time, object_name, object_type
from ( select t1.*,
max(last_ddl_time) over (partition by owner) max_time
from big_table t1
)
where last_ddl_time = max_time
/


这是oracle高效设计(中文版P393)中的关于使用分析函数的例子,我的测试结果是使用分析函数并不会很好!big_table大小45M,记录数406032。


例子1:
Execution Plan
----------------------------------------------------------
Plan hash value: 4038969119

----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 293 | 34867 | 2580 (5)| 00:00:31 |
|* 1 | HASH JOIN | | 293 | 34867 | 2580 (5)| 00:00:31 |
| 2 | VIEW | VW_SQ_1 | 24 | 624 | 1312 (7)| 00:00:16 |
| 3 | HASH GROUP BY | | 24 | 336 | 1312 (7)| 00:00:16 |
| 4 | TABLE ACCESS FULL| BIG_TABLE | 405K| 5540K| 1253 (3)| 00:00:16 |
| 5 | TABLE ACCESS FULL | BIG_TABLE | 405K| 35M| 1260 (3)| 00:00:16 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("LAST_DDL_TIME"="VW_COL_1" AND "OWNER"="T1"."OWNER")


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11219 consistent gets
0 physical reads
0 redo size
60026 bytes sent via SQL*Net to client
450 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1224 rows processed

例子2与1相同:忽略

但是例子3如下:

Execution Plan
----------------------------------------------------------
Plan hash value: 4069026481

-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 405K| 43M| | 6153 (2)| 00:01:14 |
|* 1 | VIEW | | 405K| 43M| | 6153 (2)| 00:01:14 |
| 2 | WINDOW SORT | | 405K| 18M| 46M| 6153 (2)| 00:01:14 |
| 3 | TABLE ACCESS FULL| BIG_TABLE | 405K| 18M| | 1260 (3)| 00:00:16 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("LAST_DDL_TIME"="MAX_TIME")


Statistics
----------------------------------------------------------
23 recursive calls
8 db block gets
5606 consistent gets
9604 physical reads
0 redo size
30144 bytes sent via SQL*Net to client
450 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
1 sorts (disk)
1224 rows processed

发现有许多physical reads读,检查
show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 80M

发现PGA太小,修改如下:

alter system set pga_aggregate_target=2000M scope=memory

在执行:

-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 405K| 43M| | 6153 (2)| 00:01:14 |
|* 1 | VIEW | | 405K| 43M| | 6153 (2)| 00:01:14 |
| 2 | WINDOW SORT | | 405K| 18M| 46M| 6153 (2)| 00:01:14 |
| 3 | TABLE ACCESS FULL| BIG_TABLE | 405K| 18M| | 1260 (3)| 00:00:16 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("LAST_DDL_TIME"="MAX_TIME")


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
5606 consistent gets
0 physical reads
0 redo size
30308 bytes sent via SQL*Net to client
450 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1224 rows processed


发现physical reads为0,但是实际上逻辑读虽然减少了,但是执行的时间实际没有例子1快。我的测试发现:


例子1,2:执行时间:3XX msecs。
例子3(pga_aggregate_target=80M)下:4 secs
例子3(pga_aggregate_target=2000M)下:7xx msecs。

也就是讲在pga_aggregate_target设置适当的情况下,例子3执行才会好一些。

目录
相关文章
|
Linux 开发工具 Windows
改善编程体验: IdeaVimExtension介绍
# 改善编程体验: IdeaVimExtension介绍 ## 动机 Intellij IDEA是个非常优秀的开发环境,提供了相当好用的快捷键,让用户有机会脱离鼠标来使用IDE. 另外官方还提供了IdeaVim插件,熟悉vim的用户可以使用几乎与vim相同的方式操作IDEA的编辑器来编写代码.
4699 0
|
13天前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
23 3
|
7月前
|
缓存 编译器 数据处理
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
666 0
|
7月前
|
数据采集 机器学习/深度学习 自然语言处理
数据更多更好还是质量更高更好?这项研究能帮你做出选择
【5月更文挑战第28天】研究探索了在机器学习中数据质量与规模的权衡,提出质量-数量权衡(QQT)概念和神经网络可扩展定律,考虑数据非同质性、效用衰减及多数据池交互。结果表明预训练时数据质量和规模同等重要,应根据情况权衡。但研究局限于模型预训练、特定类型模型和模拟数据验证。[[链接](https://arxiv.org/pdf/2404.07177.pdf)]
56 1
|
程序员 开发工具
衡量程序员能力最好的方式
衡量程序员能力最好的方式
121 1
如何彻底的理解需求,做出更好的软件
如何彻底的理解需求,做出更好的软件
69 0
AIGC 有哪些优势,同时可以从哪方面更好的去优化
AIGC 有哪些优势,同时可以从哪方面更好的去优化
|
算法 关系型数据库 MySQL
如何更好的学习专业知识
如何更好的学习专业知识
如何更好的生活
大多数人都想提高自己的生活品质,也都在尝试着这样做,那怎么样才能做到呢? 钓鱼 按李笑来的意思,要把日常中用到的各种概念理的很清楚,如果你想的足够明白,那么你越明智,苦恼就少很多。