国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

sqlserver 2005 如何創建分區表

2024-07-21 02:11:57
字體:
來源:轉載
供稿:網友
該文詳細介紹實現分區表的過程以及有助于完成此過程的功能。邏輯流程如下:

圖:創建分區表或索引的步驟

確定是否應為對象分區

  雖然分區可以帶來眾多的好處,但也增加了實現對象的管理費用和復雜性,這可能是得不償失的。尤其是,您可能不需要為較小的表或目前滿足性能和維護要求的表分區。前面提到的銷售方案使用分區減輕了移動行和數據的負擔,但在決定是否實現分區時,您應考慮您的方案是否存在這種負擔。

確定分區鍵和分區數

  如果您正在嘗試改善大型數據子集的性能和可管理性,并且已經定義了訪問模式,則可以使用范圍分區減少數據爭用的情況,同時減少只讀數據不需要分區時的維護工作。要確定分區數,應先評估您的數據中是否存在邏輯分組和模式。如果您通常一次只處理這些已定義子集中的少數幾個,則應定義范圍以隔離查詢,使其只處理相應的數據(即,只處理特定的分區)。

確定是否應使用多個文件組

  為了有助于優化性能和維護,應使用文件組分離數據。文件組的數目一定程度上由硬件資源決定:一般情況下,文件組數最好與分區數相同,并且這些文件組通常位于不同的磁盤上。但是,這主要適用于打算對整個數據集進行分析的系統。如果您有多個 cpu,sql server 則可以并行處理多個分區,從而大大縮短處理大量復雜報表和分析的總體時間。這種情況下,可以獲得并行處理以及在分區表中移入和移出分區的好處。

創建文件組

  如果需要為多個文件放置一個分區表以獲得更好的 i/o 平衡,則至少需要創建一個文件組。文件組可以由一個或多個文件構成,而每個分區必須映射到一個文件組。一個文件組可以由多個分區使用,但是為了更好地管理數據(例如,為了獲得更精確的備份控制),應該對分區表進行設計,以便只有相關數據或邏輯分組的數據位于同一個文件組中。使用 alter database,可以添加邏輯文件組名,然后添加文件。要為 adventureworks 數據庫創建名為 2003q3 的文件組,請按以下方式使用 alter database:

alter database adventureworks add filegroup [2003q3]



創建文件組后,使用 alter database 將文件添加到該文件組中。

alter database adventureworks
add file
(name = n'2003q3',
filename = n'c:/adventureworks/2003q3.ndf',
size = 5mb,
maxsize = 100mb,
filegrowth = 5mb)
to filegroup [2003q3]



  通過在 create table 的 on 子句中指定一個文件組,可以為文件創建一個表。但是,如果表未分區,則不能為多個文件組創建一個表。要為一個文件組創建表,請使用 create table 的 on 子句。要創建分區表,必須先確定分區的功能機制。進行分區的標準以分區函數的形式從邏輯上與表相分離。此分區函數作為獨立于表的定義存在,而這種物理分離將起到幫助作用,因為多個對象都可以使用該分區函數。因此,為表分區的第一步是創建分區函數。

為范圍分區創建分區函數

  范圍分區必須使用邊界條件進行定義。而且,即使通過 check 約束對表進行了限制,也不能消除該范圍任一邊界的值。為了允許定期將數據移入該表,需要創建最后一個空分區。

  在范圍分區中,首先定義邊界點:如果存在五個分區,則定義四個邊界點值,并指定每個值是第一個分區的上邊界 (left) 還是第二個分區的下邊界 (right)。根據 left 或 right 指定,始終有一個空分區,因為該分區沒有明確定義的邊界點。

具體來講,如果分區函數的第一個值(或邊界條件)是 '20001001',則邊界分區中的值將是:

對于 left
  第一個分區是所有小于或等于 '20001001' 的數據
  第二個分區是所有大于 '20001001' 的數據

對于 right
  第一個分區是所有小于 '20001001' 的數據
  第二個分區是所有大于或等于 '20001001' 數據

  由于范圍分區可能在 datetime 數據中進行定義,因此必須了解其含義。使用datetime具有某種含義:即總是同時指定日期和時間。未定義時間值的日期表示時間部分為“0”的 12:00 a.m。如果將 left 與此類數據結合使用,則日期為 10 月 1 日 12:00 a.m. 的數據將位于第一個分區,而 10 月份的其他數據將位于第二個分區。從邏輯上講,最好將開始值與 right 結合使用,而將結束值與 left 結合使用。下面的三個子句將創建邏輯上相同的分區結構:

range left for values ('20000930 23:59:59.997',
'20001231 23:59:59.997',
'20010331 23:59:59.997',
'20010630 23:59:59.997')



range right for values ('20001001 00:00:00.000', '20010101 00:00:00.000', '20010401 00:00:00.000', '20010701 00:00:00.000')



range right for values ('20001001', '20010101', '20010401', '20010701')



注意:此處使用 datetime 數據類型確實增加了一定的復雜性,但您需要確保設置正確的邊界情況。請注意使用 right 的簡單性,因為默認時間為 12:00:00.000 a.m。對于 left,復雜性增加是因為 datetime 數據類型具有精度。必須選擇 23:59:59.997 的原因在于,datetime 數據無法保證毫秒級別的精度。相反,datetime 數據的精度在 3.33 毫秒內。使用 23:59:59.999 這個確切的時間值是不行的,因為該值將被舍入到最接近的時間值,即第二天的 12:00:00.000 a.m。由于進行了這種舍入,將無法正確定義邊界。對于 datetime 數據,必須對明確提供的毫秒值加倍小心。

