暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 带分区提示的全表扫描

askTom 2017-07-03
802

问题描述

嗨,

我的情况是这样的:

1.) 我有一个在给定列上分区的表 (我们将其称为分区p1)。
2.) 加载p1分区后,仅对该分区 (而不是整个表) 运行统计信息。
3.) 运行统计信息后,将对该表执行select语句,基本上是这样的:

select *
from table partition (p1)
where column_name = criteria associated with p1


因此,在第3步中,我试图告诉Oracle仅在给定分区内查看。但是,我的DBA告诉我,在某些情况下,select语句仍在进行全表扫描。有没有更好的方法告诉Oracle只在p1分区内查看?

谢谢!
布莱恩

专家解答

如果您这样做:

选择 *
从表分区 (p1)

然后是查询扫描来自 * 不同 * 分区的任何块的 * no * 方式。

但这并不意味着你做不到

-在该分区上进行完整扫描 *
-本地索引查找 (即索引分区p1到表分区p1)
-全局索引查找 (即,索引跨越整个表以获取分区p1中存在的行)

explain计划中的 “TABLE ACCESS FULL” 并不是整个故事。您还需要查看分区信息,例如

SQL> create table t ( x int, y int )
  2  partition by range ( x )
  3  (
  4    partition p1 values less than (1000),
  5    partition p2 values less than (2000),
  6    partition p3 values less than (3000)
  7  );

Table created.

SQL> set autotrace traceonly explain
SQL> 选择 * from t partition (p2);

Execution Plan
----------------------------------------------------------
Plan hash value: 2931986080

-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      |     1 |    26 |     2   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE|      |     1 |    26 |     2   (0)| 00:00:01 |     2 |     2 |  <<===
|   2 |   TABLE ACCESS FULL    | T    |     1 |    26 |     2   (0)| 00:00:01 |     2 |     2 |  <<===
-----------------------------------------------------------------------------------------------


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论