sql server 分割槽表之檢視分割槽表的相關資料
在向分割槽表中插入資料方法和在普遍表中插入資料的方法是完全相同的,對於程式設計師而言,不需要去理會這13條記錄研究放在哪個資料表中。當然,在查詢資料時,也可以不用理會資料到底是存放在哪個物理上的資料表中。如使用以下SQL語句進行查詢:
- select * from Sale
查詢的結果如下圖所示:
從上面兩個步驟中,根本就感覺不到資料是分別存放在幾個不同的物理表中,因為在邏輯上,這些資料都屬於同一個資料表。如果你非想知道哪條記錄是放在哪個物理上的分割槽表中,那麼就必須使用到$PARTITION函式,這個函式的可以呼叫分割槽函式,並返回資料所在物理分割槽的編號。
說起來有點難懂,不過用起來很簡單。$PARTITION的語法是:
$PARTITION.分割槽函式名(表示式)
假設,你想知道2010年10月1日的資料會放在哪個物理分割槽表中,你就可以使用以下語句來檢視。
- select $PARTITION.partfunSale ('2010-10-1')
在以上語句中,partfunSale()為分割槽函式名,括號中的表示式必須是日期型的資料或可以隱式轉換成日期型的資料,如果要問我為什麼,那麼就回想一個怎麼定義分割槽函式的吧(CREATE PARTITION FUNCTION partfunSale (datetime))。在定義partfunSale()函式時,指定了引數為日期型,所以括號中的表示式必須是日期型或可以隱式轉換成日期型的資料。以上程式碼的執行結果如下圖所示:
在該圖中可以看出,分割槽函式返回的結果為2,也就是說,2010年10月1日的資料會放在第2個物理分割槽表中。
再進一步考慮,如果想具體知道每個物理分割槽表中存放了哪些記錄,也可以使用$PARTITION函式。因為$PARTITION函式可以得到物理分割槽表的編號,那麼只要將$PARTITION.partfunSale(SaleTime)做為where的條件使用即可,如以下程式碼 所示:
- select * from Sale where $PARTITION.partfunSale(SaleTime)=1
-
select * from Sale where $PARTITION.partfunSale(SaleTime)=2
- select * from Sale where $PARTITION.partfunSale(SaleTime)=3
- select * from Sale where $PARTITION.partfunSale(SaleTime)=4
- select * from Sale where $PARTITION.partfunSale(SaleTime)=5
以上程式碼的執行結果如下圖所示:
從上圖中我們可以看到每個分割槽表中的資料記錄情況——和我們插入時設定的情況完全一致。同理可得,如果要統計每個物理分割槽表中的記錄數,可以使用如下程式碼:
- select $PARTITION.partfunSale(SaleTime) as 分割槽編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)
以上程式碼的執行結果如下圖所示:
除了在插入資料時程式設計師不需要去考慮分割槽表的物理情況之外,就是連修改資料也不需要考慮。SQL Server會自動將記錄從一個分割槽表移到另一個分割槽表中,如以下程式碼所示:
- --統計所有分割槽表中的記錄總數
- select $PARTITION.partfunSale(SaleTime) as 分割槽編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)
- --修改編號為1的記錄,將時間改為2019年1月1日
- update Sale set SaleTime='2019-1-1' where id=1
- --重新統計所有分割槽表中的記錄總數
- select $PARTITION.partfunSale(SaleTime) as 分割槽編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)
在以上程式碼中,程式設計師將其中一條資料的時間改變了,從分割槽函式中可以得知,這條記錄應該從第一個分割槽表移到第五個分割槽表中,如下圖所示。而整個操作過程,程式設計師是完全不需要干預的。