分区索引并行导致的性能问题

问题现象;生产环境报ORA-17144=statement handle not executed

然后我把sql抓出来手工运行一遍执行计划如下:

----------------------------------------------------------
Plan hash value: 644608605

-------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation			      | Name		      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT		      | 		      |     1 |    75 |   120K	(1)| 00:24:10 |       |       |
|   1 |  SORT AGGREGATE 		      | 		      |     1 |    75 | 	   |	      |       |       |
|   2 |   NESTED LOOPS			      | 		      | 58896 |  4313K|   120K	(1)| 00:24:10 |       |       |
|   3 |    NESTED LOOPS 		      | 		      | 58896 |  4313K|   120K	(1)| 00:24:10 |       |       |
|   4 |     PARTITION RANGE SINGLE	      | 		      | 58896 |  2300K|  2984	(1)| 00:00:36 |    12 |    12 |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| t1   | 58896 |  2300K|  2984	(1)| 00:00:36 |    12 |    12 |
|*  6 |       INDEX RANGE SCAN		      | idx_1 | 58896 |       |  2984	(1)| 00:00:36 |    12 |    12 |
|*  7 |     INDEX UNIQUE SCAN		      | t2_UNIQUE1   |     1 |       |     1	(0)| 00:00:01 |       |       |
|*  8 |    TABLE ACCESS BY GLOBAL INDEX ROWID | t2	      |     1 |    35 |     2	(0)| 00:00:01 | ROWID | ROWID |
-------------------------------------------------------------------------------------------------------------------------------

这个执行计划非常正常,400ms返回结果,于是我抓了出问题时的awr,发现这个sql跑了2分钟,于是我猜测执行计划和当前运行的执行计划不一致,然后sql_id 抓取了当时运行的执行计划如下

SQL> set pages 200 lines 200;
SELECT *
  FROM TABLE(dbms_xplan.display_cursor(sql_id          => ‘1hqcmrpa790c3‘,
                                       cursor_child_no => 0,
  4                                         format          => ‘ALL ALLSTATS LAST NOTE ADVANCED -projection‘));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID	cku6z254k95z5, child number 0
-------------------------------------
select coalesce(sum(u.money),0) from t1 u	left
join t2 r on u.orderform_flow_no = r.serialnumber     WHERE
u.create_time >= to_date(:1,‘yyyy-mm-dd hh24:mi:ss‘)   and
u.create_time < to_date(:2,‘yyyy-mm-dd hh24:mi:ss‘)	  and
r.service_id = ‘unicomhb‘    and r.status = 2

Plan hash value: 28991375

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation				   | Name		   | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | Pstart| Pstop |	 TQ  |IN-OUT| PQ Distrib |  OMem |  1Mem | Used-Mem | Used-Tmp|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT			   |			   |	    |	    |	100K(100)|	    |	    |	    |	     |	    |	    |	 |	 |	    |	      |
|   1 |  SORT AGGREGATE 			   |			   |	  1 |	 75 |		 |	    |	    |	    |	     |	    |	    |	 |	 |	    |	      |
|*  2 |   PX COORDINATOR			   |			   |	    |	    |		 |	    |	    |	    |	     |	    |	    |	 |	 |	    |	      |
|   3 |    PX SEND QC (RANDOM)			   | :TQ10002		   |	  1 |	 75 |		 |	    |	    |	    |  Q1,02 | P->S | QC (RAND)  |	 |	 |	    |	      |
|   4 |     SORT AGGREGATE			   |			   |	  1 |	 75 |		 |	    |	    |	    |  Q1,02 | PCWP |	    |	 |	 |	    |	      |
|*  5 |      FILTER				   |			   |	    |	    |		 |	    |	    |	    |  Q1,02 | PCWC |	    |	 |	 |	    |	      |
|*  6 |       HASH JOIN 			   |			   |  87509 |  6409K|	100K  (1)| 00:20:12 |	    |	    |  Q1,02 | PCWP |	    |  1740K|  1638K| 2076K (0)|	      |
|   7 |        PX RECEIVE			   |			   |  87509 |  3418K|	127   (0)| 00:00:02 |	    |	    |  Q1,02 | PCWP |	    |	 |	 |	    |	      |
|   8 | 	PX SEND HASH			   | :TQ10001		   |  87509 |  3418K|	127   (0)| 00:00:02 |	    |	    |  Q1,01 | P->P | HASH  |	 |	 |	    |	      |
|   9 | 	 PX PARTITION RANGE ITERATOR	   |			   |  87509 |  3418K|	127   (0)| 00:00:02 |	KEY |	KEY |  Q1,01 | PCWC |	    |	 |	 |	    |	      |
|  10 | 	  TABLE ACCESS BY LOCAL INDEX ROWID| t1   |  87509 |  3418K|	127   (0)| 00:00:02 |	KEY |	KEY |  Q1,01 | PCWP |	    |	 |	 |	    |	      |
|* 11 | 	   INDEX RANGE SCAN		   | idx_1 |  87509 |	    |	127   (0)| 00:00:02 |	KEY |	KEY |  Q1,01 | PCWP |	    |	 |	 |	    |	      |
|  12 |        BUFFER SORT			   |			   |	    |	    |		 |	    |	    |	    |  Q1,02 | PCWC |	    |   126M|  3809K|   97M (0)|	  113K|
|  13 | 	PX RECEIVE			   |			   |   9157K|	305M|	100K  (1)| 00:20:10 |	    |	    |  Q1,02 | PCWP |	    |	 |	 |	    |	      |
|  14 | 	 PX SEND HASH			   | :TQ10000		   |   9157K|	305M|	100K  (1)| 00:20:10 |	    |	    |	     | S->P | HASH  |	 |	 |	    |	      |
|  15 | 	  PARTITION RANGE ALL		   |			   |   9157K|	305M|	100K  (1)| 00:20:10 |	  1 |	 19 |	     |	    |	    |	 |	 |	    |	      |
|* 16 | 	   TABLE ACCESS FULL		   | t2	   |   9157K|	305M|	100K  (1)| 00:20:10 |	  1 |	 19 |	     |	    |	    |	 |	 |	    |	      |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

