當前位置:首頁 » 編程語言 » sqlserver創建表分區
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver創建表分區

發布時間: 2023-03-06 10:33:59

sqlserver2008怎麼實現自動分區表

/*第一步:創建分區函數*/

Create partition function Part_func_Bag(varchar(20)) as range right

/*正式區間

for values(N'01100923909760', N'01100936207030', N'6311001806524',N'92451400060101');*/for values(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714');goselect * from Bag where BagCode in(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714')

/*第二步:創建文件組和文件*/

alter database ZXAutoCode add filegroup [Bag_1]; alter database ZXAutoCode add filegroup [Bag_2];alter database ZXAutoCode add filegroup [Bag_3];alter database ZXAutoCode add filegroup [Bag_4];goalter database ZXAutoCode add file (name = Bag1_data,filename = 'E:\MSSQL\TESTDATA\Bag1_data.ndf',size = 3MB) to filegroup [Bag_1];alter database ZXAutoCode add file (name = Bag2_data,filename = 'E:\MSSQL\TESTDATA\Bag2_data.ndf',size = 3MB) to filegroup [Bag_2];alter database ZXAutoCode add file (name = Bag3_data,filename = 'E:\MSSQL\TESTDATA\Bag3_data.ndf',size = 3MB) to filegroup [Bag_3]; alter database ZXAutoCode add file (name = Bag4_data,filename = 'E:\MSSQL\TESTDATA\Bag4_data.ndf',size = 3MB) to filegroup [Bag_4]; go

/*第三步:創建分區方案並關聯到分區函數*/

Create partition scheme Part_func_Bag_scheme as partition Part_func_Bag to ([Bag_1],[Bag_2],[Bag_3],[Bag_4],[Primary]); go

/*第四步 重建索引(刪除聚集索引以及需要分區欄位的索引後重建該類索引,表被按分區值將分配到各文件組。數據在這一步開始轉移。)*/

EXEC sp_helpindex N'Bag' --查看orders中使用的索引 drop index idx_cl_od on Bag;gocreate clustered index idx_cl_od on Bag(bagcode) on Part_func_Bag_scheme(bagcode); go

Ⅱ 如何使用SQLServer資料庫按月創建表分區

create table xxx(id number,time date)
parttion by range(time)
(partion part1 values less than (to_date('2012-01-31','yyyy-mm-dd')) tablespace tb1,
partion part 2 vales less than(to_date('2012-01-31','yyyy-mm-dd')) tablespace tb2);

Ⅲ sqlserver 2012 怎麼建立分區

本文是我關於資料庫分區的方案的一些想法,或許有些問題。僅供大家討論。SqlServer (SqlServer 2005\SqlServer 2008)實現分區需要在企業版下進行.
SqlServer的分區分為大致有以下個過程:1、創建文件組用以存放數據文件 2、創建文件組用戶數據文件 3、創建分區函數 4、創建分區方案 5、在分區方案下創建表
本文是在SqlServer2012 下完成的。
http://blog.csdn.net/fwj380891124/article/details/48372791

Ⅳ sqlserver數據越來越多,原先表創建的分區不夠用了,怎麼樣添加新的

切換進PE系統,用遨梅分區,增加擴分區,或無損合並;只能相鄰的分區借空間,中間執行不能斷電的。注意保存。。。

Ⅳ 如何對一個已經存在的SQL Server表分區

有兩種方法可以實現對一個表分區.一是創建一個新的標識為分區表的表(你可參照此步驟),然後把數據復制到這張新表,再對這兩張表分別改名.或者,像我寫在下面的,通過重建或創建一個聚集索引來達到分區一個表.
一個SQL Server表和數據進行分區示例
--Table/Index creation
CREATE TABLE [dbo].[TABLE1]
([pkcol] [int] NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] datetime)
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED (pkcol)
GO
CREATE NONCLUSTERED INDEX IX_TABLE1_col2col3 ON dbo.TABLE1 (datacol1,datacol2)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
-- Populate table data
DECLARE @val INT
SELECT @val=1
WHILE @val < 1000
BEGIN
INSERT INTO dbo.Table1(pkcol, datacol1, datacol2, datacol3, partitioncol)
VALUES (@val,@val,@val,'TEST',getdate()-@val)
SELECT @val=@val+1
END
GO
通過查看sys.partitions系統視圖,上面的代碼創建了一個傳統的單分區表.
SELECT o.name objectname,i.name indexname, partition_id, partition_number, [rows]
FROM sys.partitions p
INNER JOIN sys.objects o ON o.object_id=p.object_id
INNER JOIN sys.indexes i ON i.object_id=p.object_id and p.index_id=i.index_id
WHERE o.name LIKE '%TABLE1%'

objectname

indexname

partition_id

partition_number

rows

TABLE1 PK_TABLE1 72057594042712064 1 999
TABLE1 IX_TABLE1_col2col3 72057594042777600 1 999

