自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2005 分區(qū)模板與實例

數(shù)據(jù)庫 SQL Server
什么是分區(qū)?為什么要使用分區(qū)?簡單的回答是:為了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。通常,創(chuàng)建表是為了存儲某種實體(例如客戶或銷售)的信息,并且每個表只具有描述該實體的屬性。一個表對應(yīng)一個實體是最容易設(shè)計和理解的,因此不需要優(yōu)化這種表的性能、可伸縮性和可管理性,尤其是在表變大的情況下。

一、場景

這一段時間使用SQL Server 2005 對幾個系統(tǒng)進(jìn)行表分區(qū),這幾個系統(tǒng)都有一些特點,比如數(shù)據(jù)庫某張表持續(xù)增長,給數(shù)據(jù)庫帶來了很大的壓力。

現(xiàn)在假如提供一臺新的服務(wù)器,那么我們應(yīng)該如何規(guī)劃這個數(shù)據(jù)庫呢?應(yīng)該如何進(jìn)行最小宕機(jī)時間的數(shù)據(jù)庫轉(zhuǎn)移呢?如果規(guī)劃數(shù)據(jù)庫呢?

二、環(huán)境準(zhǔn)備

要搭建一個好的系統(tǒng),首先要從硬件和操作系統(tǒng)出發(fā),好的設(shè)置和好的規(guī)劃是高性能的前提,下面我就來說說自己的一些看法,歡迎大家提出異議;

1) 對磁盤做RAID0(比如3*300G),必要時可以考慮RAID5、RAID10;

2) 使用兩張千兆網(wǎng)卡,一張用于外網(wǎng),一張用于內(nèi)網(wǎng)(這也需要千兆路由器的配合);

3) 邏輯分區(qū)C為系統(tǒng)分區(qū)(50G),邏輯分區(qū)D為程序安裝分區(qū)(50G),邏輯分區(qū)E為數(shù)據(jù)庫文件邏輯分區(qū);

4) 安裝Microsoft Windows Server 2003, Enterprise Edition SP2(x64)操作系統(tǒng);

5) D盤格式化的時候使用默認(rèn)分配單元大小,E盤格式為64k分配單元;

6) 安裝Microsoft SQL Server 2005(x64)數(shù)據(jù)庫;

7) 在我們網(wǎng)上鄰居-本地連接-屬性-Microsoft網(wǎng)絡(luò)的文件和打印機(jī)共享-***化網(wǎng)絡(luò)應(yīng)用程序數(shù)據(jù)吞吐量(勾選上);

8) 運行-gpedit.msc-Windows設(shè)置-安全設(shè)置-本地策略-用戶權(quán)限分配-內(nèi)存中鎖定頁面-設(shè)置用戶組(比如Administrators);

9) 運行-services.msc,設(shè)置啟動類型為手動,并且停止除了SQL Server (MSSQLSERVER)之外的SQL Server服務(wù),除非你對某些服務(wù)需要啟動,比如作業(yè)、全文索引;

10) 設(shè)置虛擬內(nèi)存大小,我通常設(shè)置為4096MB-8192MB;

三、前期工作

在進(jìn)行分區(qū)之前,我們首先要分析這個表的數(shù)據(jù)量(行數(shù))有多少?這個表的存儲空間(物理存儲)有多少?需要確定分區(qū)文件多大為合理?還需要確認(rèn)我們按照表中哪個字段進(jìn)行分區(qū)?后期的維護(hù)是否需要對分區(qū)進(jìn)行管理(比如交換分區(qū)進(jìn)行數(shù)據(jù)歸檔等)?

假設(shè)我們決定以自增ID作為分區(qū)字段(其實應(yīng)該叫分區(qū)數(shù)值類型),我們就可以使用上面的行數(shù)和存儲空間來計算我們的分區(qū)邊界值了,因為我們確認(rèn)了分區(qū)文件的大小。比如我們表A記錄為:1.5億,占用空間為:700G,如果我們可以接受的文件大小為10G(這個要根據(jù)如果需要做交換分區(qū)和一些存儲空間、硬盤等信息確認(rèn)的),那么我們的分區(qū)值可以這樣計算:1.5億/(700G/10G)≈200W,也就是:200W,400W,600W等等;

