我有一个按数字(参数实例ID)值划分范围的表。我想选择同一列的 max+1 值。我在 parameterinstanceid 上有全局非分区索引。
select /*+ parallel(a,32,8) */ max(parameterinstanceid) +1 from parameterinstance a;
在检查解释计划时,我看到它正在桌子上进行 INDEX FULL SCAN (MIN/MAX)。我想通过首先检查最大分区来做到这一点,如果它不包含任何数据,然后是下一个分区,按 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