詳解SQL Server 2008滑動窗口的管理

2020-11-28 IT168

  【IT168 技術文檔】每個月都會有新數據添加到龐大的Orders數據表中,此時如果只對這一個表進行操作,則更新索引的過程將嚴重製約性能並產生大量碎片。為了進行優化,我們將通過獨立的兩個表進行配合,即當有新數據產生時,將舊數據從分區表中切換出來,然後將新數據添加到分區表中。

  整個過程包含如下幾個步驟:

  ·準備好即將用於存放舊數據的表

  ·準備好存有新數據的表

  ·更改分區方案,以便使用新的文件組

  ·對分區函數進行更改,分裂出新的邊界點

  注意:前4步均為影響到實際的分區表

  ·切換進來新數據

  ·將舊數據切換出去

  注意:第5步和第6步的順序可以進行更改,且更改後執行速度更快

  ·合併邊界點

  ·備份/刪除舊數據

  我們實驗所用到的分區數據表中包含的數據,因此我們將把數據作為一個分區直接切換進來。當進行分區切換的時候,只有元數據會發生更改,真正的數據並不會產生移動,因此速度非常快。

  1.在不影響當前OrdersRange 分區表的前提下,為新數據做好準備

  (1)在Solution Explorer 窗口,雙擊打開Script4 – RollingRangeScenario.sql.

  (2)新建一個文件組,用於存放新的數據

  ALTER DATABASE AdventureWorks2008Test
  
ADD FILEGROUP [2004Q3]
  
GO

   (3)為文件組添加一個文件:

  ALTER DATABASE AdventureWorks2008Test
  
ADD FILE
  (NAME
= N'2004Q3',
  FILENAME
= N'C:\AdventureWorks2008Test\2004Q3.ndf',
  SIZE
= 5MB,
  MAXSIZE
= 100MB,
  FILEGROWTH
= 5MB)
  
TO FILEGROUP [2004Q3]
  
GO

  (4)接下來,我們要新建一個未分區的數據表,用於存放分區數據表中新建分區中的數據。該未分區數據表必須與分區數據表具有完全一致的結構和聚集索引。此外,為了能夠確保快速進行分區切換,還需要通過約束來確保此未分區數據表中的數據與分區數據表中新建分區的範圍相吻合。接下來我們將創建該數據表,插入數據,並創建聚集索引

  CREATE TABLE AdventureWorks2008Test.[dbo].[Orders2004Q3]

  (

  
[OrderID] [int] NOT NULL,

  
[EmployeeID] [int] NULL,

  
[VendorID] [int] NULL,

  
[TaxAmt] [money] NULL,

  
[Freight] [money] NULL,

  
[SubTotal] [money] NULL,

  
[Status] [tinyint] NOT NULL ,

  
[RevisionNumber] [tinyint] NULL,

  
[ModifiedDate] [datetime] NULL,

  
[ShipMethodID] tinyint NULL,

  
[ShipDate] [datetime] NOT NULL,

  
[OrderDate] [datetime] NOT NULL

  
CONSTRAINT Orders2004Q3MinDate

  
CHECK (OrderDate >= '20040701'),

  
[TotalDue] [money] NULL

  )
ON [2004Q3]

  
GO

  
ALTER TABLE AdventureWorks2008Test.[dbo].[Orders2004Q3]

  
ADD CONSTRAINT Orders2004Q3MaxDate

  
CHECK (OrderDate < '20041001')

  
go

  
---------------------------------------------

  
-- Populate new table with Q3 2004 data.

  
---------------------------------------------

  
INSERT INTO AdventureWorks2008Test.[dbo].Orders2004Q3

  
SELECT o.[PurchaseOrderID]

  , o.
[EmployeeID]

  , o.
[VendorID]

  , o.
[TaxAmt]

  , o.
[Freight]

  , o.
[SubTotal]

  , o.
[Status]

  , o.
[RevisionNumber]

  , o.
[ModifiedDate]

  , o.
[ShipMethodID]

  , o.
[ShipDate]

  , o.
[OrderDate]

  , o.
