sql server 小記——分區表

来源:http://www.cnblogs.com/shouce/archive/2016/03/03/5237195.html
-Advertisement-
Play Games

我們知道很多事情都存在一個分治的思想,同樣的道理我們也可以用到數據表上,當一個表很大很大的時候,我們就會想到將表拆 分成很多小表,查詢的時候就到各個小表去查,最後進行彙總返回給調用方來加速我們的查詢速度,當然切分可以使用橫向切分,縱向 切分,比如我們最熟悉的訂單表,通常會將三個月以外的訂單放到歷史訂


我們知道很多事情都存在一個分治的思想,同樣的道理我們也可以用到數據表上,當一個表很大很大的時候,我們就會想到將表拆

分成很多小表,查詢的時候就到各個小表去查,最後進行彙總返回給調用方來加速我們的查詢速度,當然切分可以使用橫向切分,縱向

切分,比如我們最熟悉的訂單表,通常會將三個月以外的訂單放到歷史訂單表中,這裡的三個月就是將訂單表進行切分的依據。

 

  好了,分區表的好處我想大家都很清楚了,下麵我們看看如何實現。

一:分區表

  這裡我們做個例子,創建一個test資料庫,表名為shop,以createtime作為分區依據。

1:確定分區依據

     怎麼分區的話,這個要看具體業務邏輯了,你可以按照時間,地區,求模等等都可以。

 

2:創建文件組

   既然是文件組,肯定是對文件進行分類管理的,預設情況下就一個mdf和ldf文件,當所有的數據都擠壓在mdf上,確實不是一個

很好的事情,降低我們的查詢速度,當用到文件組的時候就可以創建多個ndf來分攤mdf中的數據,甚至還可以將ndf分攤到幾個磁碟

上,充分利用伺服器多核處理能力,說了這麼多,我們看看sql語句咋搞,這裡我創建四個文件組,分別存放2013之前,2013,2014

和2014年之後的數據。

1 alter database Test add filegroup Before2013
2 alter database Test add filegroup T2013
3 alter database Test add filegroup T2014
4 alter database Test add filegroup After2014


3:創建文件

  

  根據上面在文件組上的概述,文件的作用大家都知道了,這裡我們要做的是,將次文件.ndf附加到文件組上,因為我創建了4個文件組,

所以我也創建4個文件分別存放在這4個文件組中。

 