分區(qū)文件在創(chuàng)建的時候就應(yīng)該初始化為包含分區(qū)邊界值數(shù)據(jù)大小,比如上面的分區(qū)文件可以設(shè)置為10G,這樣就不用重新分配空間了。也可以使用定量增長,比如2048MB。

在設(shè)置自增ID為分區(qū)字段,那么通常我們會讓ID成為聚集索引,而且設(shè)置填充因子為100%,這樣我們的數(shù)據(jù)頁就不會有空白了。

如果后期的維護(hù)需要對分區(qū)進(jìn)行管理,比如交換分區(qū)進(jìn)行數(shù)據(jù)歸檔,交換分區(qū)是需要索引對齊的,而索引對齊有兩種:索引對齊;按存儲位置對齊的表。

索引對齊:假如你想讓數(shù)據(jù)與索引分開到不同的文件,可以使用兩個不同的分區(qū)方案,但是使用同一個分區(qū)函數(shù),這樣就把索引分開了。(如圖1)

存儲位置對齊:創(chuàng)建非聚集索引的時候設(shè)置【數(shù)據(jù)空間規(guī)范】,兩個索引對象可以使用相同的分區(qū)架構(gòu),并且具有相同分區(qū)鍵的所有數(shù)據(jù)行***將位于同一個文件組中。這就叫存儲位置對齊。(數(shù)據(jù)和索引在同一個文件中)(如圖2)

(圖1)

(圖2)

#p#

四、分區(qū)步驟

下面提供了創(chuàng)建分區(qū)的代碼,其中包括模板還有例子(Ext),這里最主要是注意一些命名規(guī)范,希望對大家有用:

步驟1:MyDataBase數(shù)據(jù)庫創(chuàng)建2個文件組,如果你不想用PRIMARY作為分區(qū),你可以創(chuàng)建多一個文件組,文件組=分區(qū)值個數(shù)+1;

  1. --1.創(chuàng)建文件組 
  2. ALTER DATABASE [數(shù)據(jù)庫名] 
  3. ADD FILEGROUP [FG_表名_字段名_分區(qū)編號] 
  4. --Ext 
  5. ALTER DATABASE [MyDataBase] 
  6. ADD FILEGROUP [FG_User_Id_1] 
  7. ALTER DATABASE [MyDataBase] 
  8. ADD FILEGROUP [FG_User_Id_2] 

步驟2:MyDataBase數(shù)據(jù)庫創(chuàng)建2個文件,文件數(shù)>=文件組數(shù),一個文件不能屬于兩個不同的分組中,一個分組可以包含多個文件,注意初始化大?。ǜ鶕?jù)需求)和增長大小(百分比和字節(jié)數(shù));

  1. --2.創(chuàng)建文件 
  2. ALTER DATABASE [數(shù)據(jù)庫名] 
  3. ADD FILE 
  4. (NAME = N'FG_表名_字段名_分區(qū)編號_data',FILENAME = N'E:\DataBase\FG_表名_字段名_分區(qū)編號_data.ndf',SIZE = 30MB, FILEGROWTH = 10% ) 
  5. TO FILEGROUP [FG_表名_字段名_分區(qū)編號]; 
  6. ALTER DATABASE [數(shù)據(jù)庫名] 
  7. ADD FILE 
  8. (NAME = N'FG_表名_字段名_分區(qū)編號_data',FILENAME = N'E:\DataBase\FG_表名_字段名_分區(qū)編號_data.ndf',SIZE = 30720KB , FILEGROWTH = 10240KB ) 
  9. TO FILEGROUP [FG_表名_字段名_分區(qū)編號]; 
  10. --Ext 
  11. ALTER DATABASE [MyDataBase] 
  12. ADD FILE 
  13. (NAME = N'FG_User_Id_1_data',FILENAME = N'E:\DataBase\FG_User_Id_1_data.ndf',SIZE = 30MB, FILEGROWTH = 10% ) 
  14. TO FILEGROUP [FG_User_Id_1]; 
  15. ALTER DATABASE [MyDataBase] 
  16. ADD FILE 
  17. (NAME = N'FG_User_Id_2_data',FILENAME = N'E:\DataBase\FG_User_Id_2_data.ndf',SIZE = 30MB , FILEGROWTH = 10MB ) 
  18. TO FILEGROUP [FG_User_Id_2]; 