果不其然,上面全是并行扫描,这里也不用纠结这个并行为什么会导致ora-17144错误,然后我立马想到用sql profile 将执行计划固定住,但是绝对不太合理,至于为什么并行还要找到问题说在,

于是我查询了表和该表索引的并行度,发现分区index上开启了并行,问题找到了,通过

alter index index_name noparallel关闭了并行后,业务恢复正常。

时间: 2024-08-02 13:26:20

分区索引并行导致的性能问题的相关文章

oracle 性能优化操作十六: 使用分区索引

在用分析命令对分区索引进行分析时,每一个分区的数据值的范围信息会放入Oracle的数据字典中. Oracle可以利用这个信息来提取出那些只与SQL查询相关的数据分区. 例如,假设你已经定义了一个分区索引,并且某个SQL语句需要在一个索引分区中进行一次索引扫描. Oracle会仅仅访问这个索引分区,而且会在这个分区上调用一个此索引范围的快速全扫描. 因为不需要访问整个索引,所以提高了查询的速度.

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Hash(哈希)分区 •       List(列表)分区 •       以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区

分区表与分区索引

(一)什么是分区 所谓分区,就是将一张巨型表或巨型索引分成若干个独立的组成部分进行存储和管理,每一个相对小的,可独立管理的部分,称为分区. (二)分区的优势 提高数据可管理性.对表进行分区,数据的加载.索引的创建与重建.数据的备份与恢复等操作都可以在分区表上进行,而不必在表级别上进行,提高了数据的可管理性: 增强数据库的可用性.某个分区出现问题,只影响该分区,其它分区照常运作: 改善查询性能.将对整个表的查询转化为对某个分区表的查询,提高了查询速度: 提高数据库操作的并行性.可对分区表进行并行操

Atitit.分区对索引的影响&#160;分区索引和全局索引&#160;attilax总结

Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, 3 6. 总结4 7. refer4 1. 分区的好处 在一个表的数据超过过2000万条或占用2G空间时,建议建立分区表 分区使得数据管理操作如数据装载.索引建立和重建.备份和恢复等在分区级别上完成,这比在表级完成操作要明显的节省时间: 分区可以提高性能,在很多情况下,查询可以通过扫描某个分区来完成

MS SQL Server:分区表、分区索引 详解

1. 分区表简介使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. ?        大型表:数据量巨大的表.?        访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式. 分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的. 注意:只能在 SQL Server Enterprise Editi

【三思笔记】 全面学习Oracle分区表及分区索引

[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可以分成几类: v  Range(范围)分区 v  Hash(哈希)分区 v  List(列表)分区 v  以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定 compress 属性),只不过分区依赖列不能是

oralce索引和分区索引的使用

oracle分区表和分区索引的本质就是将数据分段存储,包括表和索引(索引从本质上来讲也是表),表分区会将表分成多个段分别存储.由此数据查询过程改变为先根据查询条件定位分区表,然后从该表中查询数据,从而提高性能.这些操作对用户是透明的,用户只需要使用普通的存取操作即可. 1. 分区表 分区表一般有如下几种: range分区方式: 最常用的分区方式,通过某个字段或者某几个字段组合的值,从小到大,按照指定的范围进行分区,在insert数据时就会把数据插入到指定分区中去. List分区方式: 通常作为二

oracle分区表和分区索引概述

㈠ 分区表技术概述            ⑴ Range 分区            ① 例子                  create table t         (...列定义...)         partition by range (week_num)         (partition p1 values less than (4)tablespace data0,           partition p2 values less than (5)tablespac

oracle 分区和分区索引

一.个人理解:建表时一般都会指定在一个表空间上,但是可能随着表空间扩大,查询越来越慢,分区表就是将一个表实际存在不同的表空间,oracle存储分为块,断,表空间.新建一个表,会给表分配指定大小的段,段里包含存储块,高水位线就是指段空间被撑大了. 表空间和分区的区别: (1)表空间是逻辑存储单位,所有的表段放在表空间里.至于表的分区,也可看作一个逻辑段,属于比表空间小一级的逻辑存储单位. (2)他们根本不是一个概念,表空间是由多个数据文件组成的,可以这么说  块组成了段,段组成了表空间,表空间组成