SqlServer資料庫分區分表實例分享(有詳細代碼和解釋)

来源:https://www.cnblogs.com/xiaomengshan/archive/2019/07/05/11139299.html
-Advertisement-
Play Games

資料庫單表數據量太大可能會導致資料庫的查詢速度大大下降(感覺都是千萬級以上的數據表了),可以採取分區分表將大表分為小表解決(當然這隻是其中一種方法),比如數據按月、按年分表,最後可以使用視圖將小表重新併為總的虛擬表,其實並不影響上層程式的使用(程式也許都不知道分表了)。 主要步驟: 1、新建文件組, ...


資料庫單表數據量太大可能會導致資料庫的查詢速度大大下降(感覺都是千萬級以上的數據表了),可以採取分區分表將大表分為小表解決(當然這隻是其中一種方法),比如數據按月、按年分表,最後可以使用視圖將小表重新併為總的虛擬表,其實並不影響上層程式的使用(程式也許都不知道分表了)。

主要步驟:

1、新建文件組,將數據表文件保存路徑指向相應文件組(應將文件組和文件放入不同的磁碟中,甚至不同伺服器形成分散式資料庫,因為數據的讀取瓶頸很大程度在於磁碟的的讀寫速度,多個磁碟存放一個表可以負載均衡)

2、設置分區函數(聲明分區的標準)

3、設置分區方案(即哪些區域使用哪個分區函數,形成完整的分區方案)

4、給新表或現有表設置分區方案

5、建立視圖

詳細步驟(看需求可選):

一、資料庫狀態備份和恢復

USE master
-- 備份
BACKUP DATABASE AdventureWorks
    TO DISK = 'AdventureWorks.bak'
    WITH FORMAT
 
---- 恢復
RESTORE DATABASE AdventureWorks
    FROM DISK = 'AdventureWorks.bak'
    WITH REPLACE
GO

二、文件組和文件操作

添加文件組

USE [master]
GO
ALTER DATABASE ZHH ADD FILEGROUP [文件組名稱]
Go

添加文件並把其指向指定文件組

USE master;
GO
ALTER DATABASE 資料庫名
ADD FILE(
NAME=N'文件名',
FILENAME='存放路徑', //如:E:\201109.NDF(精確到文件名)文件組存放與不同磁碟可以提高IO讀寫效率(多個磁頭併發)
SIZE=3MB,
MAXSIZE=100MB,
FILEGROWTH=5MB
)TO FILEGROUP [文件組名]
Go

修改文件(可選)

USE master;
GO
ALTER DATABASE 資料庫名
MODIFY FILE
(NAME = 文件名,
SIZE = 20MB);   //可以修改所有屬性,列舉即可
GO

刪除文件(可選)

ALTER DATABASE 資料庫名 REMOVE FILE [文件組名] 

三、分區函數和分區方案

分區函數

用於規範如何分區的標準,如已哪列進行為標準分區、分區的方式(按時間、ID等)、分區的具體界限(一般來說,界限指標數要比分區數少1,一刀則有兩段)

USE 資料庫名   
GO
CREATE PARTITION FUNCTION 分區函數名 (指標列的數據類型)   //如:datetime、int
AS RANGE RIGHT   //右邊界切分,預設為LEFT
FOR VALUES (劃分界限)  //如時間劃分('2003/01/01', '2004/01/01'),兩個時間界限可劃分出三個分區
GO

分區方案

用於將已經建立好的分區函數組織成完整的方案,為每個分區分配存儲位置

Use 資料庫名
go
create  partition  scheme 分區方案名
as partition  分區函數
to(文件組1,文件組2,文件組3,...) //註意分區數要與實際分區一致
go

在原有的基礎上添加分區(可選)

use 資料庫名
go
alter partition scheme ps_OrderDate  next used [FG4]    //修改分區方案ps_OrderDate,定義新新分區使用FG4文件組
alter partition function pf_OrderDate() split range('2005/01/01')  //修改分區函數pf_OrderDate,在末尾添加界限'2005/01/01'
go

