<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0

    http://www.cnblogs.com/smjack/archive/2010/02/23/1671943.html

    和壓縮(Compression)相比,數(shù)據(jù)庫(kù)分區(qū)(Partition)的操作更為復(fù)雜繁瑣。而且與Compression一次操作,終身保持不同,分區(qū)是一項(xiàng)需要長(zhǎng)期維護(hù)周期變更的操作。

    分區(qū)的意義在于將大數(shù)據(jù)從物理上切割為幾個(gè)相互獨(dú)立的小部分,從而在查詢時(shí)只取出其中一個(gè)或幾個(gè)分區(qū),減少影響的數(shù)據(jù);另外對(duì)于置于不同文件組的分區(qū),并行查詢的性能也要高于對(duì)整個(gè)表的查詢性能。

    事實(shí)上,在SQL Server 2005中就已經(jīng)包含了分區(qū)功能,甚至在2005之前,還存在一個(gè)叫做“Partitioned Views”的功能,能通過(guò)將同樣結(jié)構(gòu)的表Union在一個(gè)View中,實(shí)現(xiàn)類似現(xiàn)在分區(qū)表的效果。而在SQL Server 2008中,分區(qū)功能得到了顯著加強(qiáng),使得我們不僅能夠?qū)Ρ砗退饕龇謪^(qū),而且允許對(duì)分區(qū)上鎖,而不是之前的全表上鎖

    指定分區(qū)列

    和Compression一樣,在SQL Server 2008中也提供了分區(qū)的向?qū)Ы缑?。在企業(yè)管理器中,需要分區(qū)的表上右鍵選擇Storage-》Create Partition:

    SqlServer性能優(yōu)化——Partition(創(chuàng)建分區(qū))

     

    這里會(huì)列出該表所有的字段,包括字段類型、長(zhǎng)度、精度及小數(shù)位數(shù)的信息,可以選擇其中的任意一一列作為分區(qū)列(Patitioning Column),不僅僅是數(shù)字或者日期類型,即使是字符串類型的列,也可以按照字母順序進(jìn)行分區(qū)。而以下類型的列不可用于分區(qū):text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名、hierarchyid、空間索引或 CLR 用戶定義的數(shù)據(jù)類型。此外,如果使用計(jì)算列作為分區(qū)列,則必須將該列設(shè)為持久化列(Persisit)。

    在列表下方,提供了兩個(gè)選項(xiàng):

    1. 分配到可用分區(qū)表
      這要求在同一數(shù)據(jù)庫(kù)下有另一張已分好區(qū)的表,同時(shí)該表的分區(qū)列和當(dāng)前選中的列的類型完全一致。
      這樣的好處是當(dāng)兩張表在查詢中有關(guān)聯(lián)時(shí),并且其關(guān)聯(lián)列就是分區(qū)列時(shí),使用同樣的分區(qū)策略會(huì)更有效率。
    2. 將非唯一索引和唯一索引的存儲(chǔ)空間調(diào)整為與索引分區(qū)列一致
      這樣會(huì)將表中的所有索引也一同分區(qū),實(shí)現(xiàn)“對(duì)齊”。這是一個(gè)重要而麻煩的選項(xiàng),具體需求請(qǐng)參閱MSDN(已分區(qū)索引的特殊指導(dǎo)原則)。
      這樣的好處是表和索引的分區(qū)一致,一方面查詢時(shí)利用索引更為高效,而且在下文提到的移入移出分區(qū)也會(huì)更為高效。

    注意:這里建議使用聚集索引列作為分區(qū)列。一方面索引結(jié)構(gòu)本身就應(yīng)與查詢相關(guān),那么分區(qū)列與索引一致會(huì)保證查詢的最大效率;另一方面,保證索引對(duì)齊而且是聚集索引對(duì)齊是保證分區(qū)的移入移出操作順暢的前提,否則可能會(huì)出現(xiàn)無(wú)法移入移出的情況,而分區(qū)的移入移出又是管理大數(shù)據(jù)的重要策略——滑動(dòng)窗口(SlideWindow)策略的基礎(chǔ)操作。另外,如果要進(jìn)行索引對(duì)齊,需要所有索引和表的壓縮模式一致。

    分區(qū)函數(shù)與分區(qū)方案

    選好分區(qū)列后,如果沒有應(yīng)用“分配到可用分區(qū)表”選項(xiàng),接下來(lái)則會(huì)進(jìn)入選擇\創(chuàng)建分區(qū)函數(shù)以及分區(qū)方案的界面。其中分區(qū)函數(shù)會(huì)指定分區(qū)邊界,而分區(qū)方案則規(guī)劃了每個(gè)分區(qū)所存儲(chǔ)的文件組。

    向?qū)Р僮鹘缑嫒缦拢?/p>

    SqlServer性能優(yōu)化——Partition(創(chuàng)建分區(qū))

    其中Left boundary說(shuō)明每個(gè)分區(qū)的邊界值被包含在邊界值左側(cè)的分區(qū)中,也就是每個(gè)分區(qū)內(nèi)的數(shù)據(jù)約束是<=指定的邊界值,相應(yīng)的,Right boundary則說(shuō)明每個(gè)分區(qū)的邊界值被包含在邊界值右側(cè)的分區(qū)中,每個(gè)分區(qū)內(nèi)的數(shù)據(jù)約束是<指定的邊界值

    在下方的列表中,列出了當(dāng)前分區(qū)方案下現(xiàn)有的分區(qū)。其中文件組(Filegroup)指定了每個(gè)分區(qū)存放的位置,如果將分區(qū)放置于位于不同磁盤中的不同文件組中,由于不同磁盤的讀寫互不干擾,這將提高分區(qū)表并行處理的效率。一般情況下,將所有分區(qū)放置在同一個(gè)文件組是比較穩(wěn)妥的做法。關(guān)于文件組的展開閱讀可以參閱:SQL Server Filegroups。

    注意,在這里最后一個(gè)分區(qū)是沒有指定邊界的,用于保存所有>(Left Boundary)或>=(Right boundary)最后一個(gè)分區(qū)邊界的數(shù)據(jù)。

    如果選擇時(shí)間類型的字段作為分區(qū)列,可以通過(guò)Set按鈕實(shí)現(xiàn)按條件分組:

    SqlServer性能優(yōu)化——Partition(創(chuàng)建分區(qū))

    這樣可以很方便得通過(guò)設(shè)置起止時(shí)間將表按照指定時(shí)間段自動(dòng)分區(qū),但之后依然需要手動(dòng)指定每個(gè)分區(qū)的文件組。

    制定好分區(qū)方案之后可以通過(guò)Estimate sotrage預(yù)估每個(gè)分區(qū)的行數(shù)、空間占用情況,不過(guò)除非需要以占用空間或行數(shù)來(lái)規(guī)劃你的分區(qū)策略,一般不建議在這里進(jìn)行預(yù)估,因?yàn)槿绻麑?duì)空表來(lái)說(shuō),預(yù)估的結(jié)果當(dāng)然都是0,而如果表中已經(jīng)包含大量數(shù)據(jù),預(yù)估則會(huì)花費(fèi)比較長(zhǎng)的時(shí)間。

    創(chuàng)建分區(qū)

    通過(guò)以上設(shè)置,分區(qū)已經(jīng)基本完畢,在向?qū)У淖詈?,可以選擇是創(chuàng)建腳本還是立即執(zhí)行分區(qū)操作。

    我們可以查看在不同情況下創(chuàng)建分區(qū)的腳本的情況:

    1.在表沒有索引的情況下:

    BEGIN TRANSACTION
    CREATE PARTITION FUNCTION [TestFunction](datetime) AS RANGE LEFT FOR VALUES (N'2010-01-01T00:00:00', N'2010-02-01T00:00:00', 
    N'2010-03-01T00:00:00', N'2010-04-01T00:00:00', N'2010-05-01T00:00:00', N'2010-06-01T00:00:00') CREATE PARTITION SCHEME [TestScheme] AS PARTITION [TestFunction] TO ([PRIMARY], [PRIMARY], [PRIMARY],
    [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]) CREATE CLUSTERED INDEX [ClusteredIndex_on_TestScheme_634025264502439124] ON [dbo].[Account] ( [birthday] )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [TestScheme]([birthday]) DROP INDEX [ClusteredIndex_on_TestScheme_634025264502439124] ON [dbo].[Account] WITH ( ONLINE = OFF ) COMMIT TRANSACTION

    這里先創(chuàng)建Partition Function以及Partition Scheme,之后在分區(qū)列上創(chuàng)建聚集索引并按照分區(qū)方案分區(qū),最后刪除了這一索引。</>

    2.在表有索引的情況下:

    如果原先沒有聚集索引:

    CREATE CLUSTERED INDEX [ClusteredIndex_on_TestScheme_634025229911990663] ON [dbo].[Account]
    (
    [birthday]
    )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [TestScheme]([birthday])
    DROP INDEX [ClusteredIndex_on_TestScheme_634025229911990663] ON [dbo].[Account] WITH ( ONLINE = OFF )
    

    這和沒有索引的情況一樣,如果表原先存在聚集索引,則腳本變?yōu)椋?/p>

    CREATE CLUSTERED INDEX [IX_id] ON [dbo].[Account]
    (
    [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, 
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [TestScheme]([birthday])

    可以看到原有的聚集索引(IX_id)在分區(qū)方案上被重建了。

    如果選擇了“對(duì)齊索引”選項(xiàng),則會(huì)對(duì)所有索引都應(yīng)用分區(qū):

    CREATE CLUSTERED INDEX [IX_id] ON [dbo].[Account]
    (
    [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, 
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [TestScheme]([birthday]) CREATE NONCLUSTERED INDEX [UIX_birthday] ON [dbo].[Account] ( [birthday] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON,
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [TestScheme]([birthday]) CREATE NONCLUSTERED INDEX [UIX_name] ON [dbo].[Account] ( [name] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON,
    ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

    這里不僅對(duì)聚集索引IX_id進(jìn)行了分區(qū),也對(duì)非聚集索引UIX_name和UIX_birthday進(jìn)行了分區(qū)。

    注意事項(xiàng)

    1. 對(duì)一張表分好區(qū)后不可以進(jìn)行再次分區(qū),同時(shí)也沒有直接取消表分區(qū)的方法。
    2. 如果要查看已分區(qū)表的分區(qū)狀態(tài)以及每個(gè)分區(qū)中的行數(shù)和占用空間,可以通過(guò)Storage-》Management Compression查看。同時(shí)可以在這里為每個(gè)分區(qū)指定壓縮方式。
    3. 如果分區(qū)表索引沒有對(duì)齊,則不可以對(duì)該表進(jìn)行切入切出(Switch in/out)操作,同樣也不能執(zhí)行滑動(dòng)窗口操作
    4. 分區(qū)實(shí)際上是在每個(gè)分區(qū)表都添加了約束,相應(yīng)的插入操作的性能也會(huì)受到影響。
    5. 即使進(jìn)行了分區(qū),如果查詢的條件字段和分區(qū)列并沒有關(guān)聯(lián),性能也未必會(huì)得到提升。

    附:對(duì)分區(qū)并行查詢的說(shuō)明

    由于我在實(shí)際操作中主要考慮并行查詢方面的效率,所以文章里只是略略帶過(guò),但評(píng)論中有人提到,所以摘錄整理一些資料在下面:

    1. 并行查詢肯定需要多核支持,單核下并行是不可能的。
    2. 在2005中,如果有兩個(gè)以上的Partition,一個(gè)線程對(duì)應(yīng)一個(gè)Partition,所以如果有10個(gè)線程,卻只有3個(gè)分區(qū)的話,就會(huì)有7個(gè)線程被浪費(fèi)。
    3. 在2008中,這一問(wèn)題被改進(jìn),所有的線程都被投入到所有的Partition中。具體可以參看Partitioning enhancements in SQL Server 2008。
    posted on 2011-04-20 15:54 SIMONE 閱讀(2326) 評(píng)論(0)  編輯  收藏 所屬分類: SQL SERVER
    主站蜘蛛池模板: 最近2019免费中文字幕6| 瑟瑟网站免费网站入口 | 中文亚洲AV片在线观看不卡| 国产精品亚洲w码日韩中文| 亚洲人成色777777在线观看| 91亚洲精品第一综合不卡播放| 亚洲成人免费网站| 亚洲成在人线aⅴ免费毛片 | 亚洲精品无码成人片久久不卡 | 亚洲一区免费视频| 免费高清av一区二区三区| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲中文字幕无码一区| 亚洲精品乱码久久久久久下载| 亚洲一级毛片视频| 污污的视频在线免费观看| 免费日本一区二区| 免费无码A片一区二三区| 少妇亚洲免费精品| 亚洲黄色在线观看| 亚洲av成人一区二区三区观看在线| 国产精品午夜免费观看网站| 国产免费女女脚奴视频网| 免费在线不卡视频| 久久99亚洲网美利坚合众国| 蜜桃传媒一区二区亚洲AV| 久久99毛片免费观看不卡| 青青草国产免费久久久91| 亚洲av无码一区二区三区乱子伦| 亚洲熟妇无码AV| 免费在线看黄的网站| 日韩a在线观看免费观看| 亚洲av无码片在线播放| 成a人片亚洲日本久久| 精品无码人妻一区二区免费蜜桃| 国产无遮挡吃胸膜奶免费看视频| 亚洲av成人无码久久精品| 国产精品无码亚洲一区二区三区| 久久免费视频99| 免费99热在线观看| 亚洲一区二区三区无码国产|