行预取(raw prefecting)和聚簇因子(clustering_factor)

简介: 行预取:每次应用程序请求驱动从数据库返回1条记录的时候,会预取多条记录并将它们存储在客户端的内存中。这样,多个连续的请求就不需要执行数据库的调用来读取数据。
行预取:每次应用程序请求驱动从数据库返回1条记录的时候,会预取多条记录并将它们存储在客户端的内存中。这样,多个连续的请求就不需要执行数据库的调用来读取数据。可以直接从客户端内存中得到他们。结果,到数据库的往返次数随预取记录数量的增加呈比例的降低。因此,检索包含大量记录的结果集的开销会显著的降低;
Oracle数据库引擎只通过一次逻辑读就可以同时获取多行数据,以提高性能。一次行预取读取的行数由arraysize指定。
聚簇因子表明索引中多少相邻的索引键值 指向表中相同的数据块,简单来说,聚簇因子高(即接近于表行数),表示索引键值顺序和行在数据块中的存储顺序很不一样,行预取的作用就不明显;聚簇因子低(即接近于表数据块个数),表示索引键值顺序和行在数据块中的存储顺序很相似,行预取的作用就很明显。
下面做个简单的 实验
--创建一个包含主键的测试表:
SQL>create table t (
2 id number,
3 pad varchar2(4000),
4 constraint t_pk primary key (id)
5 );
--以id升序的顺序插入1000行数据:
SQL>insert into t
2 select rownum as id, dbms_random.string('p',500) as pad
3 from dual
4 connect by level --查看表占用了多少数据块:
SQL>analyze table T compute statistics;
SQL>select blocks,num_rows from user_tables where table_name='T';

BLOCKS NUM_ROWS
---------- ----------
73 1000
--查看索引的聚簇因子:
SQL>select clustering_factor from user_indexes where index_name='T_PK';

CLUSTERING_FACTOR
-----------------
72
可以发现聚簇因子和表的数据块个数相近,说明聚簇因子很低,这种情况非常理想,行预取作用明显,可以有效地降低全索引扫描的逻辑读:
SQL>set autotrace traceonly
SQL>select /*+ index(t t_pk) */ * from t;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=ALL_ROWS (Cost=75 Card=1000 Bytes=503000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (TABLE) (Cost=75 Card =1000 Bytes=503000)
2 1 INDEX (FULL SCAN) OF 'T_PK' (INDEX (UNIQUE)) (Cost=3 Card=1000)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
205 consistent gets
0 physical reads
0 redo size
512484 bytes sent via SQL*Net to client
741 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed
--以id无序的顺序插入
SQL>truncate table t;
SQL>insert into t
2 select rownum as id, dbms_random.string('p',500) as pad
3 from dual
4 connect by level --查看表占用了多少数据块:
SQL>analyze table T compute statistics;
SQL>select blocks,num_rows from user_tables where table_name='T';

BLOCKS NUM_ROWS
---------- ----------
73 1000
--查看索引的聚簇因子:
SQL>select clustering_factor from user_indexes where index_name='T_PK';

CLUSTERING_FACTOR
-----------------
986
可以发现聚簇因子和表的数据行数相近,说明聚簇因子很高,这种情况很不理想,行预取几乎无法发挥作用,逻辑读很高:
SQL>set autotrace traceonly
SQL>select /*+ index(t t_pk) */ * from t;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=ALL_ROWS (Cost=990 Card=1000 Bytes=503000)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (TABLE) (Cost=990 Card=1000 Bytes=503000)
2 1 INDEX (FULL SCAN) OF 'T_PK' (INDEX (UNIQUE)) (Cost=3 Card=1000)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
1056 consistent gets
0 physical reads
0 redo size
512482 bytes sent via SQL*Net to client
741 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed

====================================
其实可以这么理解聚簇因子:索引键值是有序的,而表却不一定是有序的,聚簇因子用来度量表的有序程度,聚簇因子越低(越接近于数据块个数),表示表的有序程度越高;聚簇因子越高(越接近于表行数),表示表的有序程度越低。

测试的结果表明:行预取的值越大越好,但是系统为什么不默认设置成最大值?
相关文章
|
数据可视化 JavaScript 前端开发
Echarts项目开发:柱状图动态数据可视化排名榜(1)
Echarts项目开发:柱状图动态数据可视化排名榜(1)
659 0
|
SQL 关系型数据库 MySQL
MySQL InnoDB中的锁-临键锁(next-key lock)
MySQL InnoDB 锁 临键锁 next-key lock
2207 0
MySQL InnoDB中的锁-临键锁(next-key lock)
|
11月前
|
人工智能 关系型数据库 双11
2024阿里云双11优惠活动开启,云服务器79元一年起,能领代金券和上云补贴金
2024年阿里云双11优惠活动开启,云服务器低至79元一年起,涵盖云数据库、对象存储OSS、无影云电脑等产品,提供代金券、企业算力补贴及上云扶持金等多项优惠,助您轻松上云。
|
11月前
|
人工智能 算法
《文档智能 & RAG让AI大模型更懂业务》解决方案测评
本文总结了对某解决方案的实践体验,包括对实践原理的理解、部署过程中的文档帮助、通过文档智能和检索增强生成(RAG)结合构建的LLM知识库的优势体验,以及解决方案适用的业务场景。总体评价积极,但也指出了文档细节和部署流程上的改进建议。
206 0
|
机器学习/深度学习 Kubernetes 算法框架/工具
ONNX 与容器化:实现端到端的 ML 管道自动化
【8月更文第27天】在现代机器学习 (ML) 工作流程中,模型的训练、转换、部署和管理通常涉及多个步骤和技术栈。Open Neural Network Exchange (ONNX) 提供了一种统一的方式来表示和交换机器学习模型,而容器化技术(如 Docker 和 Kubernetes)则为部署和管理这些模型提供了灵活且可扩展的方式。本文将探讨如何结合 ONNX 和容器化技术来构建端到端的 ML 管道自动化系统。
271 1
|
存储 缓存 算法
高并发架构设计三大利器:缓存、限流和降级
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。
3448 6
|
关系型数据库 MySQL Linux
Docker容器数据卷技术(实现数据同步)
一、什么是数据卷 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。 数据卷可以提供很多有用的特性,如下所示:
|
NoSQL Go MongoDB
golang下的UUID生成
包括标准的UUID,snowflake,MongoDB ObjectID等等。。
1713 0
|
Ubuntu Unix Linux
被 Docker 日志坑惨了
被 Docker 日志坑惨了
1258 1
|
SQL JSON NoSQL
6 款超好用的 MongoDB GUI 使用评测
与传统的基于表格和列的数据库不同,非关系型数据库通过嵌套的键值对进行数据操作。所以当用户通过前端解析数据时,非关系型数据库的数据格式就已经满足要求了。要通过命令行对非关系型数据库进行操作并非易事,所以本篇文章中码匠将针对适用于 MongoDB 的 GUI 工具进行介绍,相信总有一款适合您。
1267 0
6 款超好用的 MongoDB GUI 使用评测