步驟3:MyDataBase數(shù)據(jù)庫創(chuàng)建分區(qū)函數(shù),分區(qū)值需要根據(jù)需求而變化,前面已經(jīng)做了示范了,這里使用了右分區(qū),關(guān)于邊界值的理解可以參考:解惑:對SQL Server分區(qū)進(jìn)行合并(刪除)

  1. --3.創(chuàng)建分區(qū)函數(shù) 
  2. CREATE PARTITION FUNCTION 
  3. Fun_表名_字段名(數(shù)據(jù)類型) AS 
  4. RANGE RIGHT 
  5. FOR VALUES(邊界值列表) 
  6. --Ext 
  7. CREATE PARTITION FUNCTION 
  8. Fun_User_Id(INTAS 
  9. RANGE RIGHT 
  10. FOR VALUES(100000000,200000000) 

步驟4:MyDataBase數(shù)據(jù)庫創(chuàng)建分區(qū)方案,因為前面只創(chuàng)建了2個文件組,所以這里使用了PRIMARY默認(rèn)的文件組來保存邊界值之外的數(shù)據(jù),如果你想創(chuàng)建多一個文件組也可以,如下面的Ext1與Ext2;

  1. --4.創(chuàng)建分區(qū)方案 
  2. CREATE PARTITION SCHEME 
  3. Sch_表名_字段名AS 
  4. PARTITION Fun_表名_字段名 
  5. TO(文件組列表) 
  6. --Ext1 
  7. CREATE PARTITION SCHEME 
  8. Sch_User_Id AS 
  9. PARTITION Fun_User_Id 
  10. TO([FG_User_Id_1],[FG_User_Id_2],[FG_User_Id_3]) 
  11. --Ext2 
  12. CREATE PARTITION SCHEME 
  13. Sch_User_Id AS 
  14. PARTITION Fun_User_Id 
  15. TO([FG_User_Id_1],[FG_User_Id_2],[PRIMARY]) 

步驟5:MyDataBase數(shù)據(jù)庫創(chuàng)建一個名為User的表,這個表有3個字段,Id是自增標(biāo)識,并在Id字段中創(chuàng)建聚集索引,填充因子為100%,使用上面創(chuàng)建的Sch_User_Id分區(qū)方案,創(chuàng)建有不同的創(chuàng)建方式,如Ext1、Ext2、Ext3;

  1. --5.創(chuàng)建表 
  2. --Ext1 
  3. CREATE TABLE [dbo].[User]( 
  4.     [Id] [int] IDENTITY(1,1) NOT NULL
  5.     [UserName] [nvarchar](256) COLLATE Chinese_PRC_CI_AS NULL
  6.     [Age] [intNULL CONSTRAINT [DF_User_Age] DEFAULT ((0)), 
  7.  
  8.  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
  9.     [Id] ASC 
  10. )WITH( PAD_INDEX = ON, FILLFACTOR = 100, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id](Id) 
  11. ON [Sch_User_Id]([Id]) 
  12. --Ext2 
  13. CREATE TABLE [dbo].[User]( 
  14.     [Id] [int] IDENTITY(1,1) NOT NULL
  15.     [UserName] [nvarchar](256) COLLATE Chinese_PRC_CI_AS NULL
  16.     [Age] [intNULL CONSTRAINT [DF_User_Age] DEFAULT ((0)), 
  17. ON [Sch_User_Id]([Id]) 
  18. GO 
  19. CREATE CLUSTERED INDEX [IX_User_Id] ON dbo.[User
  20.     [Id] 
  21. WITH( PAD_INDEX = ON, FILLFACTOR = 100, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id](Id) 
  22. GO 
  23. --Ext3 
  24. ALTER TABLE dbo.[UserADD CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
  25.     Id 
  26. WITH( PAD_INDEX = ON, FILLFACTOR = 100, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id](Id) 
  27. GO 

步驟6:User表創(chuàng)建測試數(shù)據(jù),這里我就模擬從一個存在的OldUser表中導(dǎo)入數(shù)據(jù)到分區(qū)User表,這里需要注意SET IDENTITY_INSERT ON 這個選項;

  1. --6.導(dǎo)入數(shù)據(jù) 
  2. SET IDENTITY_INSERT 表ON 
  3. INSERT INTO dbo.表 
  4. (      [Id] 
  5.       ,[UserName] 
  6.       ,[Age]) 
  7. SELECT 
  8.        [Id] 
  9.       ,[UserName] 
  10.       ,[Age] 
  11. FROM dbo.[OldUser](nolock) WHERE 條件 
  12. SET IDENTITY_INSERT 表OFF 
  13. --Ext 
  14. SET IDENTITY_INSERT [UserON 
  15. INSERT INTO dbo.[User
  16. (      [Id] 
  17.       ,[UserName] 
  18.       ,[Age]) 
  19. SELECT 
  20.        [Id] 
  21.       ,[UserName] 
  22.       ,[Age] 
  23. FROM dbo.[OldUser](nolock) WHERE Id <= 1 and Id > 100000000 
  24. SET IDENTITY_INSERT [UserOFF  

步驟7:當(dāng)需要查詢分區(qū)User表記錄所處的分區(qū)情況時,可以使用下面的SQL;

  1. --7.分區(qū)函數(shù)的記錄數(shù) 
  2. SELECT $PARTITION.分區(qū)函數(shù)(字段) AS Partition_num, 
  3.  MIN(Id) AS Min_value,MAX(Id) AS Max_value,COUNT(1) AS Record_num 
  4. FROM dbo.[User
  5. GROUP BY $PARTITION.分區(qū)函數(shù)(字段) 
  6. ORDER BY $PARTITION.分區(qū)函數(shù)(字段); 
  7. --Ext 
  8. SELECT $PARTITION.Fun_User_Id(Id) AS Partition_num, 
  9.  MIN(Id) AS Min_value,MAX(Id) AS Max_value,COUNT(1) AS Record_num 
  10. FROM dbo.[User
  11. GROUP BY $PARTITION.Fun_User_Id(Id) 
  12. ORDER BY $PARTITION.Fun_User_Id(Id); 

步驟8:其實到這里實例應(yīng)該結(jié)束了吧?在網(wǎng)上看到的所有關(guān)于分區(qū)的文章中貌似都是在這里結(jié)束了,但是還有一點我需要指出:如果創(chuàng)建存儲位置對齊的索引呢?也許通過上面的圖2你已經(jīng)了解了什么是存儲位置對齊,如果還不清楚可以查看:SQL Server 2005 中的分區(qū)表和索引(http://msdn.microsoft.com/zh-cn/library/ms345146%28SQL.90%29.aspx),其實很簡單,如Ext所示,但是主要是理解它的原理和作用;

  1. --8.創(chuàng)建非聚集索引 
  2. CREATE NONCLUSTERED INDEX IX_表_字段ON dbo.表 
  3.     字段 
  4. WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id]([Id]) 
  5. GO 
  6. --Ext 
  7. CREATE NONCLUSTERED INDEX IX_User_UserName ON dbo.[User
  8.     UserName 
  9. WITH( PAD_INDEX = ON, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id]([Id]) 
  10. GO 

步驟9:還不想結(jié)束?呵呵,這個包含性索引的創(chuàng)建就當(dāng)是買8送1吧;

  1. --9.創(chuàng)建包含性索引 
  2. CREATE NONCLUSTERED INDEX [IX_User_UA_Include] ON dbo.[User
  3.     UserName, 
  4.     Age 
  5. INCLUDE ([Id]) 
  6. WITH( PAD_INDEX = ON, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [Sch_User_Id]([Id]) 
  7. GO 

五、注意

上面的代碼中我們把文件與文件組是一 一對應(yīng)起來的,如果我們想更小話文件的話,我們可以在文件組下面創(chuàng)建多個文件,并且設(shè)置文件的***值(MAXSIZE),這樣就會把數(shù)據(jù)分配到不同的物理文件上,但是有一點需要注意,那就是它是一個個的使用文件的,當(dāng)一個用完了才會使用下一個的。

日志文件也可以像上面的做法來做,這樣收縮日志的時候比較方便?刪除日志文件比較方便?

有一點我們可能會混淆,那就是既然可以在一個文件組里面創(chuàng)建多個文件,那么這個跟我們按照Id的自增來分布數(shù)據(jù)是不是等效的?這是有不同的,因為從創(chuàng)建分區(qū)方案的時候我們就發(fā)現(xiàn)文件組和分區(qū)邊界值是對應(yīng)的,所以一段分區(qū)值這些數(shù)據(jù)是分配到以文件組為單位的存儲單元中,并不是文件。

補(bǔ)充一下,那就是在文件組下面創(chuàng)建的文件只能按照設(shè)置的***值(MAXSIZE)來區(qū)分?jǐn)?shù)據(jù),并不能按照值來區(qū)分,這也算一個不同點吧。

六、后記

如果這些表是寫的多,讀的少:類似記錄日志,我們還有一些方案可以進(jìn)行處理,比如SQL Server 2008的行壓縮、頁壓縮等;比如MySQL的IASM數(shù)據(jù)引擎;或者是使用MySQL的master/slave負(fù)載均衡。

原文鏈接:http://www.cnblogs.com/gaizai/archive/2010/12/31/1923232.html

【編輯推薦】

  1. SQL Server復(fù)災(zāi) 你懂了嗎?
  2. SQL Server管理 這些你懂嗎?
  3. 客戶的一次疏忽,DBA的一次噩夢
  4. 單數(shù)據(jù)庫vs多數(shù)據(jù)庫,單實例vs多實例 效率測試
  5. 關(guān)于Update在不同數(shù)據(jù)庫的使用
責(zé)任編輯:艾婧 來源: 聽風(fēng)吹雨的博客
相關(guān)推薦

2010-09-03 10:40:30

SQL刪除

2010-09-09 16:10:57

sql server2循環(huán)

2010-07-20 17:47:12

2010-07-06 10:36:35

SQL Server

2011-04-18 13:02:08

SQL Server SQL Server

2009-10-23 10:08:29

SQL SERVER

2010-07-16 14:17:18

SQL Server

2011-08-22 09:55:30

SQL Server 排序

2010-07-16 09:57:44

SQL Server

2010-07-19 11:01:55

SQL Server

2010-07-13 12:26:49

SQL Server

2011-09-07 15:11:31

SQL Server同步

2011-04-18 10:13:15

SQL Server 自動化表分區(qū)

2010-07-13 10:11:48

SQL Server

2010-07-26 17:43:34

SQL Server

2010-06-28 13:51:18

SQL Server

2010-07-23 12:55:29

SQL Server

2010-09-13 11:09:34

SQL SERVER分

2011-08-22 14:00:13

SQL Server 游標(biāo)調(diào)用函數(shù)

2010-07-09 11:06:13

SQL Server
點贊
收藏

51CTO技術(shù)棧公眾號