分區表sql
㈠ 請教sql2008中的分區表如何刪除分區
分區表中有數據時是不能夠刪除的,只能將數據先移到其它表中,再刪除。所括分區函數和分區方案在分表中未刪除之前都是不可以刪除的。
㈡ sqlserver查看哪些表有分區
SQLSERVER中,有時需要知道已經建了哪些分區表,從哪裡看?
1、直接用SQL語句查:
--分區數大於1的,就是我們想查看的分區表:
SELECT p.*,'|' AS SP ,t.* FROM sys.partitions AS p
inner JOIN sys.tables AS t ON p.object_id = t.object_id
inner join (
select object_id as object_id2,index_id, count(*) AS CNT FROM sys.partitions
group by object_id,index_id
having count(*)>1
) s on s.object_id2 = p.object_id
WHERE p.partition_id IS NOT NULL
order by t.name;
2、在管理器中查看:
Databases > [資料庫名稱] 節點 > 存儲(Storage) 節點 >
\ 分區架構(Partition Schemes ) 節點 > 選中一項 > 右鍵 > 查看依賴
\ 分區函數(Partition Functions ) 節點 > 選中一項 > 右鍵 > 生成腳本
3、有作多分區的表,屬性的 存儲(Storage) 會有 Partitioning 信息。
㈢ sql server怎麼建立分區表
打開MsSQL2008,找到作業該項,如果打不開或者SQL Server代理是未啟動狀態,請先在windows服務中啟動SQL Server代理(參考圖片),
2
右擊MsSQL2008對象資源管理器中的作業,選擇新建作業,輸入該作業你想用的名稱,類別不用管,說明裡面是輸入一些該作業完成的功能,可不寫,請務必勾選已啟用復選框.
3
點擊新建作業窗體左側的步驟項,點擊右側區域下方的新建按鈕,輸入步驟名稱,類型請選擇Transact-SQL腳本(T-SQL),運行身份默認,資料庫請選擇要進行分區的資料庫,請不要選擇master默認的,命令文本框中輸入如下代碼:
/*--------------------創建資料庫的文件組和物理文件------------------------*/
declare @tableName varchar(50), @fileGroupName varchar(50), @ndfName varchar(50), @newNameStr varchar(50), @fullPath
varchar(50), @newDay varchar(50), @oldDay datetime, @partFunName varchar(50), @schemeName varchar(50)
set @tableName='要分區的資料庫名稱'
set @newDay=CONVERT(varchar(100), GETDATE(), 23)--23:按天 114:按時間
set @oldDay=cast(CONVERT(varchar(10),dateadd(day,-1,getdate()), 120 ) as datetime)
set @newNameStr=Replace(Replace(@newDay,':','_'),'-','_')
set @fileGroupName=N'G'+@newNameStr
set @ndfName=N'F'+@newNameStr+''
set @fullPath=N'E:\\SQLDataBase\\UserData\\'+@ndfName+'.ndf'
set @partFunName=N'pf_Time'
set @schemeName=N'ps_Time'
--創建文件組
if exists(select * from sys.filegroups where name=@fileGroupName)
begin
print '文件組存在,不需添加'
end
else
begin
exec('ALTER DATABASE '+@tableName+' ADD FILEGROUP ['+@fileGroupName+']')
print '新增文件組'
if exists(select * from sys.partition_schemes where name =@schemeName)
begin
exec('alter partition scheme '+@schemeName+' next used ['+@fileGroupName+']')
print '修改分區方案'
end
if exists(select * from sys.partition_range_values where function_id=(select function_id from
sys.partition_functions where name =@partFunName) and value=@oldDay)
begin
exec('alter partition function '+@partFunName+'() split range('''+@newDay+''')')
print '修改分區函數'
end
end
--創建NDF文件
if exists(select * from sys.database_files where [state]=0 and (name=@ndfName or physical_name=@fullPath))
begin
print 'ndf文件存在,不需添加'
end
else
begin
exec('ALTER DATABASE '+@tableName+'ADD FILE (NAME ='+@ndfName+',
FILENAME = '''+@fullPath+''')TO FILEGROUP ['+@fileGroupName+']')
print '新創建ndf文件'
end
/*--------------------以上創建資料庫的文件組和物理文件------------------------*/
--分區函數
if exists(select * from sys.partition_functions where name =@partFunName)
begin
print '此處修改需要在修改分區函數之前執行'
end
else
begin
exec('CREATE PARTITION FUNCTION '+@partFunName+'(DateTime)AS RANGE RIGHTFOR VALUES ('''+@newDay
+''')')
print '新創建分區函數'
end
--分區方案
if exists(select * from sys.partition_schemes where name =@schemeName)
begin
print '此處修改需要在修改分區方案之前執行'
end
else
begin
exec('CREATE PARTITION SCHEME '+@schemeName+' AS PARTITION '+@partFunName+' TO
(''PRIMARY'','''+@fileGroupName+''')')
print '新創建分區方案'
end
print '---------------以下是變數定義值顯示---------------------'
print '當前資料庫:'+@tableName
print '當前日期:'+@newDay+'(用作隨機生成的各種名稱和分區界限)'
print '合法命名方式:'+@newNameStr
print '文件組名稱:'+@fileGroupName
print 'ndf物理文件名稱:'+@ndfName
print '物理文件完整路徑:'+@fullPath
print '分區函數:'+@partFunName
print '分區方案:'+@schemeName
/*
--查看創建的分區函數
select * from sys.partition_functions
--查看分區函數的臨界值
select * from sys.partition_range_values
--查詢分區方案
select * from sys.partition_schemes
--查詢表數據在哪個分區中存儲,where條件查詢第一個分區中存在的數據
select *,$partition.pf_SaveTime(分區欄位) as Patition from 表名 where $partition.pf_SaveTime(分區欄位)=1
*/
GO
點擊確定按鈕
上述代碼中的變數名稱,路徑等均可自行修改,上述是按天為單位,以G開頭的日期作為文件組名稱,以F開頭的日期作為物理分區文件名即ndf文件名稱
4
選擇新建分區左側的計劃項,然後點擊右側區域下方的新建按鈕,設定新建分區的時間間隔,圖中設置的是每天創建一個新的分區,用戶也可以自行修改,按月,按周,按自定義時間等
其他的條目,通知,警報,目標可自行設置,也可不設置,至此自動創建分區的計劃任務已成功設置.
END
步驟二:對表應用分區方案和分區函數
右擊要分區的表,選擇存儲菜單下的創建分區,上述步驟一中創建的分區函數是按datetime類型進行的分區,所以創建分區的時候需要選擇相應類型的欄位作為分區依據,用戶也可以根據int型或其他類型的欄位進行分區,選擇下一步,使用現有分區函數下一步使用現有分區方案,下一步會自動按照分區方案執行的日期進行分區,繼續點擊下一步選擇立即執行,完成後即可完成的整體的表分區自動執行.
需注意:剛設置完第一步的計劃任務,可能不會執行第一步的分區方案的代碼,也就意味著沒有創建分區函數和分區方案,第二步設置的時候使用現有分區函數和使用現有分區方案也就不可用,可先把第一步的代碼執行一遍即可.
㈣ Oracle SQL調優之分區表
@[toc]
其它類型的表設計可以看博客: https://smilenicky.blog.csdn.net/article/details/90315980
普通表和分區表區別,分區表分成幾部分就有幾個segment,RANGE_PART_TAB是一個分區表
引用Oracle官方文檔的說法, https://docs.oracle.com/cd/B19306_01/server.102/b14220/partconc.htm#sthref2604 :
分區類型:分區分為范圍分區、列表分區、HASH分區、組合分區四種,圖來自Oracle官方網站
關鍵字partition by range
散列分區也叫hash分區,partitions後接分區數,盡量設置為偶數,
組合分區又稱復合分區,主要有兩種:oracle11之前只支持范圍列表分區(RANGE-LIST)和范圍散列分區(RANGE-HASH),oracle11之後支持(范圍范圍分區)RANGE-RANGE、 (列表范圍分區)LIST-RANGE、(列表散列分區)LIST-HASH、(列表列表分區)LIST-LIST這幾種組合,為了避免每個主分區中都寫相同的從分區,可以用模板方式(subpartition template)
圖來自Oracle官方網站:
新增子分區,子分區名稱是P13SUB1
刪除子分區,子分區名稱P13SUB1
TRUNCATE子分區
分區相關查詢
ps:表格來自《收獲,不止SQL調優》一書作者的整理
㈤ sql server 2012分區表有什麼用
如果你的資料庫中某一個表中的數據滿足以下幾個條件,那麼你就要考慮創建分區表了。
1、資料庫中某個表中的數據很多。很多是什麼概念?一萬條?兩萬條?還是十萬條、一百萬條?這個,我覺得是仁者見仁、智者見智的問題。當然數據表中的數據多到查詢時明顯感覺到數據很慢了,那麼,你就可以考慮使用分區表了。如果非要我說一個數值的話,我認為是100萬條。
2、但是,數據多了並不是創建分區表的惟一條件,哪怕你有一千萬條記錄,但是這一千萬條記錄都是常用的記錄,那麼最好也不要使用分區表,說不定會得不償失。只有你的數據是分段的數據,那麼才要考慮到是否需要使用分區表。
3、什麼叫數據是分段的?這個說法雖然很不專業,但很好理解。比如說,你的數據是以年為分隔的,對於今年的數據而言,你常進行的操作是添加、修改、刪除和查詢,而對於往年的數據而言,你幾乎不需要操作,或者你的操作往往只限於查詢,那麼恭喜你,你可以使用分區表。換名話說,你對數據的操作往往只涉及到一部分數據而不是所有數據的話,那麼你就可以考慮什麼分區表了
http://blog.csdn.net/felixfeng/article/details/27544219
㈥ sql 分區表操作
按小時分區或者天分區入數據啊,查詢數據的時候把分區條件帶上,分區表可以算一個單獨的表,查詢按分區查對查詢影響微乎其微了,如果不帶分區條件後期數據大了你要直接從表裡查數據,可能相對就要慢很多了
㈦ 如何創建SQL Server 2005表分區
創建一個分區表首先要定義你用來映射表內分區的分區函數。在下面定義的分區函數中,我將使用三個分區,每個分區對應於SalesHistoryArchive表中的每一種產品類型,這個表將在稍後定義。基本上,這些分區會把SalesHistoryArchive檔案表劃分成三個不同的表,它們由SQL Server自動維護。CREATE PARTITION FUNCTION [pf_Proct_Partition](VARCHAR(10)) AS RANGE LEFTFOR VALUES (N'BigScreen', N'Computer', N'PoolTable')定義函數的范圍決定分區值屬於哪一個邊界。RNAGE LEFT:指定分區值將小於或等於在分區函數中定義的值。在上面使用的分區函數中一共建立了四個分區。所有名稱小於或等於『BigScreen』的產品將映射到第一個分區。任何名稱大於『BigScreen』但小於或等於『Computer』的產品將映射到第二個分區;諸如此類。RANGE RIGHT:指定分區值將小於在分區函數中定義的值。在上面使用的分區函數中一共建立了四個分區。所有名稱小於『BigScreen』的產品將映射到第一個分區。任何名稱大於或等於『BigScreen』但小於或等於『Computer』的產品將映射到第二個分區;諸如此類。建好分區函數後,現在我需要建立分區方案。我將把例子中的所有分區都映射到主文件組中。如果我希望將分區映射到不同的文件組,我會按文件組列表的順序加入文件組名稱。下面是創建分區方案的代碼:CREATE PARTITION SCHEME [ps_Proct_Scheme] AS PARTITION[pf_Proct_Partition]ALL TO ([PRIMARY])現在我建立需要分區的表,我可以創建SalesHistoryArchive表並在其中載入數據。在CREATE TABLE語句末尾,分區方案使用表中的一個欄位名告訴SQL Server如何映射需要分區的表中的數據。查看列表A中的代碼樣本。我需要對數據進行一些查詢,保證分區正常運行。下面的查詢返回SalesHistoryArchive表的所有行,並使用$partition函數指出返回的行屬於哪個分區:SELECT $partition.[pf_Proct_Partition](Proct), *FROM SalesHistoryArchive這個查詢返回所有映射到SalesHistoryArchive表中的分區:SELECT * From sys.partitionsWHERE OBJECT_NAME(object_id) = 'SalesHistoryArchive'接下來…在後面的文章中,我將解釋如何修改表中的這些分區,從而在其中增加新數據,並非常高效地刪除舊數據。
㈧ 如何對一個已經存在的SQL Server表分區
有兩種方法可以實現對一個表分區.一是創建一個新的標識為分區表的表(你可參照此步驟),然後把數據復制到這張新表,再對這兩張表分別改名.或者,像我寫在下面的,通過重建或創建一個聚集索引來達到分區一個表.
一個SQL Server表和數據進行分區示例
--Table/Index creation
CREATE TABLE [dbo].[TABLE1]
([pkcol] [int] NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] datetime)
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED (pkcol)
GO
CREATE NONCLUSTERED INDEX IX_TABLE1_col2col3 ON dbo.TABLE1 (datacol1,datacol2)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
㈨ sql server 查看分區表的分區欄位
如果表 PartitionTable
已分區,以下查詢將返回一個或多個行。
如果表未分區,則不返回任何行。
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 = 'PartitionTable';
以下查詢返回表的分區列的名稱。
PartitionTable.
SELECT t.object_id AS Object_ID, t.name AS TableName, ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.object_id = i.object_id
JOIN sys.columns AS c
ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'PartitionTable'
AND i.type <= 1
AND c.column_id = 1;
㈩ sqlserver2008怎麼實現自動分區表
/*第一步:創建分區函數*/
Create partition function Part_func_Bag(varchar(20)) as range right
/*正式區間
for values(N'01100923909760', N'01100936207030', N'6311001806524',N'92451400060101');*/for values(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714');goselect * from Bag where BagCode in(N'91701311710807', N'07201280707101', N'8011011089884',N'80241001430714')
/*第二步:創建文件組和文件*/
alter database ZXAutoCode add filegroup [Bag_1]; alter database ZXAutoCode add filegroup [Bag_2];alter database ZXAutoCode add filegroup [Bag_3];alter database ZXAutoCode add filegroup [Bag_4];goalter database ZXAutoCode add file (name = Bag1_data,filename = 'E:\MSSQL\TESTDATA\Bag1_data.ndf',size = 3MB) to filegroup [Bag_1];alter database ZXAutoCode add file (name = Bag2_data,filename = 'E:\MSSQL\TESTDATA\Bag2_data.ndf',size = 3MB) to filegroup [Bag_2];alter database ZXAutoCode add file (name = Bag3_data,filename = 'E:\MSSQL\TESTDATA\Bag3_data.ndf',size = 3MB) to filegroup [Bag_3]; alter database ZXAutoCode add file (name = Bag4_data,filename = 'E:\MSSQL\TESTDATA\Bag4_data.ndf',size = 3MB) to filegroup [Bag_4]; go
/*第三步:創建分區方案並關聯到分區函數*/
Create partition scheme Part_func_Bag_scheme as partition Part_func_Bag to ([Bag_1],[Bag_2],[Bag_3],[Bag_4],[Primary]); go
/*第四步 重建索引(刪除聚集索引以及需要分區欄位的索引後重建該類索引,表被按分區值將分配到各文件組。數據在這一步開始轉移。)*/
EXEC sp_helpindex N'Bag' --查看orders中使用的索引 drop index idx_cl_od on Bag;gocreate clustered index idx_cl_od on Bag(bagcode) on Part_func_Bag_scheme(bagcode); go