提高查询效率-Oracle Hint 语法之parallel index

select * from tablename tb
为提高查询效率,可使用一下方法:
(1)并行查询:/*+ parallel(tb,32) * / 

select  /*+ parallel(tb,32) */  count(*)  from leo1 tb;  

(2)强制走索引:/*+ index(tb, indexname) */

select /*+ parallel(tb, idx_tb$clear) */ count(*) from leo1 tb;

一、Hint

/* */在Oracle中是hint

Hint 使用规则及注意事项
1、hint 其实是一种注释,如果目标 SQL 的文本出现了 hint,则优化器会选择 hint 的执行计划,而不会考虑最优的执行计划,但前提是这个 HINT 是可选的执行计划之一。

2、hint 的用法:必须紧随关键字 select、insert、update,delete 后,hint 中第一个星号和加号之间不能有空格,一般写法 /*+ gather_plan_statistics */,如果有两个 hint,用空格隔开。hint 中指定具体对象时,不能带上该对象所在 schema 的名称。即使该 sql 文本中已经有对应的 schema的名称。

在 hint 中指定具体表名时,如果该表在对应 sql 文本中有别名,则应该使用该表的别名。oracle 数据库中的query block 是指一个语义上完整的查询语句,hint 生效范围仅限于它本身所在的 query block。如果一个语句有子查询,那么主查询的 hint 只能作用于主查询,如果想让 Hint 作用于子查询,那么 hint 要加在子查询上。

举例:/*+ full(table_name)*/ 表示查询表table_name时强制使用全表扫描,强制表扫描也是避免使用索引的一个方法

SQL>Select /*+full(a)*/ * from t a; -- 使用 hint
SQL>Select /*+full(t) */ * from t a; --不使用 hint,失效

参考资料:Oracle Hint 语法详解-CSDN博客

二、强制走索引:/*+ index(tb, indexname) */

Oracle性能分析8:使用索引_oracle parallel index-CSDN博客

三、并行查询:/*+ parallel(tb,32) * / 

3.1 并行概念

并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。

并行包括:

  • 并行查询:这是指能使用多个操作系统进程或线程来执行一个查询。Oracle会发现能并行执行的操作(如全表扫描或大规模排序),并创建一个查询计划来实现)。
  • 并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE)。
  • 并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL操作。例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理。
  • 并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间。
  • 过程并行化:这是指能并行地运行所开发的代码。

3.2 何时使用并行

在应用并行执行之前,需要保证以下两点成立:

  • 必须有一个非常大的任务,如对50GB数据进行全面扫描。
  • 必须有足够的可用资源(CPU、I/O、内存)。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以容纳并行进程),还要有足够的I/O通道。

如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行。

如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。

举例如,写一页文档若12个人来写,需要开会分段等,可能并不如一个人来写更快。而如果写1200页,12个人写需要的时间只为原来的1/12,就算分配任务可能也就1/12,还是比一个人写要快多了。

3.3 并行查询

并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。

在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件。

各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel query,PQ)从属进程。各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库。每个并行执行服务器分别负责扫描表中一个部分(各个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案。

在默认情况下,Oracle是不启用并行查询的。启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等。

3.3.1 并行查询方法

1.暗示hints式  临时有效   >>>   常用

select /*+ parallel(leo1, 2) */ count(*) from leo1;

2.alter table对象式, 直接修改对象属性 长期有效

alter table leo1 parallel 4;       定义leo1表并行度为4

3.alter session会话式,会话生命周期有效 

alter session force parallel query parallel 4;       强制定义并行度为4

4.并行DDL式,会话生命周期有效 

并行查询和并行DDL可以无障碍使用并行,如果想使用并行DML,就需要启动会话DML并行功能

alter session enable parallel dml;

对于前两种方式,若省略num则Oracle将自动根据负载确定并行度。并行度要随着系统上工作负载的增减而变化。如果有充足的空闲资源,并行度会上升;如果可用资源有限,并行度则会下降。这样就不会为机器强加一个固定的并行度。利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源量。

参加:Oracle并行详解_oracle 并行-CSDN博客

3.3.2 parallel-hints式语法

/*+parallel(table_short_name,cash_number)*/

/*+ parallel(leo1,2) parallel(leo2,2) parallel(leo3,2) ……*/   后面同理延续

select /*+parallel(table_name num)*/ count(*) from table_name;

-- 多表关联时多表并行:
select /*+parallel(tb1,num1) parallel(tb2,num2)*/ count(*) from table_name1 tb1, table_name2 tb2;

3.3.3 使用前需考虑&确认点

3.3.3.1考虑点

基于并行查询要启动并行进程、分配任务与系统资源、合并结果集,都是比较消耗硬件资源的,优化时通常在逻辑上没有明显进步空间才使用硬件优化方式,故启用Parallel前应该考虑:
1、当前数据库设备有充足硬件资源;
2、查询表的数据量很大,超过一千万,可通过改变Parallel明显提高效率;
3、系统的当前负载较低,执行任务时不影响其它业务的使用。

3.3.3.2 确认点

使用前我们需要看我们的电脑有几个cpu,并且每个cpu能够并行的线程数。

并行度:就是oracle在进行并行处理时,会启动几个并行服务进程来同时处理数据,注意看看数据需要几步处理,每一步都启n个进程而不是只启n个进程

并行度设定:一般来讲一个CPU内核可以支撑一个并行度,一台多核服务器中通常采用CPU核数50%来设定并行度,余下的CPU处理其他程序

     并行度与硬件关系密切,同样并行度在不同硬件上体现的效果是截然不同的

     并行度与并发数关系:总并行数=并行度*并发数,当并行度确立后,并发数越多总并行数越高

参见资料:[转]Oracle 并行原理与示例总结

查看Oracle能利用的最大并行度:
SQL> show parameters cpu
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     80
parallel_threads_per_cpu             integer     2
resource_manager_cpu_allocation      integer     80

1.cpu_count表示cpu数
2.parallel_threads_per_cpu表示每个cpu允许的并行进程数
3.default情况下,并行数为cpu_count*parallel_threads_per_cpu

四、参考资料:

Oracle 多线程 Parallel优化_+parallel-CSDN博客

Oracle Hint 语法详解-CSDN博客

ORCALE 并行操作(PARALLEL)_oracle的parallel函数-CSDN博客

Oracle性能分析8:使用索引_oracle parallel index-CSDN博客

[转]Oracle 并行原理与示例总结

sql中<![CDATA[]]>的具体使用详解_MsSql_脚本之家

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值