【问题标题】:Oracle Table PartitioningOracle 表分区
【发布时间】:2013-02-14 13:06:21
【问题描述】:

假设我有下表:

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. Oracle 将如何确定要转到哪个 Partition,因为 Partition 不在 ITEM_COLOR 列上?
2. 上面的 Query 会不会从 Partitioning 中受益?
3. SQL 查询是否需要在 WHERE 子句中包含分区列才能从分区中受益。
4. Partitions如何使用Indexes?

【问题讨论】:

    标签: sql oracle database-design partitioning


    【解决方案1】:

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

    partition的概念不能用简单的答案很好地解释,最好阅读文档来理解。

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

    前往

    http://docs.oracle.com/cd/E11882_01/server.112/e25789/schemaob.htm#CFAGCECI 或者 http://docs.oracle.com/cd/E11882_01/server.112/e25554/parpart.htm#i1007993 或者 http://docs.oracle.com/cd/E11882_01/server.112/e16638/data_acc.htm#i21879.

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多