在链接表上创建分区视图

时间:2016-01-09 16:08:48

标签: sql sql-server tsql database-partitioning

我在SQL Server中学习分区表,我遇到了这个问题:我有2个链表 - 父和子。其中一个(或者甚至两个)是一个分区表。当我实现分区视图时,我需要在其中包含2个相同的列 - 引用父表(来自子)的列和被引用的主键(来自父)?

自从MSDN说:

以来,我一直对它喋喋不休
  

列规则:

     

每个成员表中的所有列都必须包含在选择列表中。 SELECT * FROM是可接受的语法。

但是视图应该使(链接)表的表示更容易,因此并不是所有列都应该包含在视图中。

在我的情况下,根据MSDN,我必须将两个表的所有列都包含在视图中(其中2个是相同的)。在我看来,这不是一个非常合理的解决方案。

例如:

数据库1:

create table manufacturer 
(
    id                 int,
    manufacturer_name  varchar(35),

    PRIMARY KEY (id),
    CONSTRAINT CHK_manufacturer_id
        CHECK (id < 1000)
);

create table product 
(
    pid           int,
    product_name  varchar(35),
    mid           int,

    PRIMARY KEY (pid),
    CONSTRAINT CHK_product_pid
        CHECK (pid < 1000),
    CONSTRAINT FK_product_mid
        FOREIGN KEY (mid)
        REFERENCES manufacturer(id)
);

数据库2:

Same tables with CHECK constraints (id >= 1000)

查看:

create view dist_view as
    select * 
    from db1.product p1
    inner join db1.manufacturer m1 on p1.mid = m1.id

    UNION ALL

    select * 
    from db2.product p2
    inner join db2.manufacturer m2 on p2.mid = m2.id

所以视图看起来像

pid | prod_name | mid | id | manufact_name

和mid = id。

在我看来,这样的观点与使用视图的主要优点相矛盾 - 表的简单表示。所以我希望有这样的观点:

(pid) | prod_name | manufact_name

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,您可能不应该费心学习分区视图。正确的分区方法是使用分区表而不是视图。

documentation中重复此操作。例如:

  

注意

     

将数据本地分区到一台服务器的首选方法是   通过分区表。有关更多信息,请参阅分区   表和索引。

(我注意到您的查询都在一台服务器上。)

其次,{em}基础表上的union all创建了分区视图。您正在使用join,因此这只是一个常规视图。

我建议您重新评估数据结构,并考虑分区表而不是分区视图。