python-关键字参数与非关键字参数(可变参数)详解
2015-08-19 01:53
627 查看
今天刚看到一篇简单的SQL调优,自己也试了一下优化。原文如下:
http://valen.blog.ccidnet.com/blog-htm-do-showone-uid-51502-type-blog-itemid-291732.html
也做了一个简单的测试并做延伸:
Oracle数据库中,有个表:COST_LEDG_H(数据大约300多万)
执行语句:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select max(INIT_UNIT_COST),max(INIT_UNIT_COST) from COST_LEDG_H;
执行计划如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 1442 (5)| 00:00:18 |
| 1 | SORT AGGREGATE | | 1 | 4 || |
| 2 | INDEX FAST FULL SCAN| COST_LEDG_H_INDEX1 | 3106K| 11M| 1442 (5)| 00:00:18 |
这里发现索引是:INDEX FAST FULL SCAN , 后面大约有6千多个IO次数,
通过下列语句查看索引的IO次数:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> select leaf_blocks 叶块数, blevel 级别, distinct_keys 不同值, clustering_factor 集的势 from user_indexes where index_name=upper('COST_LEDG_H_INDEX1');
输出结果如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->叶块数 级别 不同值 集的势
---------------------- ---------------------- ---------------------- --------------
6253 2 5418 1107960
这时发现该索引的全部页IO次数也是6千多次。这样以来可以确定索引是全部扫描,从根部一直到叶全部扫描了一遍。效率很低:
1,通过索引方式(向前或后向后查询)
2,非索引查找(全部索引搜索)
这里我们看到这里Oracle采用了第2种查询方式,效率比较低,因为这里是一个最大,和一个最小值,数据库如果从第1种方式查也是必需从头到尾的查询其实也就是第二种方式。这里只是一次索引查询的结果。如果是两次索引查询,就可以大大提高查询性能。
如改写成如下语句:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select min(INIT_UNIT_COST) from COST_LEDG_H
union all select max(INIT_UNIT_COST) from COST_LEDG_H;
或
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select (select min(INIT_UNIT_COST) from COST_LEDG_H)
,(select max(INIT_UNIT_COST) from COST_LEDG_H) from dual
http://valen.blog.ccidnet.com/blog-htm-do-showone-uid-51502-type-blog-itemid-291732.html
也做了一个简单的测试并做延伸:
Oracle数据库中,有个表:COST_LEDG_H(数据大约300多万)
执行语句:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select max(INIT_UNIT_COST),max(INIT_UNIT_COST) from COST_LEDG_H;
执行计划如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 1442 (5)| 00:00:18 |
| 1 | SORT AGGREGATE | | 1 | 4 || |
| 2 | INDEX FAST FULL SCAN| COST_LEDG_H_INDEX1 | 3106K| 11M| 1442 (5)| 00:00:18 |
这里发现索引是:INDEX FAST FULL SCAN , 后面大约有6千多个IO次数,
通过下列语句查看索引的IO次数:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> select leaf_blocks 叶块数, blevel 级别, distinct_keys 不同值, clustering_factor 集的势 from user_indexes where index_name=upper('COST_LEDG_H_INDEX1');
输出结果如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->叶块数 级别 不同值 集的势
---------------------- ---------------------- ---------------------- --------------
6253 2 5418 1107960
这时发现该索引的全部页IO次数也是6千多次。这样以来可以确定索引是全部扫描,从根部一直到叶全部扫描了一遍。效率很低:
原因:
我们看看为何Oracle数据库为何要全部扫描索引,我们先来看看索引查询方式,索引只有两种查询:1,通过索引方式(向前或后向后查询)
2,非索引查找(全部索引搜索)
这里我们看到这里Oracle采用了第2种查询方式,效率比较低,因为这里是一个最大,和一个最小值,数据库如果从第1种方式查也是必需从头到尾的查询其实也就是第二种方式。这里只是一次索引查询的结果。如果是两次索引查询,就可以大大提高查询性能。
如改写成如下语句:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select min(INIT_UNIT_COST) from COST_LEDG_H
union all select max(INIT_UNIT_COST) from COST_LEDG_H;
或
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->select (select min(INIT_UNIT_COST) from COST_LEDG_H)
,(select max(INIT_UNIT_COST) from COST_LEDG_H) from dual
扩展:
这次我在SQL server 2005中查询类似语句,速度很快,看了一下执行计划,SQL server 2005 智能的将一次查询索引分成了两次索引查找。这点SQL server 2005 要比Oracle 10gR2要聪明一些。相关文章推荐
- python-装饰器
- (转载)Python中:self和__init__的含义 +
- Python入门(十四) 字符串
- Python中字典的基础知识归纳小结
- 详解Python中映射类型(字典)操作符的概念和使用
- 详解Python中映射类型的内建函数和工厂函数
- 深入理解Python中字典的键的使用
- Python中的集合类型知识讲解
- 深入解析Python中的集合类型操作符
- Python中集合的内建函数和内建方法学习教程
- 关于Panda3D version 1.81版本遇到的问题
- Python格式化日期
- 【转载】在Ubuntu下配置舒服的Python开发环境
- Instant Python 中文缩减版
- 好久没来了,重出江湖,共享个python34+pyqt+pyserial串口工具源码
- Python Foundation - part two
- Python解LeetCode 131: Palindrome Partitioning(Python中的浅复制与深复制)
- python科学计算_numpy_线性代数/掩码数组/内存映射数组
- Python学习(一)初识
- vijos - P1543极值问题(斐波那契数列 + 公式推导 + python)