/*+parallel(t,4)*/在SQL调优中的重要作用!

谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用!

/*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,
基于并行查询要启动并行进程、分配任务与系统资源、合并结果集,这些都是比较消耗资源,
但我们为能够减少执行事务的时间使用parallel HINT还是值得的,尤其在ODS系统中报表统计等方面更有使用意义.
一般而言主要在如下情况使用parallel HINT
1.表的数据量很大,超过一千万; 
2.数据库主机是多个CPU;
3.系统的当前负载较低;
简单的测试如下,效果很明显的:
SQL> select /*+parallel(t,4)*/count(*) from   t;

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

已用时间:  00: 01: 32.04

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=5411 Card=1)
   1    0   SORT (AGGREGATE)
   2    1     SORT* (AGGREGATE)                                        :Q351880
                                                                       00

   3    2       TABLE ACCESS* (FULL) OF 't' (Cost=5411 Car :Q351880
          d=2822493)                                                   00



   2 PARALLEL_TO_SERIAL            SELECT /*+ PIV_SSF */ SYS_OP_MSR(COUNT(*)) F
                                   ROM (SELECT /*+ NO_EXPAND ROWID(A2)

   3 PARALLEL_COMBINED_WITH_PARENT

SQL> select count(*) from t;

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

已用时间:  00: 04: 34.02

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 't'



SQL>



<think>好的,我现在需要处理用户关于Oracle SQL的查询,包括执行计划、全局索引与本地索引的区别,以及如何通过PL/SQL进行性能化。首先,我应该整理这些主题的核心点,确保信息准确且易于理解。 首先,执行计划是的基础。用户可能需要知道如何获取执行计划,比如使用EXPLAIN PLAN或DBMS_XPLAN。还要解释执行计划中的关键指标,如ROWS、COST、TIME等,这些在引用[2]中提到过。需要强分析执行计划的重要性,比如全表扫描和索引扫描的区别,以及如何识别性能瓶颈。 接下来是索引部分。全局索引和本地索引的区别主要在于分区表中的应用。全局索引适用于整个表,而本地索引对应每个分区。需要举例说明何时使用哪种索引,比如全局索引适合跨分区查询,本地索引在维护分区时更高效。同时,复合索引的创建在引用[1]中有提到,需要结合说明。 然后是PL/SQL性能化。这里可能需要提到使用静态SQL、批量处理(BULK COLLECT和FORALL)以及避免重复解析。此外,函数和触发器的化也是重点,比如避免在查询中使用函数,或者使用确定性函数。 用户的问题还涉及如何具体操作,比如如何查看执行计划、创建索引的语法示例,以及PL/SQL中的最佳实践。需要提供具体的代码示例,比如创建全局和本地索引的SQL语句,以及PL/SQL中使用批量处理的例子。 还要确保引用文献正确对应,引用[1]和[2]中的内容要自然融入回答中,例如在讨论执行计划时引用[2]中的指标,索引部分引用[1]的复合索引建议。 最后,生成的相关问题需要覆盖执行计划分析、索引选择、PL/SQL化技巧等,确保用户能进一步探索这些主题。需要检查所有技术术语的准确性,避免错误,比如区分全局和本地索引的应用场景,正确解释执行计划中的各个字段。 现在需要将以上思考整理成结构化的回答,分步骤解释每个主题,确保逻辑清晰,语言通俗易懂,同时包含必要的示例和引用标记。</think>### Oracle SQL性能化分步指南 #### 一、执行计划分析(核心工具) 1. **获取方式** - 命令行方式:`EXPLAIN PLAN FOR SELECT ...` + `SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY())` - PL/SQL Developer工具:F5快捷键直接显示图形化执行计划 - 动态性能视图:`SELECT * FROM V$SQL_PLAN WHERE SQL_ID='...'` 2. **关键指标解读**(引用[2]) ```sql OPERATION OPTIONS OBJECT_NAME ROWS COST TIME ---------------------------------------------------------------------- INDEX RANGE SCAN IDX_EMP_DEPT 50 3 00:00:01 ``` - `ROWS`:估算返回行数(与实际的偏差反映统计信息准确性) - `COST`:Oracle化器计算的相对代价(关注高COST节点) - `ACCESS_PREDICATES`:显示实际使用的索引条件 3. **常见问题定位** - 全表扫描:检查`TABLE ACCESS FULL`节点,考虑添加索引 - 低效连接:识别`HASH JOIN`或`NESTED LOOPS`的驱动表是否合理 - 索引失效:出现`INDEX SKIP SCAN`可能提示复合索引字段顺序不合理 #### 二、索引化策略 1. **全局索引 vs 本地索引** | 特性 | 全局索引 | 本地索引 | |---------------------|--------------------------|---------------------------| | 分区维护 | 分区DROP/TRUNCATE时失效 | 自动维护 | | 查询范围 | 跨分区查询更高效 | 单分区查询化 | | 创建语法 | `CREATE INDEX ... GLOBAL`| `CREATE INDEX ... LOCAL` | | 适用场景 | 高频跨分区条件查询 | 分区键常作为过滤条件 | 2. **复合索引设计原则**(引用[1]) ```sql -- 示例:订单查询常用(STATUS,CUSTOMER_ID,DATE_CREATED) CREATE INDEX IDX_ORD_COMPOSITE ON ORDERS (ORDER_STATUS, CUSTOMER_ID, DATE_CREATED) TABLESPACE INDEX_TS; ``` - 第一字段选择高区分度列 - 遵循最左前缀原则 - 包含所有查询字段可实现索引覆盖 3. **索引维护 - 定期重建碎片率>30%的索引 ```sql ALTER INDEX IDX_EMP_NAME REBUILD ONLINE; ``` - 监控未使用索引 ```sql SELECT * FROM DBA_INDEXES WHERE LAST_ANALYZED < SYSDATE - 30; ``` #### 三、PL/SQL性能化技巧 1. **批量处理技术** ```sql DECLARE TYPE t_array IS TABLE OF employees%ROWTYPE; l_data t_array; BEGIN SELECT * BULK COLLECT INTO l_data FROM employees WHERE department_id = 60; FORALL i IN 1..l_data.COUNT UPDATE salaries SET ... WHERE emp_id = l_data(i).id; END; ``` - 减少上下文切换次数 - 建议每批次处理1000-10000条 2. **动态SQL化** - 使用绑定变量避免硬解析 ```sql EXECUTE IMMEDIATE 'SELECT * FROM emp WHERE id = :1' USING v_emp_id; ``` - 静态化高频执行的动态SQL 3. **函数化** - 为确定性函数添加DETERMINISTIC声明 ```sql CREATE FUNCTION get_tax_rate(p_salary NUMBER) RETURN NUMBER DETERMINISTIC IS ... ``` - 避免在WHERE子句中使用函数 #### 四、高级手段 1. **执行计划固定** ```sql -- 使用SQL Profile固定最执行计划 DECLARE v_plan VARCHAR2(100); BEGIN v_plan := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE( sql_id => 'g4w7hj6tcdj3b'); END; ``` 2. **并行查询控制** ```sql ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8; SELECT /*+ PARALLEL(emp, 4) */ * FROM emp; ``` 3. **物化视图化** ```sql CREATE MATERIALIZED VIEW mv_sales_summary BUILD IMMEDIATE REFRESH FAST ON COMMIT AS SELECT product_id, SUM(qty) FROM sales GROUP BY product_id; ``` §§ 1. 如何识别执行计划中的全表扫描是否合理? 2. 分区表场景下如何选择全局索引和本地索引? 3. PL/SQL中批量处理的性能提升原理是什么? 4. 如何通过统计信息化执行计划的准确性? 5. Oracle 12c后的新特性对SQL有哪些影响? [^1]: Oracle官方文档:索引设计规范 [^2]: 《Oracle Database Performance Tuning Guide》第12章执行计划分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值