[TotalDue]

  
FROM AdventureWorks2008.Purchasing.PurchaseOrderHeader AS o

  
WHERE o.OrderDate >= '20040701'

  
AND o.OrderDate < '20041001'

  
GO

  
---------------------------------------------

  
-- The table *must* have the same clustered

  
-- index definition!

  
---------------------------------------------

  
CREATE CLUSTERED INDEX Orders2004Q3CLInd

  
ON Orders2004Q3(OrderDate, OrderID)

  
ON [2004Q3]

  
GO

 

  2.為將要進行歸檔的數據做好準備

  存放歸檔數據的數據表必須與分區數據表具有完全一致的結構和聚集索引。一會兒我們將把文件組2003Q3中的數據進行歸檔

  (1)創建用於歸檔的數據表:

  CREATE TABLE AdventureWorks2008Test.[dbo].[Orders2003Q3]

  (

  
[OrderID] [int] NOT NULL,

  
[EmployeeID] [int] NULL,

  
[VendorID] [int] NULL,

  
[TaxAmt] [money] NULL,

  
[Freight] [money] NULL,

  
[SubTotal] [money] NULL,

  
[Status] [tinyint] NOT NULL ,

  
[RevisionNumber] [tinyint] NULL,

  
[ModifiedDate] [datetime] NULL,

  
[ShipMethodID] tinyint NULL,

  
[ShipDate] [datetime] NOT NULL,

  
[OrderDate] [datetime] NOT NULL,

  
[TotalDue] [money] NULL

  )
ON [2003Q3]

  
GO

  
---------------------------------------------

  
-- The table must have the same clustered

  
-- index definition!

  
---------------------------------------------

  
CREATE CLUSTERED INDEX Orders2003Q3CLInd

  
ON Orders2003Q3(OrderDate, OrderID)

  
ON [2003Q3]

  
GO

   (2)執行如下代碼,進行分區切換。注意,此時只是將分區從分區表中移除,數據實際並沒有刪除,但在OrdersRange 數據表中將無法再看到這些數據,因為這些數據已經被「切換」到了Orders2003Q3 表中

  ALTER TABLE OrdersRange

  SWITCH PARTITION
2

  
TO Orders2003Q3

  
GO

   3.驗證分區數據表中已經不再包含切換出去的數據

  (1)為了確保分區 2中的數據已經被刪除,執行如下語句進行查看:

  SELECT $partition.OrderDateRangePFN(OrderDate)

  
AS 'Parition Number'

  ,
min(OrderDate) AS 'Min Order Date'

  ,
max(OrderDate) AS 'Max Order Date'

  ,
count(*) AS 'Rows In Partition'

  
FROM OrdersRange

  
GROUP BY $partition.OrderDateRangePFN(OrderDate)

  
ORDER BY 1

  
GO

   (2)此時可以看到只有分區3,4,5中有數據

  4.刪除已經廢棄的分區邊界

  通過剛才所執行的查詢我們可以看到,只有分區3,4,5當中有數據,如何才能將所有分區向左移動一位?

  此時我們只需要刪除最左側的分區邊界

  (1)執行如下語句,從OrdersRange 分區表中刪除2003年第3季度的分區邊界:

  ALTER PARTITION FUNCTION OrderDateRangePFN()

  MERGE RANGE (
'20030701')

  
GO

   (2)此時我們的分區表中將只包含3個有數據的分區和1個空分區。執行如下語句進行核實,注意現在分區2,3,4當中有數據

  SELECT $partition.OrderDateRangePFN(OrderDate)

  
AS 'Parition Number'

  ,
min(OrderDate) AS 'Min Order Date'

  ,
max(OrderDate) AS 'Max Order Date'

  ,
count(*) AS 'Rows In Partition'

  
FROM OrdersRange

  
GROUP BY $partition.OrderDateRangePFN(OrderDate)

  
ORDER BY 1

  
GO

  (3)Merge操作刪除了分區1,因此SQL Server對現有分區進行了重新編號,但並沒有移動任何數據,只是改變了分區號。正因如此,資料庫所使用的文件組並沒有發生改變。執行如下語句進行查詢:

  SELECT * FROM sys.filegroups

  (4)之前分區2存放在2003Q3 文件組,但現在該文件組已經不再與該分區表相關聯了。執行如下語句,可以查看各個分區及其相關聯的文件組:

  SELECT ps.name AS PSName,

  dds.destination_id
AS PartitionNumber,

  dds.data_space_id
AS FileGroup,

  fg.name
AS FileGroupName

  
FROM (((sys.tables AS t

  
INNER JOIN sys.indexes AS i

  
ON (t.object_id = i.object_id))

  
INNER JOIN sys.partition_schemes AS ps

  
ON (i.data_space_id = ps.data_space_id))

  
INNER JOIN sys.destination_data_spaces AS dds

  
ON (ps.data_space_id =

  dds.partition_scheme_id))

  
