【1】sql server表分區與分表的關系
(1.1)sql server表分區
SQL Server 表分區是一項很棒的功能,可用於透明地將大表拆分為多個較小的表。
它允許您將數據存儲在多個文件組中,並將數據庫文件保存在不同的磁盤驅動器中,並且能夠輕松地將數據移入和移出分區表。
表分區的一個常見示例是將舊數據歸檔到慢速磁盤驅動器並使用快速磁盤驅動器存儲經常訪問的數據。表分區通過排除結果集中不需要的分區來提高查詢性能。
但是表分區僅在企業 SQL Server 版中可用,由於其昂貴的許可證成本,對於大多數中小型公司來說,升級到它並不容易。
(1.2)sql server分區視圖-- Partitioned Views(基於分表)
幸運的是,SQL Server 允許您設計自己的分區解決方案,而無需將當前的 SQL Server 實例升級到企業版。
這個新選項稱為Partitioned Views。雖然這個新的解決方案不像表分區那樣靈活,但如果設計得當,分區視圖會給你一個很好的結果。
您可以手動設計將用作分區的表,並使用分區視圖中的 UNION ALL 運算符將它們組合在一起,這將像表分區一樣工作。
SQL Server 分區視圖使您能夠根據特定列值在邏輯上將存在於大型表中的大量數據拆分為較小的數據范圍,並將這些數據范圍存儲在參與的表中。
為此,應在分區列上定義 CHECK 約束以將數據划分為數據范圍。
然后,將創建一個分區視圖,該視圖使用 UNION ALL 運算符將來自所有參與表的 SELECT 組合為一個結果集。
CHECK 約束用於在從視圖中選擇數據時指定哪個表包含請求的數據,類似於在表分區特性中定義分塊函數。檢查約束還用於提高查詢性能,如果參與表中未定義 CHECK 約束,
【2】分表與分區視圖
(2.1)構建分表與分區視圖
-- 構建分表 CREATE TABLE Shipments_Q1 ( Ship_Num INT NOT NULL, Ship_CountryCode CHAR(3) NOT NULL, Ship_Date DATETIME NULL, Ship_Quarter SMALLINT NOT NULL CONSTRAINT CK_Ship_Q1 CHECK (Ship_Quarter = 1), CONSTRAINT PK_Shipments_Q1 PRIMARY KEY (Ship_Num, Ship_Quarter) ); GO CREATE TABLE Shipments_Q2 ( Ship_Num INT NOT NULL, Ship_CountryCode CHAR(3) NOT NULL, Ship_Date DATETIME NULL, Ship_Quarter SMALLINT NOT NULL CONSTRAINT CK_Ship_Q2 CHECK (Ship_Quarter = 2), CONSTRAINT PK_Shipments_Q2 PRIMARY KEY (Ship_Num, Ship_Quarter) ); GO CREATE TABLE Shipments_Q3 ( Ship_Num INT NOT NULL, Ship_CountryCode CHAR(3) NOT NULL, Ship_Date DATETIME NULL, Ship_Quarter SMALLINT NOT NULL CONSTRAINT CK_Ship_Q3 CHECK (Ship_Quarter = 3), CONSTRAINT PK_Shipments_Q3 PRIMARY KEY (Ship_Num, Ship_Quarter) ); GO CREATE TABLE Shipments_Q4 ( Ship_Num INT NOT NULL, Ship_CountryCode CHAR(3) NOT NULL, Ship_Date DATETIME NULL, Ship_Quarter SMALLINT NOT NULL CONSTRAINT CK_Ship_Q4 CHECK (Ship_Quarter = 4), CONSTRAINT PK_Shipments_Q4 PRIMARY KEY (Ship_Num, Ship_Quarter) ); go -- 構建分區視圖 CREATE VIEW DBO.Shipments_Info AS SELECT [Ship_Num],[Ship_CountryCode],[Ship_Date],[Ship_Quarter] FROM DBO.Shipments_Q1 UNION ALL SELECT [Ship_Num],[Ship_CountryCode],[Ship_Date],[Ship_Quarter] FROM DBO.Shipments_Q2 UNION ALL SELECT [Ship_Num],[Ship_CountryCode],[Ship_Date],[Ship_Quarter] FROM DBO.Shipments_Q3 UNION ALL SELECT [Ship_Num],[Ship_CountryCode],[Ship_Date],[Ship_Quarter] FROM DBO.Shipments_Q4 GO
那么如上面代碼,我們這里的 主鍵是 ship_num,ship_quarter 的組合主鍵,與表分區對比的話,ship_quarter 就是分區列;
(2.2)對分區視圖操作:根據主鍵與分區列自動插入到對應表
-- 插入視圖,自動對應插入到表中去了 insert into Shipments_Info values(1,1,getdate(),1) select * from Shipments_Q1
(2.3)查詢這個視圖
如下圖,2個圖,無論是 左邊還是右邊,但我們查詢的時候是在視圖中的四個表都會去查詢的;
(2.4)正確的查詢視圖方式(加上分區列)
如下圖,用分區列查詢,我們就可以精准命中
就此達到了 找到對應實際表操作,精准命中了操作訪問范圍 從4個表 變成了1個表;
【參考文檔】
轉自:https://www.sqlshack.com/sql-server-partitioned-views/