優化SQLServer——表和分區索引


概念:

           簡單地說,分區是將大型的對象(如表)分成更小的且易於管理的小塊。分區的基本單位是行,需要注意的是與分區視圖不同的地方時,分區必須位於同一個數據庫內。

分區的原因:

           對於非常大的表在進行諸如數據庫維護、備份或者還原操作的時候會消耗大量的時間;除此之外還會增加標的死鎖或者並發性的問題的概率。當然我們也可以通過Database Tuning Advisor 運行工作負載,將對是否需要分區給出建議並生產代碼。

創建分區的過程:

            1.創建分區函數來定義一種數據放置策略。

             create partition function years(datetime)

             as range right

             for values(‘時間點1’,’時間點2’…)

          如上面的代碼。最左邊的分區是小於時間點1的所有數據行數據,第二個分區是大於或者等於時間點1小於時間點2的所有分區,以此類推即可。范圍函數制定范圍的邊界,left 和right 關鍵字制定數據庫引擎按照升序從左到右進行排序時邊界值屬於左邊或者右邊,這里不難發現我們這個是right 那么邊界值屬於右邊。默認為left。

            2.創建文件分組來支持分區函數。

               作為最佳實踐,一般可以創建用戶對象,並將它映射到主文件組之外的文件組,按照之前的情況我們建立文件組y01,y02,y03…

            3.創建分區方案來定義物理數據分布策略(將函數數據映射到文件組)。

               分區方案是將數據庫對象映射到物理實體(文件組)然后映射到文件的方案。進行這種決策時必須考慮備份、還原和數據歸檔。這留到以后專門的文章來介紹這塊。

               代碼:create partition scheme yearscheme

               as partition years to y01,y02…

            4.創建分區函數創建表或索引。

                創建分區表的語法跟常規表相同,唯一不同是在分區架構而不是特定或默認的文件組中創建。

               create table 表名

                 (       字段1   類型 null,

                          字段2    類型 not null,

                          時間字段    datetime not null,…   

                         constraint  index

                         check([時間字段] >=‘時間點1’and [時間字段]<‘時間點2’)

                      ) on yearscheme

                    go

            5.享受對相應資源的重新定向查詢。

 

              最后我們還要考慮存儲對齊和索引對齊帶來的好處。通過alert table 表名 switch partition 分區 to 表

以及alert partition function prderdaterandepfn() merge range (‘時間點’) 來切換和合並分區。

 

 

    總結:

                  我們知道什么時候使用分區,也知道了分區是一種性能提高的可選項或者可管理性和可擴展性,根據上面的步驟可以很快建立分區,提高數據庫的效率。同時我們也要注意其影響的一下功能,如:數據庫的備份還原,索引的維護,數據管理策略,工作負載,並發性(查詢並發和表分區鎖)等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM