1. 程式人生 > 實用技巧 >針對sqlserver 使用水平分表優化

針對sqlserver 使用水平分表優化

  1 USE master --備份
  2 BACKUP DATABASE NGK_Prod TO DISK ='NGK_Prod.bak' WITH FORMAT
  3 --恢復
  4 RESTORE DATABASE NGK_Prod FROM DISK = 'NGK_Prod.bak' WITH replace
  5 GO
  6 
  7 --********************檔案組和檔案操作*********************
  8 
  9 --新增檔案組
 10 USE NGK_Prod;
 11 GO
 12 ALTER DATABASE NGK_Prod ADD
filegroup [MCFileGroup] 13 --ALTER DATABASE NGK_Prod ADD filegroup [MCFileGroup] 14 Go 15 16 --新增檔案並把其指向指定檔案組 17 USE NGK_Prod; 18 Go 19 alter DATABASE NGK_Prod 20 add file( 21 name = N'MCFile',--檔名 22 FileName = N'E:\公司檔案\DPS\DB\MCFile.mdf',--存放路徑 23 SIZE = 3MB, 24 maxsize = 100MB, 25 filegrowth =
5MB 26 ) to filegroup MCFileGroup 27 Go 28 29 --修改檔案 30 -- use master; 31 -- Go 32 -- alter DATABASE NGK_Prod 33 -- modify file ( name=N'newMCFile',size = 20MB); --可以修改所有屬性,列舉即可 34 -- Go 35 36 --刪除檔案 37 --alter DATABASE NGK_Prod remove file newMCFile 38 39 --***********************分割槽函式和分割槽方案**********************************
40 41 --分割槽函式 42 use NGK_Prod 43 Go 44 create partition function partion_function_MC(datetime) --分割槽函式名 (指標列的資料型別) 如:datetime、int 45 as range right --右邊界切分,預設為left 46 for VALUES ('2020-01-01 00:00:00','2021-01-01 00:00:00') --劃分邊界。如時間劃分('2003/01/01', '2004/01/01'),兩個時間界限可劃分出三個分割槽 47 Go 48 --檢視分割槽函式是否建立成功 49 use NGK_Prod 50 select * from sys.partition_functions 51 --drop partition FUNCTION partion_function_MC 52 --分割槽方案 53 use NGK_Prod 54 Go 55 create PARTITION SCHEME partition_scheme_MC 56 as PARTITION partion_function_MC 57 to ([MCFileGroup],[PRIMARY],MCFileGroup) --檔案組 注意分割槽數要與實際分割槽一致 58 Go 59 --檢視分割槽方案是否建立完成 60 use NGK_Prod 61 select * from sys.partition_schemes 62 63 --在原有的基礎上新增分割槽(可選) 64 -- use 資料庫名 65 -- go 66 -- alter partition scheme ps_OrderDate next used [FG4] //修改分割槽方案ps_OrderDate,定義新新分割槽使用FG4檔案組 67 -- alter partition function pf_OrderDate() split range('2005/01/01') //修改分割槽函式pf_OrderDate,在末尾新增界限'2005/01/01' 68 -- go 69 --為現有表設定分割槽方案(可選) 70 -- //為AutoBench表的InsertTime列建立新聚集索引,並繫結Scheme_DateTime分割槽方案 71 -- CREATE CLUSTERED INDEX IX_CreateDate ON AutoBench (InsertTime) 72 -- -- ON Scheme_DateTime (InsertTime) 73 --注:如原來主鍵有聚眾索引要將其改為非聚集索引,才可新增新聚眾索引 74 -- //刪除原主鍵上的聚集索引PK_Product 75 -- ALTER TABLE Product DROP CONSTRAINT PK_Product 76 -- //重新建立主鍵非聚集索引PK_Product 77 -- ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY NONCLUSTERED (ProductID ASC) 78 79 80 --定義分割槽表 (為新建表設定分割槽方案) 81 create TABLE mctable( 82 id bigint, 83 createTime datetime, 84 creator nvarchar(50) 85 ) on partition_scheme_MC(createTime) 86 87 88 89 -- 90 -- select * from NGK_Prod.sys.filegroups 91 -- select * from NGK_Prod.sys.database_files 92 -- select * from sys.partition_range_values 93 -- select function_id from sys.partition_functions 94 -- select * from sys.partition_schemes 95 -- SELECT CONVERT(datetime,CONVERT(varchar(10),GETDATE(),101) ,101) 96 97 98 99 100 INSERT INTO mctable VALUES(1, getdate(),'1') 101 INSERT INTO mctable VALUES(2, '2021-01-02 00:00:00','1') 102 SELECT * FROM mctable 103 --檢視每個分割槽資料條數 104 select $partition.partion_function_MC(CreateTime) as partitionNum,count(*) as recordCount 105 from mctable 106 group by $partition.partion_function_MC(CreateTime) 107 108 --檢視每個分割槽詳細資料 109 select * from mctable where $partition.partion_function_MC(CreateTime)=3 110 select * from mctable where $partition.partion_function_MC(CreateTime)=4
 1 DECLARE 
 2     @fileGroupName VARCHAR(20),    --檔案組名(格式為:FG+@Month)
 3     @fileName VARCHAR(20),    --檔名(格式為:F+@Month)
 4     @filePath VARCHAR(100),        --檔案存放路徑(格式為:存放目錄路徑[email protected]
 5     @dataBaseName VARCHAR(20),    --資料庫名
 6     @Month VARCHAR(10),        --當前時間年月(格式為:yyyymm)
 7     @schemeName VARCHAR(20),    --分割槽方案名
 8     @partFunctionName VARCHAR(20),    --分割槽函式名
 9     @limit VARCHAR(10)    --分割槽界限(以時間分割槽則為時間字串,格式為:mm/dd/yyyy)
10 
11 SET @fileGroupName='FG201805'
12 SET @Month=CONVERT(varchar(10),GETDATE(),112)
13 SET @fileName=N'MCFile'
14 SET @filePath='E:\公司檔案\DPS\DB\MCFile.mdf'
15 SET @dataBaseName='NGK_Prod'
16 SET @schemeName='partition_scheme_MC'
17 SET @partFunctionName='partion_function_MC'
18 SET @limit=CONVERT(varchar(10),GETDATE(),101) 
19 
20 --語句要指明需要操作的資料庫
21 if exists(select * from NGK_Prod.sys.filegroups where name=@fileGroupName)
22     begin
23         print '檔案組存在,不需新增'
24     end
25 else
26     begin
27         exec('ALTER DATABASE '+@dataBaseName+' ADD FILEGROUP ['+@fileGroupName+']')
28         print '新增檔案組'+@fileGroupName
29     end
30 
31 if exists(select * from NGK_Prod.sys.database_files where [state]=0 and (name=@fileName or physical_name=@filePath))
32     begin
33         print 'ndf檔案存在,不需新增'
34     end
35 else
36     begin
37         exec('ALTER DATABASE '+@dataBaseName+' ADD FILE(NAME ='''+@fileName+''',FILENAME = '''+@filePath+''')TO FILEGROUP ['+@fileGroupName+']')
38         print '新增檔案'+@fileName+'至檔案組'+@fileGroupName
39     end
40 
41 if exists(select * from sys.partition_schemes where name=@schemeName)
42     begin
43         exec('alter partition scheme '+@schemeName+' next used ['+@fileGroupName+']')
44         print '修改分割槽方案,指定下一分割槽的檔案組'
45     end
46 else
47     begin
48         print '分割槽方案不存在'
49     end
50 
51 if exists(select * from sys.partition_range_values where function_id=(select function_id from sys.partition_functions where name=@partFunctionName))
52     begin
53         if exists(select * from sys.partition_range_values where function_id=(select function_id from sys.partition_schemes where name=@schemeName) and value=CONVERT(datetime,''+@limit+'',101))
54             begin
55                 print '界限已存在'
56             end
57         else
58             begin
59                 exec('alter partition function '+@partFunctionName+'() split range('''+@limit+''')')
60                 print '修改分割槽函式,新增劃分界限為:'+@limit
61             end
62     end
63 else
64     begin
65         print '分割槽函式不存在'
66     end