SEO教程

SEO教程

Products

当前位置:首页 > SEO教程 >

如何设置20260215测试中直接路径读取的阈值?

96SEO 2026-02-20 08:11 14


[20260215]测试直接路径读的阈值(21c).txt

--//别人测试直接路径读遇到一些问题,使用如下链接还提供1个测试脚本:http://blog.itpub.net/22034023/viewspace-773483/
--//转抄如下:

                

如何设置20260215测试中直接路径读取的阈值?

11GR1                    

11GR2                   


块阀值          

_small_table_threshold  

统计信息里记录的表的block数目(11GR2)超过此阀值。


Block

cache阀值

50%                      

50%                     

少于此阀值
脏块阀值        

25%                      

25%                     

少于此阀值

满足以上条件时,Oracle会进行直接路径读取。



Oracle为直接路径读取设置的三个"门槛",非常的合理:

第一个阀值:表大小,太小的表从direct

path

read中的获益太小。

但是特别需要引起你的警惕,如果表上存在统计信息,那么ORACLE会
采取表的统计信息中记录的block与_small_table_threshold的设定值来做比较,而不是表的真实大小(dba_segments中记录的值)。


可能导致一些不是你预期的情况发生。

如果你的统计信息与表的真实情况差异很大,那么你应该仔细考虑可能发生什么样的结果。

如果你
的表没有统计信息,ORACLE会依据表的真实大小来决定是否进行direct

path

read。



第二个阀值:脏块阀值,由于direct

path

read需要出发一个段的检查点,因此脏块太多,刷新脏块可能会导致IO繁忙

第三个阀值:表在内存里的cache率,如果cache率很高,那么还是走传统路径更快。

direct

path

read的出现,需要让ORACLE公司的开发
人员设计一个单独的结构来存储每个表有多少数据是脏数据,有多少数据被cache。

不过这个结构目前还并未暴露给我们查询。

在flush
buffer

shared_pool并不会被清空)

CREATE

REPLACE

NUMBER,
                                       

P_START

0,
                                       

P_STOP

T
     

SELECT

'*')
       

FROM

DUAL
     

CONNECT

buffer_cache';
   

SELECT

COUNT(*)
     

INTO

L_CNT
     

FROM

VALUE
     

INTO

L_PRD
     

FROM

V$SEGMENT_STATISTICS
    

WHERE

USER
      

AND

'T'
      

AND

P_STEP;
END;
/

--//遇到的问题是使用该脚本在19c测试无效,重复验证测试。



1.环境:
SCOTT@book01p>

ver2
==============================
PORT_STRING                  

x86_64/Linux

2.4.xx
VERSION                      

21.0.0.0.0
BANNER                       

Oracle

Production
BANNER_FULL                  

Oracle

21.3.0.0.0
BANNER_LEGACY                

Oracle

Production
CON_ID                       

0
PL/SQL

^_small_table_threshold$
SYS@book>

pr
==============================
NUM                          

1867
N_HEX                        

:  

74B
CON_ID                       

0
NAME                         

_small_table_threshold
DESCRIPTION                  

lower

reads
DEFAULT_VALUE                

TRUE
SESSION_VALUE                

1018
SYSTEM_VALUE                 

1018
ISSES_MODIFIABLE             

TRUE
ISSYS_MODIFIABLE             

DEFERRED
PL/SQL

completed.
--//1018

2.测试环境建立:
SCOTT@book>

create

created.
--//实际上这样每块仅仅1条记录。



--//SCOTT@book>

execute

sys.dbms_stats.delete_table_stats

