1. 程式人生 > >SQL SERVER 如何按月建立表分割槽?

SQL SERVER 如何按月建立表分割槽?

比如有如下表需要以crt_time為標準按月分割槽
create table gf_card (
  id            bigint not null,
  crt_time        datetime not null,
  name            varchar(20) not null,
  CONSTRAINT PK_card_id PRIMARY KEY (id asc)
)
(1).一般會將表按每個月的資料放入不同的檔案組中,先給每個月建一個檔案組
--建立檔案組
alter database test add filegroup fileGroup01
alter database test add filegroup fileGroup02
alter database test add filegroup fileGroup03
alter database test add filegroup fileGroup04
alter database test add filegroup fileGroup05
alter database test add filegroup fileGroup06
alter database test add filegroup fileGroup07
alter database test add filegroup fileGroup08
alter database test add filegroup fileGroup09
alter database test add filegroup fileGroup10
alter database test add filegroup fileGroup11
alter database test add filegroup fileGroup12
如果要刪除檔案組可使用:
--刪除檔案組
alter database test remove filegroup  fileGroup01
(2).一個檔案組可以包含多個檔案,為了提高效能檔案一般放在多個不同的物理盤上,建立了檔案組後需要指定這些檔案組中包含哪些檔案
---建立資料檔案到檔案組
alter database test add file (name='test01',filename=N'D:\tmp\data\test01.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup01
alter database test add file (name='test02',filename=N'D:\tmp\data\test02.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup02
alter database test add file (name='test03',filename=N'D:\tmp\data\test03.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup03
alter database test add file (name='test04',filename=N'D:\tmp\data\test04.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup04
alter database test add file (name='test05',filename=N'D:\tmp\data\test05.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup05
alter database test add file (name='test06',filename=N'D:\tmp\data\test06.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup06
alter database test add file (name='test07',filename=N'D:\tmp\data\test07.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup07
alter database test add file (name='test08',filename=N'D:\tmp\data\test08.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup08
alter database test add file (name='test09',filename=N'D:\tmp\data\test09.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup09
alter database test add file (name='test10',filename=N'D:\tmp\data\test10.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup10
alter database test add file (name='test11',filename=N'D:\tmp\data\test11.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup11
alter database test add file (name='test12',filename=N'D:\tmp\data\test12.ndf',size=5Mb,filegrowth=5mb) to filegroup fileGroup12
如果要刪除資料檔案到檔案組可使用:
---刪除資料檔案到檔案組
alter database test remove file  test01
(3). 分割槽函式是為了劃分分割槽邊界,range left表示{,value],(value,},range right表示{,value),[value,}
--建立分割槽函式
create partition function [PF_card] (datetime) as range right for values
('2017-01-01','2017-02-01','2017-03-01','2017-04-01','2017-05-01','2017-06-01',
'2017-07-01','2017-08-01','2017-09-01','2017-10-01','2017-11-01','2017-12-01')
如果要刪除分割槽函式可使用:
--刪除分割槽函式
drop partition function [PF_card]
(4).有了分割槽函式後,需要指定不同分割槽的資料放到哪個檔案組中
--建立分割槽方案
CREATE PARTITION SCHEME [PS_card] AS PARTITION [PF_card]
TO ([PRIMARY], [fileGroup01], [fileGroup02], [fileGroup03], [fileGroup04], [fileGroup05], 
[fileGroup06], [fileGroup07], [fileGroup08], [fileGroup09], [fileGroup10], [fileGroup11], [fileGroup12])
如果要刪除分割槽方案
--刪除分割槽方案
drop PARTITION SCHEME [PS_card]
(5).上面建立了2017年12個月的分割槽,如果要新增2018年12個月的分割槽並且複用fileGroup01~fileGroup12
--修改邊界值
ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup01]
alter partition function [PF_card]()  SPLIT RANGE ('2018-01-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup02]
alter partition function [PF_card]()  SPLIT RANGE ('2018-02-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup03]
alter partition function [PF_card]()  SPLIT RANGE ('2018-03-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup04]
alter partition function [PF_card]()  SPLIT RANGE ('2018-04-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup05]
alter partition function [PF_card]()  SPLIT RANGE ('2018-05-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup06]
alter partition function [PF_card]()  SPLIT RANGE ('2018-06-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup07]
alter partition function [PF_card]()  SPLIT RANGE ('2018-07-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup08]
alter partition function [PF_card]()  SPLIT RANGE ('2018-08-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup09]
alter partition function [PF_card]()  SPLIT RANGE ('2018-09-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup10]
alter partition function [PF_card]()  SPLIT RANGE ('2018-10-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup11]
alter partition function [PF_card]()  SPLIT RANGE ('2018-11-01')

ALTER PARTITION SCHEME [PS_card] NEXT USED [fileGroup12]
alter partition function [PF_card]()  SPLIT RANGE ('2018-12-01')
(6) .按分割槽建立表和索引
create table gf_card (
  id            bigint not null,
  crt_time        datetime not null,
  name            varchar(20) not null
) on [PS_card] (crt_time)
對於分割槽表,如果要建主鍵,必須把分割槽依據列crt_time包含在內,同時如果要建唯一索引也要把分割槽依據列crt_time包含在內,所以分割槽表不能再單獨對id建主鍵,也不能單獨對id建唯一索引,但可以建非唯一索引
-- 將索引放在[PRIMARY]檔案組中
CREATE CLUSTERED INDEX [IX_card_id] ON gf_card (id) ON  [PRIMARY]

由於crt_time查詢時經常會用到,所以在crt_time上也建索引,並且也將各分割槽的索引放入各分割槽中

CREATE NONCLUSTERED INDEX [IX_card_crt_time] ON gf_card (crt_time) on [PS_card] (crt_time)
(7).插入一些資料測試
insert into gf_card (id, crt_time, name) values (99, '2017-07-01', 'n99')
insert into gf_card (id, crt_time, name) values (100, '2017-07-01', 'n100')
insert into gf_card (id, crt_time, name) values (101, '2017-07-01', 'n101')
insert into gf_card (id, crt_time, name) values (200, '2017-07-02', 'n102')
insert into gf_card (id, crt_time, name) values (600, '2017-07-01', 'n600')
查詢表中資料在哪個分割槽上
select *, $partition.PF_card(crt_time) partitionNum from gf_card
id        crt_time                                   name    partitionNum
99      2017-01-01 00:00:00.000    n99        2
100    2017-07-01 00:00:00.000    n100     8
101    2017-11-01 00:00:00.000    n101     12
200    2018-01-02 00:00:00.000    n102     14
600    2018-07-01 00:00:00.000    n600      20
從結果中可以看到fileGroup01的分割槽號為2,fileGroup07的分割槽號為8,primary的分割槽號自然就為1 了
--查詢資料在哪個分割槽上
select $partition.[PF_card]('2017-07-01')
--查詢表中資料在哪個分割槽上
select $partition.[PF_card](id)
from gf_card
-- 查詢表有哪些分割槽
SELECT *
FROM sys.partitions AS p JOIN sys.tables AS t  ON  p.object_id = t.object_id
  WHERE p.partition_id IS NOT NULL
      AND t.name = 'gf_card';
(8).將分割槽中的資料刪除

比如只刪除fileGroup01中的資料,由於直接使用truncate刪除分割槽中的資料要到SQL server2016才支援,所以使用一種通用的方法來刪除。
建立一個與gf_card列相同的表gf_card_tmp,並且此表也要建在fileGroup01中

create table gf_card_tmp (
  id              bigint not null,
  crt_time        datetime not null,
  name            varchar(20) not null
) on [fileGroup01]

將分割槽2中的資料轉移到gf_card_tmp中,此時gf_card分割槽2中就沒有資料了

alter table gf_card switch partition 2 to gf_card_tmp
刪除gf_card_tmp中的資料
truncate table gf_card_tmp
(9).如何查詢庫中有哪些PartitionScheme和PartitionFunction?
select ps.Name PartitionScheme, pf.name PartitionFunction
 from sys.indexes i
 join sys.partition_schemes ps on ps.data_space_id = i.data_space_id
 join sys.partition_functions pf on pf.function_id = ps.function_id
where i.object_id = object_id('gf_card')



相關推薦

SQL SERVER 如何建立分割槽

比如有如下表需要以crt_time為標準按月分割槽create table gf_card ( id bigint not null, crt_time datetime not null, name v

PostgreSQL中使用動態SQL-實現自動時間建立分割槽

PostgreSQL中通過繼承,可以支援基本的表分割槽功能,比如按時間,每月建立一個表分割槽,資料記錄到對應分割槽中。按照官方文件的操作,建立子表和index、修改trigger等工作都必須DBA定期去手動執行,不能實現自動化,非常不方便。 嘗試著通過在plpgsql程式碼

在C# WinForm中如何建立SQL Server資料庫和資料

【1】動態建立資料庫方法(例項),你可以在WinForm中新增一個文字框,輸入資料庫名稱,這個就不用我囉嗦了吧。將下面的第一句改為 string myExecuteQuery = "create database "+textBox1.Text.Trim(); //建立te

mysql partitions by range auto (mysql 自動建立年月的分割槽)

INSERT INTO `test`.`test`(`datetime`) VALUES (unix_timestamp("2015-12-10"));INSERT INTO `test`.`test`(`datetime`) VALUES (unix_timestamp("2015-12-11"));INS

sql server 數據庫誤刪除的恢復方法

局限性 數據庫表 刪除數據 多人 nbsp sof 工具 企業管理器 alt 由於意外操作,在企業管理器裏誤刪除了數據庫的表,那麽誤刪除了表數據怎麽辦呢? 很多人的一貫做法是先從日誌恢復,如果從日誌恢復不行就從mdf文件本身恢復。 那麽誤刪除數據後,最先要做的是先分離數據庫

SQL Server數據庫鎖定原理以及如何解除的鎖定

排它 必須 多用戶 sts gif -a 原則 ons ssi 1. 數據庫表鎖定原理 1.1 目前的C/S,B/S結構都是多用戶訪問數據庫,每個時間點會有成千上萬個user來訪問DB,其中也會同時存取同一份數據,會造成數據的不一致性或者讀臟數據. 1.2 事務的AC

sql server 時間段查詢

解決方法 轉換成 保存 日期類 會有 查詢 日期 etime arc 百度的資料,保存下來: 在寫按時間段查詢的sql語句的時候 一般我們會這麽寫查詢條件:   where date>=‘2010-01-01‘ and date<=‘2010-10-1‘。 但是

設置Sql server用戶對、視圖、存儲過程、架構的增刪改查權限

例如 ont 函數 權限控制 str 角色 -s 簡單 管理 根據數據庫Schema限制用戶對數據庫的操作行為 授予Shema dbo下對象的定義權限給某個用戶(也就是說該用戶可以修改架構dbo下所有表/視圖/存儲過程/函數的結構) use [Your DB N

基於MYSQL事件的備份,滾動,保留6次備份

數據 gin command 操作 margin 技術分享 man lob rda 要求: 每月1日0點:在不影響業務的情況下,備份整月的數據,保留6次備份。 思路: 基於MYSQL事件功能,每月按時完成操作 RENAME語句具有原子性,新舊表無縫切換 R

MS SQL SERVER搜索某個的主鍵所在的列名

視圖 尋找 屬性 serve 多個 數據庫管理 ble 觸發器 .com 原文:MS SQL SERVER搜索某個表的主鍵所在的列名 SELECT SYSCOLUMNS.name FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDE

python

python mysql 分表 #!/usr/bin/env python -coding:utf-8- import timefrom datetime import datetimeimport calendarimport MySQLdbimport sys class GetDayMont

SQL Server查看所有大小,所占空間

close pla fetch order by lac lar HERE etc next CREATE TABLE #Data( name VARCHAR(100), row VARCHAR(100), reserved VARCHAR(100),

SQL Server查看所有大小、行數和占用空間信息

add nvarchar 包含 desc cut ack sed dealloc har 一、查看表名和對應的數據行數select a.name as ‘表名‘,b.rows as ‘表數據行數‘from sysobjects a inner join sysindexe

MySQL之拆分主表並寫入數據提高數據查詢速度

tom auto begin rda rim 日期 pre tran create 使用場景: 主表數據量特別大,為了提高查詢的速度,可以考慮按月進行分表,要求就是當月的數據到當月表查詢,上月的數據到上月表查詢,當天的數據到主表來查詢。這樣在一定程度上也是提高了數據的查詢速

SQL Server 2008獲取一個的欄位,型別,長度,是否主鍵,是否為空,註釋等資訊

SELECT [表名]= case when a.colorder=1 then d. name else '' end , [表說明]= case when

查看Sql Server被鎖的以及解鎖

代碼 pan 數據庫名 數據庫 被鎖 varchar weight _id col 查看被鎖表: select spId from master..SysProcesses where db_Name(dbID) = ‘數據庫名稱‘ and spId <

php 建立日誌

public function log($log_string){ //$_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR."files".DIRECTORY_SEPARATOR."log".DIRECTORY_SEPARATOR; $file_directory =

實現SQL Server到MySQL的增量同步

下載網站:www.SyncNavigator.CN   ---------------------------------------------------------- HKROnline SyncNavigator 8.4.1 非破解版 註冊機 授權啟用教程

SQL Server遍歷所有統計行數

DECLARE CountTableRecords CURSOR READ_ONLY FOR SELECT sst.name, Schema_name(sst.schema_id) FROM sys.tables sst WHERE sst.TYPE

Oracle建立分割槽----範圍分割槽

建立分割槽是資料庫優化的一種手段,範圍分割槽是表分割槽的一種。      建立範圍分割槽的關鍵字是"RANGE",建立該分割槽後,其中的資料可以根據分割槽鍵值指定的範圍進行分佈,當資料在範圍內均勻分佈時,效能最好。 例如我們選擇一個日期作為分割槽鍵,分割槽“AUG-201