【发布时间】:2012-10-11 07:18:57
【问题描述】:
我有一个按数字(参数实例 ID)值划分范围的表。我想选择同一列的 max+1 值。我在 parameterinstanceid 上有全局非分区索引。
select /*+ parallel(a,32,8) */ max(parameterinstanceid) +1 from parameterinstance a;
在检查解释计划时,我看到它正在对表进行索引全扫描(最小值/最大值)。我想通过首先检查最大分区来做到这一点,如果它不包含任何数据,然后是下一个分区,按 desc 顺序。我可以编写一个过程来做到这一点,但我想知道是否有一个简单的查询。 http://www.oramoss.com/blog/2009/06/no-pruning-for-minmax-of-partition-key.html ..看来这是一个未解决的问题。
编辑:
分区名称为 PI_P01,PI_P02,...PI_P10,PI_PMAXVALUE
解释计划是:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2808487136
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 34 (0)| 00:00:01 | | |
| 1 | SORT AGGREGATE | | 1 | 8 | | | | |
| 2 | PARTITION RANGE ALL | | 1 | 8 | 34 (0)| 00:00:01 | 1 | 11 |
| 3 | INDEX FULL SCAN (MIN/MAX)| PI_PK | 1 | 8 | 34 (0)| 00:00:01 | 1 | 11 |
-----------------------------------------------------------------------------------------------------
和表结构:
Name Null? Type
------------------------------ -------- -----------------
PARAMETERINSTANCEID NOT NULL NUMBER
PARAMINSTANCE2PARAMSETVERSION NOT NULL NUMBER
PARAMINSTANCE2PARAMDEFINITION NOT NULL NUMBER
PARAMINSTANCE2PARENTPARAM NUMBER
SEQUENCE NUMBER
X_CTCV_CONV_ID VARCHAR2(50 CHAR)
X_CONV_RUN_NO NUMBER
以及表上的索引:
INDEX_NAME POSITION COLUMN_NAME
------------------------------ -------- -----------------------------
PI_UK 1 PARAMINSTANCE2PARAMSETVERSION
PI_UK 2 PARAMINSTANCE2PARAMDEFINITION
PI_PK 1 PARAMETERINSTANCEID
PI_PAD_FK_I 1 PARAMINSTANCE2PARAMDEFINITION
PI_PI_FK_I 1 PARAMINSTANCE2PARENTPARAM
【问题讨论】:
标签: sql plsql database-partitioning