【问题标题】:Simulating and manipulating a partitioned database on multiple locations在多个位置模拟和操作分区数据库
【发布时间】:2017-04-18 13:48:42
【问题描述】:

假设我创建了下表:

CREATE TABLE TABLE1 
( 
id INT NOT NULL
country VARCHAR(10) NOT NULL
name VARCHAR(10) NOT NULL
productType VARCHAR(10) NOT NULL
)

例如,如果我有不同的 producType 值(type1、type2 .. 等) 我根据这些类型进行分区,例如 partition1 用于 type1 等等。 国家的可能值是:国家 1、国家 2 和国家 3。 如何执行或模拟基于国家/地区的水平碎片,并能够使用与此类似的命令:

SELECT * FROM partition1@country1
WHERE name = someName

是否要求数据库必须存储在多个服务器上才能做到这一点? 如果是这样,是否有另一种不需要这样做的方法(在 Oracle 11g 上)?

【问题讨论】:

  • 12c 之前不支持分片(物理分区)。但是,如果您不希望这些国家/地区驻留在多个服务器上,那么无论如何您都不是在谈论分片。那你想要什么?
  • 表分区不被认为是分片?我正在做一个作业,我必须做一个水平碎片,这也必须基于位置,所以我必须使用一些命令,我​​必须在其中指定位置,如“@countryName”,我不'不知道在没有多个服务器但只有分区表的情况下是否可以在 Oracle 11g 中做到这一点。
  • 没有。共享是跨多个数据库实例拆分表。分区是在一个数据库中组织表的布局。
  • 那个命令只能在有多个数据库实例的情况下使用?

标签: sql database oracle oracle11g partitioning


【解决方案1】:

您要对表进行子分区吗?也就是按列表(ProductType)分区,按列表(国家)分区?

这是可以做到的。

子分区生成的名称不反映键的名称。所以他们不适合明确引用分区的方式 select 语句将在 WHERE 子句中引用国家:

select * from your_table partition (p_prodtype_0001)
where country = 'country1' 

在这种情况下,优化器仍然可以应用子分区修剪。

您可以通过在不同模式中使用相同名称的不同表来伪造共享,无论是在同一个数据库中还是在不同的数据库中。您可以使用不同国家/地区的名称创建数据库链接。这将允许您使用@country1 或其他任何东西。插入会很棘手。可能您必须有一个视图和一个 INSTEAD OF 触发器。

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2012-11-18
    • 2012-02-15
    • 2023-03-12
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多