複製代碼
 1 alter database Test add file
 2 (Name=N'Before2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Before20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 
 3 to filegroup Before2013
 4 alter database Test add file
 5 (Name=N'T2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 
 6 to filegroup T2013
 7 alter database Test add file
 8 (Name=N'T2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 
 9 to filegroup T2014
10 alter database Test add file
11 (Name=N'After2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 
12 to filegroup After2014
複製代碼


4:編寫分區函數

   剛纔也說了,我們是按照時間進行切分的,將數據表數據分成:

① 2013年之前

② 2013-2014

③ 2014-2015

④ 2015之後

既然都知道依據了,我們分區函數也方便寫了。

1 create partition function RangeTime (datetime)
2 as range left for values ('2012-12-31','2013-12-31','2014-12-31')

從上面的sql,我們可以看到三個點將時間軸分成了4段
第一:rangeTime 為分組函數名。

第二:left 其實就是當時間點在邊界時到底屬於左側還是右側,因為這裡是left,所以屬於左側,如果是right關鍵詞,那就屬於右側了。

 

5:編寫分區方案

    分區方案也就是將分區函數與文件組進行一個關聯,剛纔也說了,3個時間點將一個時間軸分成了4部分,剛好對應了4個文件組。

那麼具體的sql寫法如下:

1 create partition scheme RangeSchema_CreateTime
2 as partition RangeTime
3 to (before2013,T2013,T2014,after2014)

6:創建分區表
  

    跟普通表創建有點不一樣,分區表的創建還需要指定這個分區需要使用哪個分區方案下的分區欄位,那麼這裡就是RangeSchema_CreateTime

中的CreateTime欄位。

1 create table Shop
2 (
3   ID  varchar(50),
4   ShopName varchar(50),
5   CreateTime datetime 
6 ) on RangeSchema_CreateTime(CreateTime)

這裡要註意,如果在創建表的時候指定了ID為主鍵的話,這個時候需要指定ID為分區欄位,否則會報錯的。

這時候可以在不要主鍵的情況下先創建表,然後再指定ID為主鍵。

 

7:插入測試數據並統計

  

    這裡我先插入10w條數據,然後來看看數據在各個分區的情況。‘

<1>插入數據

 

<2> 統計每個分區的數據量

      這裡主要有一個查詢分區的關鍵字“$partition”,非常的有用。

好了,到這個我們通過sql語句來實現分區表就已經完成了。

 

二:使用管理界面創建分區表

1:首先我們創建test1資料庫和shop表

 

2:創建文件組和文件

 

 3:創建分區

    ①:右鍵Shop表,彈出菜單中選擇 “存儲” => "創建分區"

 

  ②:創建“分區函數”名 和 “分區方案”名。

 

③:創建分區映射,也就是將”分區函數“和“文件組”進行關聯。

 

④:  最後我們可以看一下界面給我生成的分區函數以及分區方案,蠻有意思的。

複製代碼
 1 USE [Test1]
 2 GO
 3 BEGIN TRANSACTION
 4 CREATE PARTITION FUNCTION [MyRangeCreatTime](datetime) AS RANGE LEFT FOR VALUES (N'2012-12-31T00:00:00', N'2013-12-31T00:00:00', N'2014-12-31T00:00:00')
 5 
 6 
 7 CREATE PARTITION SCHEME [MySchemeCreateTime] AS PARTITION [MyRangeCreatTime] TO ([Before2013], [T2013], [T2014], [After2014])
 8 
 9 
10 ALTER TABLE [dbo].[Shop] DROP CONSTRAINT [PK__Shop__3214EC277F60ED59]
11 
12 
13 ALTER TABLE [dbo].[Shop] ADD PRIMARY KEY NONCLUSTERED 
14 (
15     [ID] ASC
16 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
17 
18 
19 CREATE CLUSTERED INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] 
20 (
21     [CreateTime]
22 )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [MySchemeCreateTime]([CreateTime])
23 
24 
25 DROP INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] WITH ( ONLINE = OFF )
26 
27 
28 
29 
30 COMMIT TRANSACTION
複製代碼


從圖中可以看到生成好的分區函數名”[MyRangeCreatTime]“ 和分區架構名“[MySchemeCreateTime]”,最後我們執行下該sql就ok了。

 

⑤ 插入測試數據併進行簡單的測試

    這裡測試下“2013-1-1”是在哪個分區下。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一、go語句 Go語句是SqlServer中用來表示當前代碼塊結束提交並確認結果的語句。 Go語句不能和其他Sql
  • 【OEM】OEM安裝維護 一.1 BLOG文檔結構圖 一.2 前言部分 一.2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① oem安裝和維護 ② OEM各種錯誤解決 Tips: ① 若文章代碼格式有錯亂,推薦使用...
  • 3月12日廣州開源社區巡講活動 歡迎大家報名參加
  • InnoDB行存儲的三個組成部分(說明: F字元表示列的數量) 名稱(Name) 大小(Size) Field Start Offsets (F*1) or (F*2) bytes Extra Bytes 6 bytes Field Contents 取決於內容 1: FIELD START OFF
  • 網站近日經常遭到攻擊,好幾次資料庫掛馬,前幾天把論壇升級了,今天又升級了資料庫,把之前的MSSQL 2000 升級到MSSQL 2005,用的是資料庫還原功能還原的,遇到了這個帳號孤立的問題。 什麼是孤立用戶的問題? 比如,以前的資料庫的很多表是用戶test建立的,但是當我們恢複數據庫後,test用
  • Memcached的特點 Memcached的緩存是一種分散式的,可以讓不同主機上的多個用戶同時訪問, 因此解決了共用記憶體只能單機應用的局限,更不會出現使用資料庫做類似事情的時候,磁碟開銷和阻塞的發生。
  • 通常ISV在面對本地客戶時對時間相關的處理,一般都時區信息都是不敏感的。但是現在雲的世界里為了讓大家把時間處理的方式統一起來,雲上的服務都是以UTC時間為準的,現在如果作為一個ISV來說就算你面對的客戶只是本地用戶但是你打算利用雲來為你進行的應用提供更多的功能和便捷性時,你就需要採用UTC時間來處理
  • 在Azure上面的PaaS時間都是以UTC時間為準(雲的世界里基本上都是以UTC時間為標準的),所以以前在本地SQL Server上面常用的GetDate()方法會碰到問題,在中國獲取的時間會被當前時間少了8個小時,因為Azure上的時間都是UTC之間,中國的時區是+8.所以你通過GetDate()
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...