INNER JOIN sys.filegroups AS fg

  
ON dds.data_space_id = fg.data_space_id

  
WHERE (t.name = 'OrdersRange')

  
AND (i.index_id IN (0,1))

 

  5.將新的文件組添加到分區方案中

  前面我們查看了分區表當前的狀態,為了添加新的分區(從現有分區當中拆分出來),我們還要為新的分區準備一個存放位置。新的分區將存放在2004Q3 文件組中,該文件組我們前面已經創建。執行如下代碼將該文件組添加到分區方案中:

  ALTER PARTITION SCHEME OrderDatePScheme

  
NEXT USED [2004Q3]

  
GO

 

  6.更改數據表的約束

  分區視圖非常依賴約束,而分區數據表對約束的依賴沒有這麼強。但出於數據完整性的考慮,此實驗中我們為數據表添加了約束。現有約束只允許添加2003Q3 到2004Q2之間的數據。為了能夠將新數據切換到分區表中,我們首先要更改此約束

  (1)執行如下代碼,更改分區表的約束:

  ALTER TABLE OrdersRange

  
ADD CONSTRAINT OrdersRangeMax

  
CHECK ([OrderDate] < '20041001')

  
go

  
ALTER TABLE OrdersRange

  
ADD CONSTRAINT OrdersRangeMin

  
CHECK ([OrderDate] >= '20031001')

  
go

  
ALTER TABLE OrdersRange

  
DROP CONSTRAINT OrdersRangeYear

  
go

 

  (2)接下來執行下面的代碼,分裂出新的分區:

  ALTER PARTITION FUNCTION OrderDateRangePFN()

  SPLIT RANGE (
'20040701')

  
GO

 

  (3)將數據切換到新的分區中:

  ALTER TABLE Orders2004Q3

  SWITCH
TO OrdersRange PARTITION 5

  
GO

  (4)最後驗證數據:

  SELECT $partition.OrderDateRangePFN(OrderDate)

  
AS 'Parition Number'

  ,
min(OrderDate) AS 'Min Order Date'

  ,
max(OrderDate) AS 'Max Order Date'

  ,
count(*) AS 'Rows In Partition'

  
FROM OrdersRange

  
GROUP BY $partition.OrderDateRangePFN(OrderDate)

  
ORDER BY 1

  
GO

  (5)關閉Script4 - RollingRangeScenario.sql.

