性能調優10:調整分區


未分區的表,相當於只有一個分區,只能存儲在一個FileGroup中;對表進行分區后,每一個分區都存儲在一個FileGroup,或分布式存儲在不同的FileGroup中。對表進行分區的過程,實際上是將邏輯上完整的一個表,按照特定的字段拆分成多個分區,分散到相同或不同的FileGroup中,每一個部分叫做表的一個分區(Partition),一個分區實際上是一個獨立的,內部的物理表。也就是說,分區表在邏輯上是一個表,而在物理上是多個完全獨立的表。

一,分區對性能的提升

分區對性能的提升,主要體現:系統的物理硬盤分擔IO,把資源的爭用局限在特定的分區中。

1,分攤IO

對表分區后,把表數據分散到不同的文件組中,每個文件組可以存放在不同的物理硬盤上,這就使得數據的查詢可以分攤到不同的物理硬盤上,以並發方式調用各個硬盤的IO資源,也就是說,把數據分配給多個物理硬盤,這些物理硬盤同時讀寫數據,成倍提升數據讀寫的速度。

當查找的數據位於某一個分區內時,那么分區使得對數據的操作被局限在一個分區中,而不需要從整個數據集中進行讀寫,從而減少讀寫數據所需要的IO次數。

2,降低鎖粒度

當表分區后,加鎖的粒度從表級別降低到分區級別,這使得對一個分區執行更新操作,同時不會影響另一個分區的讀取操作。因此,分區可以降低並發查詢系統產生死鎖和阻塞的概率,增加數據操作的並發度,從整體上提高系統的性能。

二,調整分區

分區能夠提升性能,就在於把數據分散,如果數據不能分散到不同的物理硬盤,那么對性能的提升將大打折扣,因此,在對表進行分區時,應盡量使得每個分區存儲的數據相同。分區大小增加的速度跟文件組所在的硬盤空閑空間有關,空閑空間越大,SQL Server分配給該空間的數據量越大,導致該分區的大小增加越快。為了使每個分區的數量盡量均衡,應使得每個文件組的大小保持相同,不同的物理硬盤容量也盡量保持相同。

另外,數據訪問的頻次是不同的,有些數據可能被經常訪問,而有些數據很少被訪問。根據數據被訪問的頻次,可以把常用的數據切換到性能最好的文件組中,也就是說,該文件組中的文件創建在性能最好的硬盤上,把不常用的數據切換到性能較差的文件組中,這樣,常用數據的訪問會以最快的速度讀寫。對於那些歸檔的數據,可以使用分區切換到臨時表,再轉移到備用的數據庫服務器中。

還有,要合理選擇分區列,盡量把可能同時修改的數據分散到不同的分區中,減少資源爭用,使互斥的操作在不同的分區同時進行,增加系統執行查詢的並發度。

調整分區,不僅以來業務邏輯,還要對分區的統計數據有所了解。

1,查看分區

通過系統視圖:sys.partitions 查看分區對象(Table或index)的基本信息,在該視圖中,如果index_id=0,表示基礎表(Underlying Table)是堆(Heap)結構,堆表是沒有創建的聚集索引的存儲結構;如果index_id=1,表示基礎表是平衡樹(B-Tree)結構,在堆表上創建聚集索引,可以把堆表結構轉換為平衡樹(B-Tree)結構;如果index_id>1,表示索引是非聚集索引。由於基礎表要么是堆表結構,要么是B-Tree結構,因此,index_id只會是0,或者1,不可能同時存在1和0。

data_compression 字段表示每個分區的數據壓縮類型,rows字段表示每個分區的近似的數據總行數。通過統計rows字段,能夠快速統計基礎表近似的總的數據行數量,設置條件 index<=1,表示只統計聚集索引或堆表的總數據行數量。

select sum(rows) as ApproximateTotalRows
from sys.partitions
where object_id=object_id('xx.yyy','U')
    and index_id<=1

2,統計每個分區占用的存儲空間

在做分區時,應盡量保證每個分區的數據行總量均勻分布,每個分區占用的存儲空間均勻分布,避免單個分區過大,系統視圖 sys.dm_db_partition_stats 能夠查看每個分區所占用的Pages數量。

select ps.partition_id,
    ps.object_id,
    ps.index_id,
    ps.partition_number,
    ps.in_row_data_page_count,
    ps.in_row_used_page_count,
    ps.in_row_reserved_page_count,
    ps.lob_used_page_count,
    ps.lob_reserved_page_count,
    ps.row_overflow_used_page_count,
    ps.row_overflow_reserved_page_count,
    ps.used_page_count,
    ps.reserved_page_count,
    ps.row_count
from sys.dm_db_partition_stats ps
where ps.object_id=object_id('xx.xx','U')

3,統計每個分區對象的占用的總的Pages數量

select 
    ps.object_id,
    ps.index_id,
    sum(ps.in_row_data_page_count) as data_pages,
    sum(ps.used_page_count) as used_pages,
    sum(ps.reserved_page_count) as reserved_pages
from sys.dm_db_partition_stats ps
where ps.object_id=object_id('xx.xx','U')
group by ps.object_id,ps.index_id

4,查看每個分區的分配單元(Allocation Unit)

SQL Server為每個分區分配了一個分配單元(allcotion unit),用於為該分區分配存儲空間,通過系統內部視圖:sys.system_internals_allocation_units, 能夠查看該alloction unit分配的Page類型等信息。

select *
from sys.system_internals_allocation_units
where container_id=72057621135294464  --partition id

參考文檔:

sys.dm_db_partition_stats (Transact-SQL)


免責聲明!

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



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