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,失效
二、强制走索引:/*+ 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动态地增加或减少查询所需的并发资源量。
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博客
ORCALE 并行操作(PARALLEL)_oracle的parallel函数-CSDN博客