為現有表設置分區方案(可選)

//為AutoBench表的InsertTime列創建新聚集索引,並綁定Scheme_DateTime分區方案
CREATE CLUSTERED INDEX IX_CreateDate ON AutoBench (InsertTime)
ON Scheme_DateTime (InsertTime)

註:如原來主鍵有聚眾索引要將其改為非聚集索引,才可添加新聚眾索引

//刪除原主鍵上的聚集索引PK_Product
ALTER TABLE Product DROP CONSTRAINT PK_Product

//重新創建主鍵非聚集索引PK_Product
ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY NONCLUSTERED (ProductID ASC)

上面語句也可直接在索引屬性中將聚集改為非聚集

為新建表設置分區方案(可選)

//創建表格Order,並設置Scheme_DateTime分區方案,指標列為OrderDate
CREATE TABLE [Order]
(
    OrderID INT IDENTITY(1,1) NOT NULL,
    UserID INT NOT NULL,
    TotalAmount DECIMAL(18,2) NULL,
    OrderDate DATETIME NOT NULL
) ON Scheme_DateTime (OrderDate)
查詢分區數據

四、其他操作

查詢分區數據

$partition函數--為任何指定的分區函數返回分區號,一組分區列值將映射到該分區號中

語法: [ database_name. ] $PARTITION.partition_function_name(expression)

參數: database_name 包含分區函數的資料庫的名稱。

partition_function_name 對其應用一組分區列值的任何現有分區函數的名稱。

expression 其數據類型必須匹配或可隱式轉換為其對應分區列數據類型的表達式。 expression 也可以是當前參與partition_function_name 的分區列的名稱。

返回類型: int (分區號)

//篩選使用Function_DateTime作為分區函數的AutoBench表,以InsertTime作為指標列的第二個分區的所有數據
select * from AutoBench WHERE $PARTITION.Function_DateTime(InsertTime) = 2

合併分區

//刪除Sales資料庫下的分區函數pf_OrderDate中的'2003/01/01'界限,以次界限劃分的兩個分區合併,分區號一次減1
use Sales
go
alter partition function pf_OrderDate() merge range('2003/01/01')
go

查看系統視圖

select * from sys.partition_functions   //分區函數
select * from sys.partition_range_values    //分區方案
select * from sys.partition_schemes     //邊界值點

五、自動分區

可以採用SQL Server代理中的作業定期自動執行分區腳本,實現自動分區(如每月結束自動執行按月分區的操作)

自動分區測試腳本

DECLARE 
    @fileGroupName VARCHAR(20),    --文件組名(格式為:FG+@Month)
    @fileName VARCHAR(20),    --文件名(格式為:F+@Month)
    @filePath VARCHAR(100),        --文件存放路徑(格式為:存放目錄路徑+@fileName.ndf)
    @dataBaseName VARCHAR(20),    --資料庫名
    @Month VARCHAR(10),        --當前時間年月(格式為:yyyymm)
    @schemeName VARCHAR(20),    --分區方案名
    @partFunctionName VARCHAR(20),    --分區函數名
    @limit VARCHAR(10)    --分區界限(以時間分區則為時間字元串,格式為:mm/dd/yyyy)

SET @fileGroupName='FG201805'
SET @Month=CONVERT(varchar(10),GETDATE(),112)
SET @fileName=N'F201805'
SET @filePath='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\F201805.ndf'
SET @dataBaseName='Chassis'
SET @schemeName='Scheme_DateTime'
SET @partFunctionName='Function_DateTime'
SET @limit=CONVERT(varchar(10),GETDATE(),101) 

--語句要指明需要操作的資料庫
if exists(select * from Chassis.sys.filegroups where name=@fileGroupName)
    begin
        print '文件組存在,不需添加'
    end
