SQLServer之建立分區視圖

分區視圖定義

分區視圖是經過對成員表使用 UNION ALL 所定義的視圖,這些成員表的結構相同,但做爲多個表分別存儲在同一個 SQL Server實例中,或存儲在稱爲聯合數據庫服務器的自主 SQL Server 服務器實例組中。數據庫

對一個服務器的本地數據進行分區的首選方法是經過分區表。服務器

不能使用SSMS數據庫管理工具建立分區視圖,可使用Transact-SQL腳本建立分區視圖。架構

建立分區視圖的條件

一、選擇 list分佈式

應在視圖定義的列列表中選擇成員表中的全部列。
每一個 select list 中的同一序號位置上的列應屬於同一類型,包括排序規則。 列僅僅屬於可隱式轉換的類型(如一般狀況下的 UNION)是不夠的。
約束應按照如下方式定義:<col> 的任何指定值最多隻能知足一個 C1, ..., Cn 約束,從而使約束造成一組不聯接或不重疊的間隔。 定義不聯接的約束的列 <col> 稱爲分區列。 請注意,分區列在基礎表中可能有不一樣的名稱。 約束應處於啓用和信任狀態,以使它們知足分區列的上述條件。 若是約束被禁用,則使用 ALTER TABLE 的 CHECK CONSTRAINT constraint_name 選項從新啓用約束檢查,並使用 WITH CHECK 選項對其進行驗證。
在選擇列表中不能屢次使用同一列。
二、分區列函數

分區列是表的 PRIMARY KEY 的一部分。工具

分區列不能是計算列、標識列、默認列或 timestamp 列。加密

若是成員表中的同一列上存在多個約束,則數據庫引擎將忽略全部約束,且在肯定視圖是否爲分區視圖時不考慮這些約束。 若要知足分區視圖的條件,在分區列上應只有一個分區約束。spa

分區列的可更新性沒有限制。排序

三、成員表或基礎表 T1, ..., Tn索引

表能夠是本地表,也能夠是經過由四部分組成的名稱或基於 OPENDATASOURCE 或 OPENROWSET 的名稱引用的運行SQL Server 的其餘計算機中的表。 OPENDATASOURCE 和 OPENROWSET 語法能夠指定表名,但不能指定直接傳遞查詢。 有關詳細信息,請參閱 OPENDATASOURCE (Transact-SQL) 和 OPENROWSET (Transact-SQL)。

若是一個或多個成員表是遠程表,則視圖將被稱爲「分佈式分區視圖」,而且將應用附加條件。 本部分後面將對其進行說明。

在用 UNION ALL 語句組合的表集合中,同一個表不能出現兩次。

成員表不能對錶中的計算列建立索引。

成員表在編號相同的列上應具備全部 PRIMARY KEY 約束。

視圖中的全部成員表都應具備相同的 ANSI 填充設置。 這可使用 sp_configure 中的 user options 選項或 SET 語句進行設置。

使用T-SQL腳本建立分區視圖

語法:

--聲明數據庫引用
use 數據庫名;
go

--判斷是否存在分區視圖,若是存在則刪除
if exists(select * from sys.views where name=視圖名稱)
drop view 視圖名稱;
go

--建立分區視圖
create
view

--視圖所屬架構的名稱。
--schema_name
[dbo].視圖名稱

--視圖中的列使用的名稱。 僅在下列狀況下須要列名:列是從算術表達式、函數或常量派生的;兩個或更多的列可能會具備相同的名稱(一般是因爲聯接的緣由);視圖中的某個列的指定名稱不一樣於其派生來源列的名稱。 還能夠在 SELECT 語句中分配列名。
--若是未指定 column,則視圖列將得到與 SELECT 語句中的列相同的名稱。
(列名,列名,.......)

[with]

--適用範圍: SQL Server 2008 到 SQL Server 2017 和 Azure SQL Database。
--對 sys.syscomments 表中包含 CREATE VIEW 語句文本的項進行加密。 使用 WITH ENCRYPTION 可防止在 SQL Server 複製過程當中發佈視圖。
encryption

--指定爲引用視圖的查詢請求瀏覽模式的元數據時, SQL Server 實例將向 DB-Library、ODBC 和 OLE DB API 返回有關視圖的元數據信息,而不返回基表的元數據信息。
--瀏覽模式元數據是 SQL Server 實例向這些客戶端 API 返回的附加元數據。 若是使用此元數據,客戶端 API 將能夠實現可更新客戶端遊標。 瀏覽模式的元數據包含結果集中的列所屬的基表的相關信息。
--對於使用 VIEW_METADATA 建立的視圖,瀏覽模式的元數據在描述結果集內視圖中的列時,將返回視圖名,而不返回基表名。
--當使用 WITH VIEW_METADATA 建立視圖時,若是該視圖具備 INSTEAD OF INSERT 或 INSTEAD OF UPDATE 觸發器,則視圖的全部列(timestamp 列除外)均可更新。 有關可更新視圖的詳細信息,請參閱「備註」。
[view_metadata]

as
select_statement
go

示例:

--聲明數據庫引用
use testss;
go

--判斷是否存在分區視圖,若是存在則刪除
if exists(select * from sys.views where name='partitionview')
drop view partitionview;
go

--建立分區視圖
create
view

--視圖所屬架構的名稱。()
--schema_name
dbo.partitionview

--視圖中的列使用的名稱。 僅在下列狀況下須要列名:列是從算術表達式、函數或常量派生的;兩個或更多的列可能會具備相同的名稱(一般是因爲聯接的緣由);視圖中的某個列的指定名稱不一樣於其派生來源列的名稱。 還能夠在 SELECT 語句中分配列名。
--若是未指定 column,則視圖列將得到與 SELECT 語句中的列相同的名稱。
(name,sex)

with

--適用範圍: SQL Server 2008 到 SQL Server 2017 和 Azure SQL Database。
--對 sys.syscomments 表中包含 CREATE VIEW 語句文本的項進行加密。 使用 WITH ENCRYPTION 可防止在 SQL Server 複製過程當中發佈視圖。
encryption,

--指定爲引用視圖的查詢請求瀏覽模式的元數據時, SQL Server 實例將向 DB-Library、ODBC 和 OLE DB API 返回有關視圖的元數據信息,而不返回基表的元數據信息。
--瀏覽模式元數據是 SQL Server 實例向這些客戶端 API 返回的附加元數據。 若是使用此元數據,客戶端 API 將能夠實現可更新客戶端遊標。 瀏覽模式的元數據包含結果集中的列所屬的基表的相關信息。
--對於使用 VIEW_METADATA 建立的視圖,瀏覽模式的元數據在描述結果集內視圖中的列時,將返回視圖名,而不返回基表名。
--當使用 WITH VIEW_METADATA 建立視圖時,若是該視圖具備 INSTEAD OF INSERT 或 INSTEAD OF UPDATE 觸發器,則視圖的全部列(timestamp 列除外)均可更新。 有關可更新視圖的詳細信息,請參閱「備註」。
view_metadata

as
--查詢時避免使用*號,升級架構或者增刪字段時會出錯
select a.name,a.sex from [testss].[dbo].test1 as a
union all
select b.name,b.sex from [Tests].[dbo].test1 as b
go

示例結果:

分區視圖建立結果。

clipboard.png

分區視圖使用結果。

clipboard.png

相關文章
相關標籤/搜索