注意:分區函數還允許將函數作為分區函數定義的一部分。您可以使用 dateadd(ms,-3,'20010101'),而不是使用 '20001231 23:59:59.997' 明確定義時間。

  要在四個活動分區(每個分區代表一個日歷季度)中存儲四分之一的 orders 數據,并創建第五個分區以備將來使用(還是作為占位符,用于在分區表中移入和移出數據),請將 left 分區函數與以下四個邊界條件結合使用:

create partition function orderdaterangepfn(datetime)
as
range left for values ('20000930 23:59:59.997',
'20001231 23:59:59.997',
'20010331 23:59:59.997',
'20010630 23:59:59.997')



記住,定義四個邊界點將創建五個分區。通過查看以下數據集檢查此分區創建的數據集:

邊界點 '20000930 23:59:59.997' 作為 left(設置模式):
  最左側的分區將包含所有小于或等于 '20000930 23:59:59.997' 的值

邊界點 '20001231 23:59:59.997':
  第二個分區將包含所有大于 '20000930 23:59:59.997' 但小于或等于 '20001231 23:59:59.997' 的值

邊界點 '20010331 23:59:59.997':
  第三個分區將包含所有大于 '20001231 23:59:59.997' 但小于或等于 '20010331 23:59:59.997' 的值

邊界點 '20010630 23:59:59.997':
  第四個分區將包含所有大于 '20010331 23:59:59.997' 但小于或等于 '20010630 23:59:59.997' 的值

最后,第五個分區將包含所有大于 '20010630 23:59:59.997' 的值。

創建分區架構

  創建分區函數后,必須將其與分區架構相關聯,以便將分區定向至特定的文件組。定義分區架構時,即使多個分區位于同一個文件組中,也必須為每個分區指定一個文件組。對于前面創建的范圍分區 (orderdaterangepfn),存在五個分區;最后一個空分區將在 primary 文件組中創建。因為此分區永遠不包含數據,所以不需要指定特殊的位置。

create partition scheme orderdatepscheme
as
partition orderdaterangepfn
to ([2000q3], [2000q4], [2001q1], [2001q2], [primary])



注意:如果所有分區都位于同一個文件組中,則可以使用以下更簡單的語法:

create partition scheme orderdatepscheme
as
partition orderdaterangepfn
all to ([primary])



創建分區表

  定義分區函數(邏輯結構)和分區架構(物理結構)后,即可創建表來利用它們。表定義應使用的架構,而架構又定義函數。要將這三者結合起來,必須指定應該應用分區函數的列。范圍分區始終只映射到表中的一列,此列應與分區函數中定義的邊界條件的數據類型相匹配。另外,如果表應明確限制數據集(而不是從負無窮大到正無窮大),則還應添加 check 約束。

create table [dbo].[ordersrange]
(
[purchaseorderid] [int] not null,
[employeeid] [int] null,
[vendorid] [int] null,
[taxamt] [money] null,
[freight] [money] null,
[subtotal] [money] null,
[status] [tinyint] not null ,
[revisionnumber] [tinyint] null ,
[modifieddate] [datetime] null ,
[shipmethodid] [tinyint] null,
[shipdate] [datetime] not null,
[orderdate] [datetime] not null
constraint ordersrangeyear
check ([orderdate] >= '20030701'
and [orderdate] <= '20040630 11:59:59.997'),
[totaldue] [money] null
)
on orderdatepscheme (orderdate)
go



建立索引:是否分區

  默認情況下,分區表中創建的索引也使用相同的分區架構和分區列。如果屬于這種情況,索引將與表對齊。盡管未作要求,但將表與其索引對齊可以使管理工作更容易進行,對于滑動窗口方案尤其如此。

  例如,要創建唯一的索引,分區列必須是一個關鍵列;這將確保對相應的分區進行驗證,以保證索引的唯一性。因此,如果需要在一列上對表進行分區,而必須在另一個列上創建唯一的索引,這些表和索引將無法對齊。在這種情況下,可以在唯一的列(如果是多列的唯一鍵,則可以是任一關鍵列)中對索引進行分區,或者根本就不進行分區。請注意,在分區表中移入和移出數據時,必須刪除和創建此索引。

注意:如果您打算使用現有數據加載表并立即在其中添加索引,則通常可以通過以下方式獲得更好的性能:先加載到未分區、未建立索引的表中,然后在加載數據后創建分區索引。通過為分區架構定義群集索引,可以在加載數據后更有效地為表分區。這也是為現有表分區的不錯方法。要創建與未分區表相同的表并創建與已分區群集索引相同的群集索引,請用一個文件組目標位置替換創建表中的 on 子句。然后,在加載數據之后為分區架構創建群集索引。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平乡县| 巴林右旗| 崇州市| 迁西县| 新晃| 沐川县| 花莲市| 河津市| 舞钢市| 九寨沟县| 西青区| 梁平县| 湘潭市| 吉木萨尔县| 星子县| 抚松县| 福建省| 上高县| 墨脱县| 乌拉特前旗| 云梦县| 辽宁省| 陕西省| 英德市| 蛟河市| 新密市| 错那县| 鹤山市| 饶阳县| 云林县| 宁波市| 合川市| 盘山县| 荆州市| 赞皇县| 临武县| 义乌市| 大宁县| 乐都县| 保德县| 安阳市|