創建已分區的SQL Server表
為了創建一個分區表,需要先創建一個分區函數和分區方案. 下面的示例中,將通過datatime欄位對一個表分區. 這里是創建這些對象與在系統視圖中查看這些元數據的代碼.
CREATE PARTITION FUNCTION myDateRangePF (datetime)
AS RANGE RIGHT FOR VALUES ('20110101', '20120101','20130101')
GO
CREATE PARTITION SCHEME myPartitionScheme
AS PARTITION myDateRangePF ALL TO ([PRIMARY])
GO
SELECT ps.name,pf.name,boundary_id,value
FROM sys.partition_schemes ps
INNER JOIN sys.partition_functions pf ON pf.function_id=ps.function_id
INNER JOIN sys.partition_range_values prf ON pf.function_id=prf.function_id
現在我們有一個分區方案,可對表進行分區操作. 既然我們想通過聚集索引來對一個創建了聚集索引的表進行分區,我們需要先刪除掉這個索引並通過一個非聚集索引重建這個約束. 若這張表沒有聚集索引,我們可忽略這一步,直接執行創建聚集索引語句. 類似地,若有一個聚集索引創建在分區欄位上,我們可執行帶DROP_EXISTING的創建聚集索引語句. 最後,若關注於執行此任務時資料庫停止服務時間並且你使用的是SQL Server企業版本,可通過創建索引的ONLINE=ON選項來使資料庫的停止服務時間最小. 記住,在使用ONLINE選項重建索引時,你可能會看到一些性能降低的現象. 這里是一些可能會乃至的腳本.
ALTER TABLE dbo.TABLE1 DROP CONSTRAINT PK_TABLE1
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY NONCLUSTERED (pkcol)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX IX_TABLE1_partitioncol ON dbo.TABLE1 (partitioncol)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON myPartitionScheme(partitioncol)
GO
在這些語句結束後,我們可再次查看sys.partitions系統視圖(看上面的代碼)並確認我們的表有4個分區.

objectname

indexname

partition_id

partition_number

rows

TABLE1 IX_TABLE1_partitioncol 72057594043039744 1 233
TABLE1 IX_TABLE1_partitioncol 72057594043105280 2 365
TABLE1 IX_TABLE1_partitioncol 72057594043170816 3 366
TABLE1 IX_TABLE1_partitioncol 72057594043236352 4 35
TABLE1 IX_TABLE1_col2col3 72057594043301888 1 999
TABLE1 PK_TABLE1 72057594043367424 1 999
SQL Server表和數據示例清除
--cleanup
DROP TABLE TABLE1
DROP PARTITION SCHEME myPartitionScheme
DROP PARTITION FUNCTION myDateRangePF

Ⅵ 十、MySQL表分區

  表分區是將⼀個表的數據按照⼀定的規則⽔平劃分為不同的邏輯塊,並分別進⾏物理存儲,這個規則就叫做分區函數,可以有不同的分區規則。5.7可以通過show plugins語句查看當前MySQL是否⽀持表分區功能。

  但當表中含有主鍵或唯⼀鍵時,則每個被⽤作 分區函數的欄位必須是表中唯⼀鍵和主鍵的全部或⼀部分 ,否則就⽆法創建分區表。⽐如下⾯的表由於唯⼀鍵和主鍵沒有相同的欄位,所以⽆法創建表分區

上述例⼦中刪除唯⼀鍵,確保主鍵中的欄位包含分區函數中的所有欄位,創建成功

或者將主鍵擴展為包含ref欄位

表分區的主要優勢在於:
  可以允許在⼀個表⾥存儲更多的數據,突破磁碟限制或者⽂件系統限制
  對於從表⾥將過期或歷史的數據移除在表分區很容易實現,只要將對應的分區移除即可
  對某些查詢和修改語句來說,可以 ⾃動 將數據范圍縮⼩到⼀個或⼏個表分區上,優化語句執⾏效率。⽽且可以通過 顯示指定表分區 來執⾏語句,⽐如 SELECT * FROM t PARTITION (p0,p1) WHERE c < 5

表分區類型分為:


范圍表分區,按照⼀定的范圍值來確定每個分區包含的數據,分區函數使⽤的欄位必須只能是 整數類型,分區的定義范圍必須是連續的,且不能有重疊部分,通過使⽤VALUES LESS THAN來定義分區范圍,表分區的范圍定義是從⼩到⼤定義的

⽐如:

  Store_id<6的數據被放在p0分區⾥,6<=store_id<10之間的數據被放在p1分區⾥,以此類推,當新插⼊的數據為(72, 『Mitchell』, 『Wilson』, 『1998-06-25』, NULL, 13) 時,則新數據被插⼊到p2分區⾥,但當插⼊的數據的store_id為21時,由於沒有分區去容納此數據,所以會報錯,我們需要修改⼀下表的定義
報錯:

修改表的定義:

   MAXVALUE關鍵詞的作⽤是表示可能的最⼤值,所以任何store_id>=16的數據都會被寫⼊到p3分區⾥。分區函數中也可以使⽤表達式 ,⽐如:

   對timestamp欄位類型可以使⽤的表達式⽬前僅有unix_timestamp ,其他的表達式都不允許


列表表分區,按照⼀個⼀個確定的值來確定每個分區包含的數據,通過PARTITION BY LIST(expr)分區函數表達式必須返回整數,取值范圍通過VALUES IN (value_list)定義

對List表分區來說,沒有MAXVALUE特殊值,所有的可能取值都需要再VALUES IN中包含,如果有未定義的取值則會報錯

同樣,當有主鍵或者唯⼀鍵存在的情況下,分區函數欄位需要包含在主鍵或唯⼀鍵中

對range和list表分區來說,分區函數可以包含多個欄位,分區多欄位函數(column partition) 所涉及的欄位類型可以包括:

范圍多欄位分區函數與普通的范圍分區函數的區別在於:
a) 欄位類型多樣化
b) 范圍多欄位分區函數 不⽀持表達式,只能⽤欄位名
c) 范圍多欄位分區函數⽀持⼀個或多個欄位

再⽐如創建如下的表分區:

對多列對⽐來說:

當然只要保證取值范圍是增⻓的,表分區就能創建成功,⽐如:

但如果 取值范圍不是增⻓的,就會返回錯誤

對其他數據類型的⽀持:

list列表多欄位表分區,例如:你有一個在12個城市客戶的業務, 為了銷售和市場的目的, 你的組織每3個城市劃分為一個區域針對LIST COLUMNS分區, 你可以基於城市的名稱創建一個客戶數據表並聲明4個分區當你的客戶在對應的這個區域:

使用日期分區

但是這種情況在日期增長到非常大的時候是很復雜的, 所以這種還是使用RANGE 分區方式比較好


  按照⼀個⾃定義的函數返回值來確定每個分區包含的數據,這個 ⾃定義函數也可以僅僅是⼀個欄位名字
  通過PARTITION BY HASH (expr)⼦句來表達哈希表分區,其中的 expr表達式必須返回⼀個整數,基於分區個數的取模(%)運算。根據余數插⼊到指定的分區
  對哈希表分區來說只需要定義分區的個數,其他的事情由內部完成

如果沒有寫明PARTITIONS欄位,則默認為1,表達式可以是整數類型欄位,也可以是⼀個函數,⽐如

⽐如: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH( YEAR(col3) ) PARTITIONS 4;
如果插⼊⼀條數據對應的col3為『2005-09-15』時,則插⼊數據的分區計算⽅法為:


  與哈希表分區類似,只不過哈希表分區依賴於⾃定義的函數,⽽key表分區的哈希演算法是依賴MySQL本身, CREATE TABLE ... PARTITION BY KEY () 創建key表分區, 括弧⾥⾯可以包含0個或者多個欄位,所引⽤的欄位必須是主鍵或者主鍵的⼀部分 ,如果括弧⾥⾯沒有欄位,則代表使⽤主鍵

如果表中沒有主鍵但有唯⼀鍵,則使⽤唯⼀鍵,但 唯⼀鍵欄位必須定義為not null ,否則報錯

所引⽤的欄位未必必須是整數類型,其他的類型也可以使⽤,⽐如:

⼦表分區,是在表分區的基礎上再創建表分區的概念, 每個表分區下的⼦表分區個數必須⼀致 ,⽐如:

ts表擁有三個范圍分區,同時每個分區都各⾃有兩個⼦分區,所以總共有6個分區

⼦表分區必須是范圍/列表分區+哈希/key⼦表分區的組合
⼦表分區也可以顯示的指定⼦表分區的名字,⽐如:

不同的表分區對NULL值的處理⽅式不同
對范圍表分區來說,如果插⼊的是NULL值,則將數據放到最⼩的分區表⾥

對list表分區來說,⽀持NULL值的唯⼀情況就是某個分區的允許值中包含NULL

對哈希表分區和Key表分區來說,NULL值會被當成0值對待

通過alter table命令可以執⾏增加,刪除,重新定義,合並或者拆分表分區的管理動作
對范圍表分區和列表表分區來說,刪除⼀個表分區命令如下:

刪除表分區的動作不光會把分區刪掉,也會把表分區⾥原來的數據給刪除掉

在原分區上增加⼀個表分區可以通過alter table … add partition語句來完成

但對范圍表分區來說,增加的表分區必須在尾部增加,在頭部或者在中間增加都會失敗:

為解決這個問題,可以使⽤ REORGANIZE 命令:

對列表表分區來說,只要新增加的分區對應的值在之前的表分區中沒有出現過,就可以通過alter table… add partition來增加

當然, 也可以通過REORGANIZE命令將之前的多個分區合並成⼀個或⼏個分區,但要保持分區值⼀致:

更復雜的⽐如將多個分區重組成多個分區: