測試大型資料表的 Horizontal Partitioning 水平切割
FileGroup 檔案群組 :
一個「資料庫(database)」可對應一或多個 FileGroup,一個 FileGroup 可由一或多個 file (.ndf) 構成。 FileGroup 可讓 SQL Server 彈性地調整空間大小,亦可達到讓不同的磁碟 I/O,來幫助分流、提升效能,例如筆數極大的「資料表(table)」,可用 FileGroup 做「水平資料分割 (Horizontal Partitioning)」,內地稱為「表分區」。 Horizontal Partitioning 的相關指令如下 :
alter database NORTHWND add filegroup FileGroup1;
alter database NORTHWND add filegroup FileGroup2;
alter database NORTHWND add filegroup FileGroup3; alter database NORTHWND add file(name=FG11, filename='C:\test\FG11.ndf') to filegroup FileGroup1;
alter database NORTHWND add file(name=FG21, filename='C:\test\FG21.ndf', size=10MB),
(name=FG22, filename='C:\test\FG22.ndf', size=10MB) to filegroup FileGroup2;
alter database NORTHWND add file(name=FG31, filename='C:\test\FG31.ndf') to filegroup FileGroup3; --依「訂單日期」欄位,自動將 record 儲存至不同的 FileGroup、實體 file
create partition function partitionFunction_OrderDate(datetime) as range RIGHT for values('1997/01/01','1998/01/01','1999/01/01'); --1997/01/01 之前的舊 record,存至 FileGroup1 (FG11.ndf)
--1997/01/01~1998/12/31 的 record,存至 FileGroup2 (FG21.ndf、FG22.ndf)
--1999/01/01 及之後的 record,存至 FileGroup3 (FG31.ndf)
create partition scheme partitionScheme_OrderDate as partition partitionFunction_OrderDate to (FileGroup1, FileGroup2, FileGroup2, FileGroup3);
create table Orders2(
OrderID int not null,
OrderDate datetime not null default getdate(),
CustID varchar(6),
EmpID varchar(6)) ON partitionScheme_OrderDate(OrderDate) --從 Orders 資料表,匯入測試用資料 (都是早期年份,2000 年之前的記錄)
INSERT INTO Orders2(OrderID, OrderDate, CustID, EmpID) SELECT OrderID, OrderDate, CustomerID, EmployeeID FROM Orders
--新增幾筆 OrderDate 較新的資料,供測試用 (2014 年份)
INSERT INTO Orders2(OrderID, OrderDate, CustID, EmpID) VALUES(12001, getdate(), '2014/7', '2014/7')
INSERT INTO Orders2(OrderID, OrderDate, CustID, EmpID) VALUES(12002, getdate(), '2014/8', '2014/8')
INSERT INTO Orders2(OrderID, OrderDate, CustID, EmpID) VALUES(12003, getdate(), '2014/9', '2014/9') --檢查 Orders2 資料表中的資料,其水平切割、分組情形,或者由 sys.partitions 檢視表中查詢每個 partition 的資料筆數
SELECT index_id, partition_number, rows FROM sys.partitions
WHERE object_id = OBJECT_ID('Orders2') ORDER BY index_id, partition_number; --測試日後新增 partition 時 (模擬企業在每年進入新的年份,都要持續新建 partition,供搬移歷史舊資料)
alter database NORTHWND add filegroup FileGroup4;
alter database NORTHWND add file(name=FG41, filename='C:\test\FG41.ndf') to filegroup FileGroup4; --split 新 partition (以 2000/01/01 年為分界點)
alter partition scheme partitionScheme_OrderDate NEXT USED [FileGroup4];
alter partition function partitionFunction_OrderDate() SPLIT range ('2000/01/01'); --create partition scheme partitionScheme_OrderDate as partition partitionFunction_OrderDate to (FileGroup1, FileGroup2, FileGroup2, FileGroup3); --split 新 partition 之後,既有的記錄 (2000/01/01 之後的記錄) 會自動搬移 (視 OrderDate 欄位的年份自動對應),不用資訊人員手動搬移
SELECT index_id, partition_number, rows FROM sys.partitions
WHERE object_id = OBJECT_ID('Orders2') ORDER BY index_id, partition_number; --日後再 insert 的記錄 (2000/01/01 之後的記錄),會自動改寫至 FileGroup4
INSERT INTO Orders2(OrderID, OrderDate, CustID, EmpID) VALUES(12005, getdate(), '2014/9', '2014/9') --SELECT index_id, partition_number, rows FROM sys.partitions
--WHERE object_id = OBJECT_ID('Orders2') ORDER BY index_id, partition_number; --SELECT * FROM Orders2 ORDER BY OrderDate desc
--------------------------------------------------------------
當經費不足,無法購置 SAN / 硬體 RAID 時,亦可考慮 FileGroup,但非不得已才棄 RAID 而就 FileGroup,因後者的效能不如前者,且前者才有「快取(cache)」,後者不支援「容錯」。
FileGroup 的原理,是靠多顆硬碟同時存取,將資料打散在多顆硬碟上、存取時多顆硬碟一起運作,可提升效能 (參考圖片)。如下圖,可透過 FileGroup 的設定,將不同種類的資料,放在不同的實體硬碟上。如左下方的 C 槽,可放系統資料表,或常要維護(寫入)的一般常用資料 (.mdf)。下方的 D 槽,可存放純供查詢用的歷史性資料 (OrderHistory1.ndf、OrderHistory2.ndf、...、OrderHistoryX.ndf)。而 Log 檔 (.ldf) 可放右下方的 E 槽上。
當然,若公司的經費充足,也可透過多台 RAID,再搭配 FileGroup 一起使用,如此一來,既能容錯,又兼顧效能。