else
    begin
        exec('ALTER DATABASE '+@dataBaseName+' ADD FILEGROUP ['+@fileGroupName+']')
        print '新增文件組'+@fileGroupName
    end

if exists(select * from Chassis.sys.database_files where [state]=0 and (name=@fileName or physical_name=@filePath))
    begin
        print 'ndf文件存在,不需添加'
    end
else
    begin
        exec('ALTER DATABASE '+@dataBaseName+' ADD FILE(NAME ='''+@fileName+''',FILENAME = '''+@filePath+''')TO FILEGROUP ['+@fileGroupName+']')
        print '添加文件'+@fileName+'至文件組'+@fileGroupName
    end

if exists(select * from sys.partition_schemes where name=@schemeName)
    begin
        exec('alter partition scheme '+@schemeName+' next used ['+@fileGroupName+']')
        print '修改分區方案,指定下一分區的文件組'
    end
else
    begin
        print '分區方案不存在'
    end

if exists(select * from sys.partition_range_values where function_id=(select function_id from sys.partition_functions where name=@partFunctionName))
    begin
        if exists(select * from sys.partition_range_values where function_id=(select function_id from sys.partition_schemes where name='Scheme_DateTime') and value=CONVERT(datetime,''+@limit+'',101))
            begin
                print '界限已存在'
            end
        else
            begin
                exec('alter partition function '+@partFunctionName+'() split range('''+@limit+''')')
                print '修改分區函數,添加劃分界限為:'+@limit
            end
    end
else
    begin
        print '分區函數不存在'
    end

這隻是本人的測試腳本,僅供參考~ 如有錯漏請大佬指導

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、背景介紹 工作當中經常會遇到需要對新來的伺服器進行安裝系統,在安裝系統的時候需要對磁碟進行分區、格式化。往往伺服器磁碟都是2塊SSD+12塊SATA硬碟,在對如此之多的磁碟進行分區和格式化,真是個體力活。甚至還有許多伺服器的USB插口不夠用,滑鼠和鍵盤不能同時用,而且身邊又沒有一個USBhub, ...
  • 一、為什麼很多人會選擇禁用Win10自動更新? 1.win10自動更新定義: Win 10的自動更新功能,即 Windows Update。這項功能本意是為一些軟體、漏洞等提供更新服務。一般來說,只要電腦連接上無線網,在想要更新一些東西的時候,電腦便會啟動自動更新。 2.win10自動更新帶來的問題 ...
  • 首先在另外一臺聯網電腦拉取最新的redis,zookeeper,kafka鏡像 然後導出鏡像為tar文件 導入鏡像到生產伺服器 腳本總已經寫了。複製到.sh文件中執行即可。 redis的配置和數據已經掛到宿主機了。另外兩個沒有。 !/bin/bash set x input images 這裡要準備 ...
  • Ubuntu 18.04 桌面版linux系統安裝vim編輯器。 ...
  • Kafka集群安裝主節點h201,從節點h202、h2031.安裝jdk1.8[hadoop@h201 ~]$ /usr/jdk1.8.0_144/bin/java -version 2.安裝zookeeperkafka集群需要 zookeeper支持[hadoop@h201 ~]$ tar -zx ...
  • imp 導入;exp 導出 imp(exp) system/123456 file="D:\LocalDatabase.dmp" full=y; ...
  • 關於文章,本文是在網上查找資料整理而來,方便以後記憶 delete 命令刪除的數據可以恢復, truncate 命令刪除的數據是不可以恢復的,全刪的那種 drop 命令刪除的數據不可恢復,連表結構都刪的那種 相同點 truncate 和不帶 where 子句的 delete, 以及 drop 都會刪 ...
  • Vs連接Mysql資料庫步驟 1、 首先下載mysql資料庫,安裝,建庫建表 https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html (這個超鏈接是關於Mysql的學習資料,個人認為很不錯!) 2、 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...