在链接表上创建分区视图
Create partitioned view on linked tables
我正在学习 SQL 服务器中的分区 tables,但我遇到了这个问题:我有 2 个链接的 tables - parent 和 child。其中之一(或什至两者)是分区 table。当我实现分区视图时,我是否需要在其中包含 2 个相同的列 - 引用 parental table(来自 child)的列和被引用的主键(来自 parent)?
我遇到了麻烦,因为 MSDN 说:
Column Rules:
All columns in each member table must be included in the select list. SELECT * FROM is acceptable syntax.
但是视图应该使(链接的)table 的表示更容易,因此并非所有列都应包含在视图中。
在我的例子中,根据 MSDN,我必须将两个 table 的所有列都包含到一个视图中(其中 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.
在我看来,这样的视图与使用视图的主要优势——tables 的简单表示相矛盾。所以我想有这样的观点:
(pid) | prod_name | manufact_name
我该如何解决这个问题?
首先,您可能不应该费心学习分区视图。进行分区的正确方法是使用分区表,而不是视图。
这在 documentation 中重复。例如:
Note
The preferred method for partitioning data local to one server is
through partitioned tables. For more information, see Partitioned
Tables and Indexes.
(我注意到您的查询都在一台服务器上。)
其次,分区视图由 union all
在 base 表上创建。您正在使用 join
s,所以这只是一个常规视图。
我建议您 re-evaluate 您的数据结构,并更多地考虑分区表而不是分区视图。
我正在学习 SQL 服务器中的分区 tables,但我遇到了这个问题:我有 2 个链接的 tables - parent 和 child。其中之一(或什至两者)是分区 table。当我实现分区视图时,我是否需要在其中包含 2 个相同的列 - 引用 parental table(来自 child)的列和被引用的主键(来自 parent)?
我遇到了麻烦,因为 MSDN 说:
Column Rules:
All columns in each member table must be included in the select list. SELECT * FROM is acceptable syntax.
但是视图应该使(链接的)table 的表示更容易,因此并非所有列都应包含在视图中。
在我的例子中,根据 MSDN,我必须将两个 table 的所有列都包含到一个视图中(其中 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.
在我看来,这样的视图与使用视图的主要优势——tables 的简单表示相矛盾。所以我想有这样的观点:
(pid) | prod_name | manufact_name
我该如何解决这个问题?
首先,您可能不应该费心学习分区视图。进行分区的正确方法是使用分区表,而不是视图。
这在 documentation 中重复。例如:
Note
The preferred method for partitioning data local to one server is through partitioned tables. For more information, see Partitioned Tables and Indexes.
(我注意到您的查询都在一台服务器上。)
其次,分区视图由 union all
在 base 表上创建。您正在使用 join
s,所以这只是一个常规视图。
我建议您 re-evaluate 您的数据结构,并更多地考虑分区表而不是分区视图。