--------------------------------------------------------------
讀書隨手筆記-其他 (系統資料庫 tempdb) :
* 系統資料庫 tempdb 可改放置在快速的磁碟上,或分散到多部磁碟上,與存放一般資料的資料庫放在不同的磁碟,以確保效能。
* 可為 tempdb 資料庫,建立多個 file,數目可與伺服器 CPU 數目相同,減少 CPU 存取 tempdb 時的資源衝突,以確保效能。
相關 SQL 指令 (書中有附實際可執行程式碼) :
可透過 ALTER DATABASE tempdb MODIFY FILE 指令,將 tempdb 移至不同位置 (.mdf、.ldf)。
可透過 ALTER DATABASE tempdb ADD FILE 指令,增加、建立多個 file (.mdf、.ldf),但需要重新啟動 SQL Server。
--------------------------------------------------------------
參考書籍 :
SQL Server 2005 Performance Tuning 效能調校 (作者: 胡百敬、劉承修... 等人, 台灣書籍)
SQL Server 2012 Performance Tuning 效能調校 (作者: 胡百敬、劉承修... 等人, 台灣書籍)
http://www.tenlong.com.tw/items/9865740419?item_id=892851
SQL Server 效能調校 (作者: 陳祥輝... 等人, 台灣書籍)
http://www.tenlong.com.tw/items/9862019026?item_id=889295
測試大型資料表的 Horizontal Partitioning 水平切割的更多相关文章
- [Database][SQL] 取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
- 修改 SQL SERVER 2008 編輯前200筆 資料表問題? 转载自:http://www.dotblogs.com.tw/easy1201/archive/2008/12/04/6179.aspx
小弟前幾天 下載安裝了 SQL SERVER 2008 感覺系統效能還不錯 但是要編輯 資料表卻出現 很苦惱 但經過一番波折 終於了解如何改善 先執行SQL Server Management Stu ...
- SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」
一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...
- [心得] SQL Server Partition(表分區) 資料分佈探討
最近在群裡有個朋友問了個問題是這樣的 用户表有一千多万行,主键是用户ID,我做了分区.但经常查询时,其它的表根据用户ID来关联,这样跨区查询,reads非常高.有什么好的处理办法?不分区的话,索引维护 ...
- Active Record: 資料庫遷移(Migration) (转)
Active Record: 資料庫遷移(Migration) Programming today is a race between software engineers striving to b ...
- 如何查詢 SQL Server 資料庫中欄位值為 NULL 的資料(转)
最近使用mssql的时候对于未null的字段查询不到 http://blogs.msdn.com/b/jchiou/archive/2008/05/01/sql-server-null.aspx 先建 ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念
前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...
- [Xamarin]測試帳號申請與到期後如何續用 (转帖)
在Xamarin網站上可以申請30天試用的測試帳號.試用期內,Xamarin會提供完整的功能試用. 30天試用時間到期後,在Visual Studio裡面你載入你的專案的時候,專案旁會標註(無法使用) ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...
随机推荐
- 如何动态在spring mvc中增加bean
阅读对象 搭框架人员,或者其他感兴趣的开发人员 背景 一般来说在业务代码中,加上 @Component, @Service,@Repository, @Controller等注解就可以实现将bean注 ...
- 如何用hypermesh生成包含interface的流体网格
在计算气动声学的时候,有些情况是需要我们提取流体计算的结果作为声学分析的边界条件,但是,有些流体网格因为物理模型的问题需要我们设定interface,恰恰你是机械,对流体了解一点,又不想花费太多时间来 ...
- Delphi 关键字详解[整理于 "橙子" 的帖子]
absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: ]; StrLen: Byte absolute Str; //这个声明指定了变量 ...
- su root认证失败的解决方法
sudo passwd 输入安装密码. 输入新密码. 输入 su 即获得root权限.
- 每天一个linux命令--批处理
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 创建批处理脚本wanghy.sh: #!/bin/sh cd /opt/virgo-tomcat-se ...
- 同步机制 note
1.信号量与互斥体的不同之处: 不需要由最初获取它的那个线程来释放. 信号量可以用来调停对资源池的访问. 2. 条件变量: 允许任意复杂的条件表达式作为等待条件,允许更复杂的调度策略.
- 【转】iOS开发 -- Apple Pay
技术博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top 原技术博客中有源码和视频,有感兴趣的朋友可以研究一下! 一.什么是Apple P ...
- BZOJ2498 : Xavier is Learning to Count
考虑容斥,通过$Bell(p)$的时间枚举所有等价情况. 对于一种情况,强制了一个等价类里面的数都要相同,其它的可以相同也可以不同. 这方案数显然可以通过多项式乘法求得,乘上容斥系数$(-1)^{p- ...
- Day 2:增加SplashScreen
If you want to add just single image, then create a pic in the size of 480*800 and name it as Splash ...
- 在linux下Java的环境配置
最近开始学习Java语言. 对于我这种初学者来说,一开始,我想先体验,大致看了一下Java语言是什么,如何实现... 然并卵o_O,表示看得很迷糊.还是实践最重要,把环境配置好再开始深入学习. 1.首 ...