('SCOTT',

completed.

--//建立测试函数GET_ADR_TRSH略。


SYS@book01p>

grant

succeeded.

SYS@book01p>

grant

DBMS_OUTPUT.PUT_LINE(L_TRSH);
END;
/

3.测试:
--//问题1:验证测试无法获取块阈值。


SCOTT@book01p>

m8.txt

completed.

SCOTT@book01p>

ses2z

selected
--//实际上没有1次physical

reads

direct,因为已经测试到最大值,这是遇到的第1个问题。


--//插入后并没有分析表,如果仔细阅读脚本可以发现采用直接append插入数据,第1次插入P_START+10条,后续每次在插入10条。

实际
--//上第1次插入已经存在统计信息。



SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB          

905          

929        

0     

0   

16:09:38         

1          

DISABLED
--//仅仅记录了第1次执行插入的统计信息(895+10=905),以后的查询以该信息决定是否采用直接路径读,还没有到达块阈值。


--//这样即使后面继续有数据插入(每次10条),也不会采用直接路径读。


--//这是因为12c开始采用这类加载模式自动生成统计信息。

而以前测试每次执行时都是动态取样获取统计信息。



SCOTT@book01p>

drop

dropped.

SCOTT@book01p>

create

created.

SCOTT@book01p>

alter

"_optimizer_ga***r_stats_on_load"=false;
Session

altered.
--//规避统计信息加载。



SCOTT@book01p>

m8.txt

completed.

SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB                                                                                 

1          

DISABLED
--//测试完成也没有统计信息。



SCOTT@book01p>

exec

dbms_stats.ga***r_table_stats('SCOTT',

'T',

no_invalidate=>false)
PL/SQL

procedure

completed.

SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB          

995         

1019        

0     

0   

16:21:17         

1          

DISABLED
--//实际上记录的985+10表示插入995条记录,如果加上段头,L1,L2的数量等于1019,应该接近1018.
--//说明该脚本测试到目前为止正确,块阀值=_small_table_threshold

4.第2个问题提出:
--//现在分析表,如果没有其他用户加载相关表T数据块,理论每次都是执行全表扫描都采用直接路径读?


--//避免其他干扰因素,重启数据库再测试。



SCOTT@book01p>

column

spid
==============================
SID                          

272
SERIAL#                      

2461
PROCESS                      

4759
SERVER                       

DEDICATED
SPID                         

4761
PID                          

62
P_SERIAL#                    

4
KILL_COMMAND                 

alter

completed.

SCOTT@book01p>

ses2z

selected

SCOTT@book01p>

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct              

995
--//直接路径读,奇怪这里仅仅记录数据块执行直接路径读的次数,实际上全表扫描读取段头,可以确定该扫描那些数据块,并没有读
--//L1,L2.

SCOTT@book01p>

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct              

995
--//可以发现没有变化,也就是第2次执行没有采用直接路径读。



SCOTT@book01p>

bh_obj

COUNT(*)
----------
      

994
--//表T数据块已经加载到数据库缓存。



SCOTT@book01p>

alter

altered.

SCOTT@book01p>

bh_obj

COUNT(*)
----------
        

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct              

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct              

995

--//刷新数据缓存后,再次执行依旧没有采用直接路径读,为什么?



5.继续分析:
SCOTT@book01p>

modtab

dbms_stats.set_table_stats('SCOTT','T',numblks=>8000,NO_INVALIDATE=>false,force=>true);
press

enter

completed.
--//人为修改统计信息数据块数量8000。



SCOTT@book01p>

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct              

alter

altered.

SCOTT@book01p>

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct             

1990

--//再次采用直接路径读。



SCOTT@book01p>

alter

altered.

SCOTT@book01p>

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct             

select

COUNT(*)
----------
      

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct             

3980
--//修改数据块大小=8000,以后的每次执行都是直接路径读。


--//做一个猜测21c以后,不考虑Block

cache阀值,脏块阀值的情况下,oracle改变算法,大于数据块块阀值到某个值之间,第1次执行
--//全表扫描选择直接路径读,而后续的全表扫描并不采用直接路径读.如何确定这个值呢?

6.建立新的脚本:

--//以GET_ADR_TRSH为蓝本,修改如下:

CREATE

REPLACE

NUMBER,
                                       

P_START

0,
                                       

P_STOP

T
     

SELECT

'*')
       

FROM

DUAL
     

CONNECT

buffer_cache';
   

SELECT

direct';

   

EXECUTE

buffer_cache';
   

SELECT

direct';

   

L_PRD

L_PRD1;

   

EXIT

DBMS_OUTPUT.PUT_LINE(L_TRSH);
END;
/

SCOTT@book01p>

alter

"_optimizer_ga***r_stats_on_load"=false;
Session

altered.

SCOTT@book01p>

drop

dropped.

SCOTT@book01p>

create

created.

SCOTT@book01p>

m8z.txt

completed.
--//在测试环境测试多次,都是这个数值。



SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB                                                                                 

1          

DISABLED

SCOTT@book01p>

exec

dbms_stats.ga***r_table_stats('SCOTT',

'T',

no_invalidate=>false)
PL/SQL

