问题描述
嗨,
我的情况是这样的:
1.) 我有一个在给定列上分区的表 (我们将其称为分区p1)。
2.) 加载p1分区后,仅对该分区 (而不是整个表) 运行统计信息。
3.) 运行统计信息后,将对该表执行select语句,基本上是这样的:
因此,在第3步中,我试图告诉Oracle仅在给定分区内查看。但是,我的DBA告诉我,在某些情况下,select语句仍在进行全表扫描。有没有更好的方法告诉Oracle只在p1分区内查看?
谢谢!
布莱恩
我的情况是这样的:
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” 并不是整个故事。您还需要查看分区信息,例如
选择 *
从表分区 (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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




