[20170420]表达式加0或者减0不一样.txt

简介: [20170420]表达式加0或者减0不一样.txt --//oracle 有时候避免某个索引采用字段+0或者-0的方式,不使用索引,但是两者存在一点点区别,通过例子说明。

[20170420]表达式加0或者减0不一样.txt

--//oracle 有时候避免某个索引采用字段+0或者-0的方式,不使用索引,但是两者存在一点点区别,通过例子说明。

1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> create table t as select rownum id1,round(rownum/50,0) id2,lpad('x',100,'x') name from dual connect by level <=4e5;
Table created.

execute sys.dbms_stats.gather_table_stats ( OwnName => user),TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false)

2.测试:
SCOTT@book> select count(*) from t where id2=100;
  COUNT(*)
----------
        50

Plan hash value: 2966233522

------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |  1782 (100)|          |      1 |00:00:00.04 |    6449 |   6446 |
|   1 |  SORT AGGREGATE    |      |      1 |      1 |     4 |            |          |      1 |00:00:00.04 |    6449 |   6446 |
|*  2 |   TABLE ACCESS FULL| T    |      1 |     50 |   200 |  1782   (1)| 00:00:22 |     50 |00:00:00.04 |    6449 |   6446 |
------------------------------------------------------------------------------------------------------------------------------

SCOTT@book> select count(*) from t where id2+0=100;
  COUNT(*)
----------
        50

Plan hash value: 2966233522
------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |  1782 (100)|          |      1 |00:00:00.07 |    6449 |   6446 |
|   1 |  SORT AGGREGATE    |      |      1 |      1 |     4 |            |          |      1 |00:00:00.07 |    6449 |   6446 |
|*  2 |   TABLE ACCESS FULL| T    |      1 |     50 |   200 |  1782   (1)| 00:00:22 |     50 |00:00:00.07 |    6449 |   6446 |
------------------------------------------------------------------------------------------------------------------------------

SCOTT@book> select count(*) from t where id2-0=100;
  COUNT(*)
----------
        50
Plan hash value: 2966233522
------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |       |  1782 (100)|          |      1 |00:00:00.08 |    6449 |   6446 |
|   1 |  SORT AGGREGATE    |      |      1 |      1 |     4 |            |          |      1 |00:00:00.08 |    6449 |   6446 |
|*  2 |   TABLE ACCESS FULL| T    |      1 |   4000 | 16000 |  1782   (1)| 00:00:22 |     50 |00:00:00.08 |    6449 |   6446 |
------------------------------------------------------------------------------------------------------------------------------

3.分析我这里没有建立索引在字段ID2上,执行计划选择全表扫描,但是你如果仔细看E-Rows就可以看出几种的区别。

id2=100    E-Rows 50
id2+0=100  E-Rows 50
id2-0=100  E-Rows 4000

--//很明显oracle在分析生成执行计划上+0,-0是区别对待的,采用+0方式,oracle视乎知道执行者选择绕过索引(当然我没建立),估算E-Rows的统计信息是正确的。
--//而采用-0方式,oracle把这样的表达式当作函数对待,按照1%取E_rows ,400000*0.01=4000。
--//知道这个没什么意思,只是提醒自己要注意一些细节。

目录
相关文章
|
架构师 测试技术 C语言
软件测试的优势和劣势
我们需要对软件测试有清晰的认识。那么作为软件测试,和软件开发相比,又有哪些优势呢?
554 0
|
4月前
|
搜索推荐 开发者 UED
如何检测301重定向是否成功:完整指南
301重定向是网站维护与SEO优化的关键技术,用于将旧URL永久指向新URL。本文详解了301重定向的定义、检测必要性及6种检测方法(如浏览器开发者工具、cURL命令、在线工具等),并提供了常见问题排查和最佳实践建议,助您确保重定向成功实施,提升用户体验与搜索引擎优化效果。
269 19
|
11月前
|
敏捷开发 安全 测试技术
软件开发的要点有哪些?
软件开发过程包括需求分析、设计、编码、测试、上线与维护五大阶段。每个阶段需注重团队合作、文档编写、安全性和性能优化。建议采用敏捷开发、CI/CD、建立用户反馈机制及持续培训,以确保开发高效、产品质量高且能快速响应市场变化。
|
Java API 开发者
在Spring Boot中集成Swagger API文档
在Spring Boot中集成Swagger API文档
|
数据处理 开发者 数据格式
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
这篇文章介绍了Nest.js框架中管道的概念和使用。管道是一种强大的功能,用于在请求数据到达控制器方法之前对其进行预处理,如转换、验证、清理等。文章详细解释了数据转换、数据验证、错误处理和一致性等管道的主要用途,并通过代码示例演示了如何使用内置管道和自定义管道。最后,文章总结了管道在提升应用健壮性和安全性方面的作用,认为合理利用管道可以加速开发周期,提高软件质量。
251 0
|
存储 JavaScript 前端开发
[JS] ES Modules的运作原理
【9月更文挑战第16天】ES Modules(ECMAScript Modules)是 JavaScript 中的一种模块化开发规范,适用于浏览器和 Node.js 环境。它通过 `export` 和 `import` 关键字实现模块的导出与导入。模块定义清晰,便于维护和测试。JavaScript 引擎会在执行前进行静态分析,确保模块按需加载,并处理循环依赖。ES Modules 支持静态类型检查,现代浏览器已原生支持,还提供动态导入功能,增强了代码的灵活性和性能。这一规范显著提升了代码的组织和管理效率。
182 1
|
关系型数据库 MySQL PHP
Docker搭建LNMP运行Wordpress平台 下
Docker搭建LNMP运行Wordpress平台
235 0
|
消息中间件 Java Kafka
你了解RabbitMQ、RocketMQ 和 Kafka吗?
【6月更文挑战第26天】比较了RabbitMQ、RocketMQ和Kafka三种消息队列:RabbitMQ灵活,支持多种协议,适合中小型应用;RocketMQ高性能,适用于大规模消息处理;Kafka则以高吞吐量和流处理见长。RabbitMQ和Kafka生态丰富,而RocketMQ运维相对复杂。选择时考虑性能、灵活性、生态系统和易用性,以及特定场景如大数据流处理或分布式系统组件通信。
285 1
|
存储 Java
Java NIO SelectionKey
Java NIO SelectionKey
154 0
|
Kubernetes Cloud Native Serverless
云原生:从基本概念到实践,解析演进与现状
云原生:从基本概念到实践,解析演进与现状
253 0

热门文章

最新文章