相關焦點

  • 面面俱到:SQL SERVER 2008主數據管理
    我將從安裝、建模、MDM項目企業開發相關注意事項的使用來分別進行說明和討論  主數據服務的安裝  安裝前置條件  安裝64位的Windows Server 2003; Windows Server 2008; Windows Server 2008 R2作業系統  安裝SQL Server 2008 R2 資料庫  下載SQL Server
  • SQL Server 首次登陸 Linux 平臺
    更多細節,見 SQL Server 官方:https://www.microsoft.com/en-us/sql-server/sql-server-2017參考:VentureBeta、SQL Server看完本文有收穫?
  • 這個函數讓SQL效率提升99%
    簡介窗口函數(window function), 也可以被稱為 OLAP函數 或 分析函數。窗口函數是在 ISO SQL 標準中定義的。窗口是用戶指定的一組行。窗口函數計算從窗口派生的結果集中各行的值。可以在單個查詢中將多個排名或聚合窗口函數與單個 FROM 子句一起使用。
  • 三方法解決SQL Server與雲端資料庫連接
    【IT168專稿】SQL Azure 是構建在SQL Server技術之上的關係型雲端資料庫服務,為用戶提供了自主管理、高可用性、高可擴展的資料庫服務。用戶可以使用現有的T-SQL和關係型資料庫知識與工具,在雲端方便地構建自己的資料庫服務。
  • server sql 作業 使用專題及常見問題 - CSDN
    use masterGO/* --開啟sql server代理sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Agent XPs', 1; GO RECONFIGURE GO*/--定義創建作業
  • SQL Server 2008 R2進行VS2010應用開發
    【IT168技術】數據應用層程序(Data-Tier Application Component, DAC)是SQL Sever 2008 R2的一大功能亮點,結合使用Visual Studio 2010,可以幫助開發人員和資料庫管理員比以前更加有效的開發、部署、管理應用程式的數據層。
  • R+SQL Server的大數據管理
    它是是微軟公司推出的一個具有使用方便、可伸縮性好、與相關軟體集成程度高等優點的全面的關係型資料庫管理平臺,可以滿足數據爆炸時代和數據驅動應用程式的需求。令人興奮的是,微軟在2016年6月正式發布的SQL Server 2016將支持R語言編程(包括大數據的算法)。
  • Windows Server 2008系統旁門左道技巧2則 - CNET科技資訊網
    開啟方法如下:  「開始」→「伺服器管理」→「Server Manager」  在左邊一欄找到與「features」有關的項(然後點擊Add features);  滑動找到desktop experience(中文版叫桌面體驗,當然如果是無線使用筆記本的話,無線功能也要加上),最後重啟。
  • SQL SERVER 2016圖文安裝詳解,附處理安裝中遇到的問題
    3.在出現的SQL server安裝中心的界面當中,點擊「全新SQL SERVER獨立安裝或向現有安裝添加功能」。4.出現Microsoft更新的選擇頁面,這裡不需要點擊選擇「使用Microsoft update檢查更新」5.輸入SQL SERVER 2016的產品秘鑰,點擊」下一步「繼續。
  • 教你配置管理SQL Server 2008數據倉庫
    【IT168 技術文檔】在SQL Server 2008中有很多組件可以進行性能數據收集。為了設定收集數據的類型以及收集計劃,數據收集器需要使用管理數據倉庫。管理數據倉庫也是一個關係型資料庫,但在創建該資料庫時很多默認設置需要進行修改,在我們後面的實驗中將深入討論。
  • SQL Server 2008 R2數據管理新利器剖析
    【IT168專稿】我們在SQL Server 2008 R2數據管理新紀元一文中介紹了SQL Server 2008 R2的管理利器——SQL Server Utility。這一次我們將深入剖析這一管理工具。
  • 對SQL Server跨文件組的表進行分區
    實現可調窗口應用場景將數據切換到存檔表。  先決條件  在開始此實驗之前,您必須:  使用 Transact-SQL 在 Microsoft® SQL Server® 資料庫中創建資料庫對象的經驗。
  • SQL Server 2016新亮點全揭秘
    Azure SQL Database Elastic Pools  微軟同時發布了SQL DataBase通用的elastic pools,這項技術可以讓開發人員管理多個資料庫,但是每個資料庫還能保持其獨立性。微軟表示,該技術在多租戶環境下的應用是十分理想的。
  • SQL Server2008中的9種數據挖掘算法淺析
    【IT168 技術文檔】  在sql server2008中提供了9種常用的數據挖掘算法,這些算法用在不同數據挖掘的應用場景下,下面我們就各個算法逐個分析討論。  1.決策樹算法  決策樹,又稱判定樹,是一種類似二叉樹或多叉樹的樹結構。
  • 滑動窗口的奇妙用法
    滑動窗口:在給定大小的窗口內,對數組或者字符進行的操作。
  • 微軟正式提供SQL Server 2008 R2下載
    上月末,微軟SQL Server團隊宣布完成了SQL Server 2008 R2的RTM版並提交給了製造商,日前微軟宣布,MSDN和TechNet訂閱用戶也可以下載使用SQL Server 2008 R2了。
  • sparksql 窗口函數原理
    二、窗口函數的使用範式一般窗口函數都是這樣用的SELECT window_func(args)OVER ( [PARTITIONBY col_name, col_name, ...] [ORDERBY col_name, col_name, ...]
  • 微軟 SQL Server 2016 SP1 發布
    以編程方式標識 LPIM 到 SQL 服務帳戶 - DMV sys.dm_os_sys_info 中的新 sql_memory_model、sql_memory_model_desc 列,允許以編程方式標識對 SQL服務帳戶的IFI特權 - DMV sys.dm_server_services中的新列instant_file_initialization_enabled允許DBA以編程方式標識在SQL Server服務啟動時是否啟用了即時文件初始化(IFI)。
  • 2012關注SQL Server 2008 R2的七大理由
    但是,SQL Server 2008 R2並非是Excel的PowerPivot插件的嚴格必需品,後者還可以和很多其他數據源協同工作。    SQL Server 2008 R2的很多其他特性同樣值得注意,比如StreamInsight和主數據服務功能已經很成熟,而SQL Server系統準備工具和DACPAC還有進步的空間,總體上來看,SQL Server 2008 R2是一個可靠的過渡版本,即使有一些主要的附加功能還不盡如人意。
  • 微軟SQL Server 2008 R2正式完成RTM版
    微軟SQL Server團隊宣布,SQL Server 2008 R2已經完成RTM版並提供給了製造商,消費者將在接下來的幾周內通過微軟各發布渠道獲得SQL Server 2008 R2。