0

假设我有下表:

Table Name: ITEM
Columns: ID, ITEM_NUM, ITEM_COLOR, ITEM_SPEC, ITEM_STATUS

并且 ITEM 表在 ITEM_STATUS 列上进行了 (LIST) 分区。
ITEM_STATUS 可以具有的唯一值是:Active、Inactive、Suspended
ID 是 PK,因此上面有索引。

现在,当我执行此查询时:

select * from ITEM where ITEM_COLOR="Green"

请帮助我
1. 由于分区不在 ITEM_COLOR 列上,Oracle 如何确定要转到哪个分区?
2. 上面的 Query 会不会从 Partitioning 中受益?
3. SQL 查询是否需要在 WHERE 子句中包含分区列才能从分区中受益。
4. Partitions如何使用Indexes?

4

3 回答 3

1

如果无法确定您的查询是否只需要来自特定分区的数据,Oracle 必须查看表的所有分区。

分区的概念不能用简单的答案来很好地解释,最好阅读文档以有一个很好的理解。

无论如何,在进入这个之前一定要先有性能问题,如果不是让表不分区。

http://docs.oracle.com/cd/E11882_01/server.112/e25789/schemaob.htm#CFAGCECIhttp://docs.oracle.com/cd/E11882_01/server.112/e25554/parpart.htm# i1007993http://docs.oracle.com/cd/E11882_01/server.112/e16638/data_acc.htm#i21879

于 2013-02-14T13:19:53.117 回答
0

在您的示例中,它不会使用分区修剪(这是仅选择一个分区以知道从何处检索信息),并将进入所有分区。当然,如果不使用ITEM_STATUS,oracle就不能只使用一个分区。

您的查询不会从分区中受益。

您不需要将分区列放在 where 子句中,您可以使用FROM table partition (ACTIVE).

您可以使用分区索引或普通索引。

于 2013-02-14T13:21:04.687 回答
0

将您的分区表视为三个表。ITEM_active、ITEM_inactive、ITEM_suspended。物理上共有三张表。从逻辑上讲,您有一张桌子。

因此,当您要求一种颜色时,您需要扫描所有三个表,因为绿色项目可能处于活动状态或不处于活动状态,或者处于暂停状态。换句话说,您不会从此查询的分区中受益。

问题 3:不。分区模式应该对查询是透明的。我会指定:查询必须独立于分区(也就是说,不要指定分区名称,而是使用 where 子句过滤数据)。请求暂停项目的查询将隐含地从分区中受益:将仅扫描包含暂停项目的分区。

问题 4:索引可能是全局的(所有分区上的单个索引对象 - 更难维护)或本地的(每个分区的物理索引)。索引列有利于使用索引进行快速搜索。分区索引没有什么特别之处。

于 2013-02-14T13:20:17.530 回答