先壓縮再建叢集索引

今天與 Ellie 討論一個有趣的議題,針對既有的超大 Heap 要節省空間,是先壓縮再建叢集索引還是順序反過來。
簡單做個測試如下,看來先壓縮再建叢集索引較好,因為總體時間較少,壓縮結果所省下的空間差不多

create database test
go
use test
go
create table t1(
c1 int identity,
c2 nchar(100) default(N’Hello Word’),
c3 uniqueidentifier default(newsequentialid()),
c4 datetime2(7) default(sysdatetime()),
c5 bit default(1),
c6 float default(rand())
)
go
insert t1 default values
go
insert t1(c2) select c2 from t1
go 20
select * into t2 from t1
go

/*
name                                                                                                                             rows                 reserved           data               index_size         unused
——————————————————————————————————————————– ——————– —————— —————— —————— ——————
t1                                                                                                                               1048576              262216 KB          262144 KB          8 KB               64 KB
*/
exec sp_spaceused ‘t1’

set statistics io on
set statistics time on

/*
資料表 ‘t1’。掃描計數 9,邏輯讀取 32768,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 8953 ms,經過時間 = 1250 ms。
*/
ALTER TABLE [dbo].[t1] REBUILD PARTITION = ALL
WITH(DATA_COMPRESSION = PAGE)
go

/*
資料表 ‘t1’。掃描計數 9,邏輯讀取 3753,實體讀取 0,讀取前讀取 7,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 8564 ms,經過時間 = 1592 ms。
*/
create clustered index idx on t1(c1)
go

 

 

/*
資料表 ‘t2’。掃描計數 9,邏輯讀取 32768,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 5655 ms,經過時間 = 2662 ms。
*/
create clustered index idx2 on t2(c1)
go

/*
資料表 ‘t2’。掃描計數 8,邏輯讀取 32858,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。
資料表 ‘Worktable’。掃描計數 0,邏輯讀取 0,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 12594 ms,經過時間 = 1634 ms。
*/
ALTER TABLE [dbo].[t2] REBUILD PARTITION = ALL
WITH(DATA_COMPRESSION = PAGE)
go

set statistics io off
set statistics time off

/*
name                                                                                                                             rows                 reserved           data               index_size         unused
——————————————————————————————————————————– ——————– —————— —————— —————— ——————
t1                                                                                                                               1048576              31888 KB           31000 KB           160 KB             728 KB
*/
exec sp_spaceused ‘t1’

 

 

/*
name                                                                                                                             rows                 reserved           data               index_size         unused
——————————————————————————————————————————– ——————– —————— —————— —————— ——————
t2                                                                                                                               1048576              31824 KB           31000 KB           144 KB             680 KB
*/
exec sp_spaceused ‘t2’
GO

USE [master]
GO
ALTER DATABASE [test] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [test]

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: