Oracle CBO评估like的数据量

对Like,有两种形式的写法是按照数据总量的5%评估。

SQL> drop table test purge;

SQL> create table test as select * from dba_objects;

SQL> exec dbms_stats.gather_table_stats(user,‘test‘);

SQL> select count(1) from test;

COUNT(1)

----------

79747

SQL> select count(1) from test where object_name like ‘test%‘;

COUNT(1)

----------

0

SQL> select count(1) from test where object_name like ‘%test%‘;

COUNT(1)

----------

12

SQL> select count(1) from test where object_name like ‘%test‘;

COUNT(1)

----------

2

SQL> set autotrace trace exp

--79747*0.05=3987.35

SQL> select * from test where object_name like ‘%test%‘;

执行计划

----------------------------------------------------------

Plan hash value: 1357081020

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  3987 |   389K|   224   (1)| 00:00:04 |

|*  1 |  TABLE ACCESS FULL| TEST |  3987 |   389K|   224   (1)| 00:00:04 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("OBJECT_NAME" LIKE ‘%test%‘ AND "OBJECT_NAME" IS NOT NULL)

--79747*0.05=3987.35

SQL> select * from test where object_name like ‘%test‘;

执行计划

----------------------------------------------------------

Plan hash value: 1357081020

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  3987 |   389K|   224   (1)| 00:00:04 |

|*  1 |  TABLE ACCESS FULL| TEST |  3987 |   389K|   224   (1)| 00:00:04 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("OBJECT_NAME" LIKE ‘%test‘ AND "OBJECT_NAME" IS NOT NULL)

--如果是百分号写在后面,不能按照5%的

SQL> select * from test where object_name like ‘test%‘;

执行计划

----------------------------------------------------------

Plan hash value: 1357081020

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     2 |   200 |   224   (1)| 00:00:04 |

|*  1 |  TABLE ACCESS FULL| TEST |     2 |   200 |   224   (1)| 00:00:04 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("OBJECT_NAME" LIKE ‘test%‘)

SQL> select * from test where object_name like ‘t%‘;

执行计划

----------------------------------------------------------

Plan hash value: 1357081020

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  1079 |   105K|   224   (1)| 00:00:04 |

|*  1 |  TABLE ACCESS FULL| TEST |  1079 |   105K|   224   (1)| 00:00:04 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("OBJECT_NAME" LIKE ‘t%‘)

时间: 2024-12-02 01:34:09

Oracle CBO评估like的数据量的相关文章

Oracle普通表—>分区表转换(9亿数据量)

背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空间占用大约350G,在线重定义为分区表不现实,故采取申请时间窗口停此表应用,改造为分区表. 若T表数据量适当,可选用在线重定义操作时,可参考:http://www.cnblogs.com/jyzhao/p/3876634.html 1.创建分区表 -- Create table 创建分区表T_PART,分区从14年6月开始. create table

windows 系统下,小数据量Oracle用户物理备份

环境:windows Server 2003 oracle 10g,系统间备份 目标系统创建共享文件,原系统挂载共享目录 写批处理脚本,用任务计划定时调用 Rem * 由于系统实时性要求不是很高,数据量不大,且只有一块磁盘,考虑异地备份 * Rem * 异地备份的时候使用expdp 出schema THUNIITSMUSER * Rem * 使用windows命令的共享文件模式,将dump出来的文件copy到192.168.1.47上 * Rem * create or replace dire

oracle基于3种方法的大数据量插入更新

过程插入更新的3种方法: a.逐条检查插入或更新,同时执行插入或更新 b.逐条merge into(逐条是为了记录过程日志与错误信息) c.基于关联数组的检查插入.更新,通过forall批量sql执行 以下为模拟步骤: 1.创建模拟大表,数据量1亿不分区 create table big_table as SELECT ROWNUM RN,'A' A,'B' B,'C' C,'D' D FROM ( SELECT ROWNUM RN FROM DUAL CONNECT BY ROWNUM <=

oracle大数据量。表分区提示查询效率

现在业务有一张usertrack 日志记录表.每天会产生30万条数据.数据量大查询效率会非常慢 所以我考虑通过表分区来提示效率  逻辑上是一张表.但是分区后会按照分区条件将数据分在不同的物理文件 优点: 1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度. 2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用: 3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可: 4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I

Oracle性能分析4:数据访问方法之全扫描

SQL语句执行时,Oracle的优化器会根据统计信息确定表的访问方式,一般来说,有两种基本的数据访问方式:1)全扫描.在全扫描(全表扫描或者快速全索引扫描)中,多个块被读入到一个IO运算中.2)索引扫描.索引扫描首先扫描索引叶子块以取得特定的行id(rowid),然后利用这些行id来访问父表取得实际的行数据,访问通过单块读取来完成.这里主要讲解全扫描方式,后面将介绍索引扫描. 使用全扫描 当对一个表进行全扫描时,会将表中所有数据块(block)取出并进行处理,筛选出符合条件的数据.注意Oracl

MySQL随机获取数据的方法,支持大数据量

最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到这里来,供大家学习. 在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的.下面我来介绍随机取数据一些优化方法. SELECT * FROM table_name ORDER BY ran

数据量下高并发同步的讲解(不看,保证你后悔

4.常见的提高高并发下访问的效率的手段 首先要了解高并发的的瓶颈在哪里? 1.可能是服务器网络带宽不够 2.可能web线程连接数不够 3.可能数据库连接查询上不去. 根据不同的情况,解决思路也不同. 像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器. 负载均衡,前置代理服务器nginx.apache等等 数据库查询优化,读写分离,分表等等 最后复制一些在高并发下面需要常常需要处理的内容: 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能.

Oracle 根据条件大量删除数据

金蝶BOS里系统表 t_bas_message 表用于存放系统消息.实际操作中,客户端默认15分钟查询一次是否有新消息 用户基本不会去删除已读的消息,这就导致这张表大得惊人,系统运行一年多以来,大约有 450万条数据.再加上这张表上存在索引,对数据库而言,一旦操作失误导致表中索引失效,数据库会因为全表扫描太多彻底卡死. 之后考滤删除一个月以前的数据执行SQL语句如下 DELETE FROM t_bas_message t WHERE t.fsendtime > Sysdate-30; 这段代码在

大数据量下的SQL Server数据库自身优化 (转载)

1.1:增加次数据文件 从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储在不同的数据文件里 由于CPU和内存的速度远大于硬盘的读写速度,所以可以把不同的数据文件放在不同的物理硬盘里,这样执行查询的时候,就可以让多个硬盘同时进行查询,以充分利用CPU和内存的性能,提高查询速度. 在这里详细介绍一下其写入的原理,数据文件(