SQL SERVER 如何按月建立表分割槽?
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 partitionNum99 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