Oralce 检查表和索引的并行度 DOP 脚本

简介: 数据库的并行度使用需要很谨慎,很容易造成数据库运行缓慢以及严重的等待。

数据库的并行度使用需要很谨慎,很容易造成数据库运行缓慢以及严重的等待。


比较常见的由于 并行度 设置错误导致的等待事件:


  • PX Deq Credit: send blkd


  • PX Deq Credit: need buffer


错误的并行度设置往往可能是由于在创建索引或者重建索引时开启并行度创建,后来忘记关闭导致!


createindex<indexname>on<table><columns>parallel4;
alterindex<indexname>rebuildparallel4;


✅ 使用并行度设置后的正确操作:


alterindex<indexname>noparallel;


当我们遇到这样的等待事件很严重时,可以使用下方脚本快速查看是否存在不正确的并行度设置!


📢 注意: 以下脚本已经过内部测试,但是,不保证它对您有用。确保在使用前在测试环境中运行它。


该 SQL 查询当前数据库主机 CPU 数以及每个 CPU 默认的并行度:


colnameformata30colvalueformata20RemHowmanyCPUdoesthesystemhave?RemDefaultdegreeofparallelismisRemDefault=parallel_threads_per_cpu*cpu_countRem-------------------------------------------------;
selectsubstr(name,1,30) Name , substr(value,1,5) Valuefromv$parameterwherenamein ('parallel_threads_per_cpu' , 'cpu_count' );


1.png


2.png


该 SQL 检查当前数据库中所有用户中存在不同并行度的


setpagesize1000colownerformata30coldegreeformata10colinstancesformata10RemNormallyDOP :=degree*InstancesRemSeethefollowingNotefortheexactformula.
RemNote:260845.1OldandnewSyntaxforsettingDegreeofParallelismRemHowmanytablesauserhavewithdifferentDOPsRem-------------------------------------------------------;
select*from (
selectsubstr(owner,1,15) Owner , ltrim(degree) Degree,
ltrim(instances) Instances,
count(*) "Num Tables" , 'Parallel'fromall_tableswhere ( trim(degree) !='1'andtrim(degree) !='0' ) or( trim(instances) !='1'andtrim(instances) !='0' )
groupbyowner, degree , instancesunionselectsubstr(owner,1,15) owner , '1' , '1' ,
count(*) , 'Serial'fromall_tableswhere ( trim(degree) ='1'ortrim(degree) ='0' ) and( trim(instances) ='1'ortrim(instances) ='0' )
groupbyowner)
orderbyowner;


📢 注意: 如果查询出 Parallel 列的值为 Serial 就证明并行度都是 1,为正常。

该 SQL 检查当前数据库中所有用户中存在不同并行度的 索引


setpagesize1000RemHowmanyindexesauserhavewithdifferentDOPsRem---------------------------------------------------;
select*from (
selectsubstr(owner,1,15) Owner ,
substr(trim(degree),1,7) Degree ,
substr(trim(instances),1,9) Instances ,
count(*) "Num Indexes",
'Parallel'fromall_indexeswhere ( trim(degree) !='1'andtrim(degree) !='0' ) or( trim(instances) !='1'andtrim(instances) !='0' )
groupbyowner, degree , instancesunionselectsubstr(owner,1,15) owner , '1' , '1' ,
count(*) , 'Serial'fromall_indexeswhere ( trim(degree) ='1'ortrim(degree) ='0' ) and( trim(instances) ='1'ortrim(instances) ='0' )
groupbyowner)
orderbyowner;


📢 注意: 如果查询出 Parallel 列的值为 Serial 就证明并行度都是 1,为正常。

该 SQL 检查具有不同 DOP 的索引的表:


coltable_nameformata35colindex_nameformata35RemTablesthathaveIndexeswithnotthesameDOPRem!!!!!Thiscommandcantakesometimetoexecute!!!Rem---------------------------------------------------;
setlines150selectsubstr(t.owner,1,15) Owner ,
t.table_name ,
substr(trim(t.degree),1,7) Degree ,
substr(trim(t.instances),1,9) Instances,
i.index_name ,
substr(trim(i.degree),1,7) Degree ,
substr(trim(i.instances),1,9) Instancesfromall_indexesi,
all_tablestwhere ( trim(i.degree) !=trim(t.degree) ortrim(i.instances) !=trim(t.instances) ) andi.owner=t.ownerandi.table_name=t.table_name;


📢 注意:查询结果为空代表没有不同 DOP 的索引的表,正常。

相关文章
|
SQL 关系型数据库 MySQL
MySQL视图、索引、备份与恢复、执行计划(三)
MySQL视图、索引、备份与恢复、执行计划(三)
65 0
|
7月前
|
SQL 数据库 索引
解决SQL报错:索引中丢失IN或OUT參数
解决SQL报错:索引中丢失IN或OUT參数
|
存储 关系型数据库 MySQL
mysql按天自动生成表分区的执行语句
mysql按天自动生成表分区的执行语句
233 0
|
SQL
删除SQL表数据时存在约束的解决方法
删除SQL表数据时存在约束的解决方法
212 0
|
存储 关系型数据库 MySQL
MySQL视图、索引、备份与恢复、执行计划(二)
MySQL视图、索引、备份与恢复、执行计划(二)
80 0
|
存储 关系型数据库 MySQL
MySQL视图、索引、备份与恢复、执行计划(一)
MySQL视图、索引、备份与恢复、执行计划
108 0
|
存储 SQL 缓存
【MySQL高级】查询缓存、合并表、分区表
【MySQL高级】查询缓存、合并表、分区表
220 0
【MySQL高级】查询缓存、合并表、分区表
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
131 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(一)
|
存储 SQL 关系型数据库
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
186 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(二)
|
关系型数据库 MySQL 索引
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)
129 0
MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描(四)