procedure

completed.

SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB         

5585         

5683        

0     

0   

17:17:10         

1          

DISABLED
--//blocks=5683.

SCOTT@book01p>

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct            

select

COUNT(*)
----------
     

ses2z

direct"
      

SID

NAME                             

VALUE
----------

--------
      

272

direct            

29305

--//这样后续全表扫描才会选择直接路径读方式执行.
--//5683/1018

5.58251473477406679764,大于5倍,这个数值的来源于那里,实在猜测不出来。



--//还有1个疑问:
SYS@book>

select

COUNT(*)
----------
    

select

COUNT(*)
----------
     

5552
--//两者存在巨大不同,难道pdb下限制每个数据块缓存的数量吗。



SYS@book>

hidez

NAME                       

DESCRIPTION                                                       

DEFAULT_VALUE

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

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

74B         

_small_table_threshold     

lower

reads              

TRUE         

1018         

1018        

TRUE

74C         

_pdb_small_table_threshold

lower

pdb     

TRUE         

20           

20          

FALSE

74D         

lower

TRUE         

20           

20          

TRUE

DEFERRED
                                                 

direct

reads
--//_pdb_small_table_threshold

表示什么,应该是百分比吗?



7.总结:
--//也许从某个版本oracle,oracle改变算法,当数据块数量在块阈值与某个数值之间,全表扫描,第1次执行采用直接路径读,后续的执
--//行并不采用直接路径读。

只有大于该数值以后,排除Block

cache阀值,脏块阀值的情况下才选择直接路径读。



--//还有1个情况,当数据块数量在块阈值与某个数值之间时,如何操作再次使执行语句采用直接路径读。

无论执行:
alter

system

shared_pool;

SCOTT@book01p>

tab2z

shown)...
OWNER               

TABLE_NAME                    

NUM_ROWS       

EMPTY

DEGREE              

COMPRESS
--------------------

----

--------
SCOTT               

T                             

TAB          

995         

1019        

0     

0   

15:59:08         

1          

DISABLED

SCOTT@book01p>

ses2z

selected

SCOTT@book01p>

select

COUNT(*)
----------
     

ses2z

selected

--//无法如何测试都无法再现直接路径读。



--//如果这类情况不算。

这样直接路径读的阈值提高不少,而且如何确定不是很清楚。



8.附上测试脚本:
$

cat

conditions.
--------------------------------------------------------------------------------
--
--

File

Purpose:    

Display

by
--             

statistic

Author:     

Tanel

http://www.tanelpoder.com
--
--

Usage:      

@ses2

<statname>
--             

@ses2

%
--             

@ses2

parse
--             

@ses2

redo
--             

@ses2

parse
--
--------------------------------------------------------------------------------

select
   

ses.value
from
   

v$sesstat

sn
where
   

sn.statistic#

inst_id
               

,class#
               

,FILE#
               

,BLOCK#
               

,status
               

,lock_element_addr
               

,dirty
               

,temp
               

,ping
               

,stale
               

,direct
               

,new
           

FROM

gv$bh
          

objd

=
                       

(SELECT

data_object_id
                          

FROM

dba_objects
                         

object_name

=
                                      

UPPER

(
                                         

CASE
                                            

WHEN

1)
                                            

ELSE

'&1'
                                         

END)
                               

AND

=
                                      

UPPER

(
                                         

CASE
                                            

WHEN

0
                                            

THEN
                                               

UPPER

1))
                                            

ELSE
                                               

USER
                                         

END))
                

AND

'free'
       

ORDER

v_table
select
upper(CASE
                   

WHEN

THEN
                       

SUBSTR('&1',INSTR('&1','.')+1)
                   

ELSE
                       

'&1'
                   

END
                    

)

v_table,
nvl(upper(CASE

WHEN

THEN
           

UPPER(SUBSTR('&1',1,INSTR('&1','.')-1))
       

ELSE
           

user
       

END),user)

set_table_stats
prompt
prompt

exec

dbms_stats.set_table_stats('&v_owner','&v_table',&2=>&3,NO_INVALIDATE=>false,force=>true);;
prompt
pause

press

dbms_stats.set_table_stats('&v_owner','&v_table',&2=>&3,NO_INVALIDATE=>false,force=>true);
prompt

class="post-meta-container">



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback