日期:2014-05-18  浏览次数:20528 次

关于SQL Server 2008 数据压缩新特性的性能问题疑惑
-测试行压缩,页压缩对CPU、Reads和Duration的影响
--创建没有压缩的表
IF OBJECT_ID('dbo.TBNone') IS NOT NULL 
  DROP TABLE dbo.TBNone ;
GO
CREATE TABLE dbo.TBNone
  (
  TBID INT NOT NULL ,
  MyMoney1 money,
  MyMoney2 money,
  MyMoney3 money,
  MyMoney4 money,
  MyVarchar VARCHAR(200)
  )
  WITH (
  DATA_COMPRESSION= NONE)
GO
--添加聚集索引
ALTER TABLE TBNone ADD CONSTRAINT [PK_TBNone_TBID] PRIMARY KEY CLUSTERED 
(
TBID ASC
)
--创建行压缩的表
IF OBJECT_ID('dbo.TBRow') IS NOT NULL 
  DROP TABLE dbo.TBRow ;
GO
CREATE TABLE dbo.TBRow
  (
  TBID INT NOT NULL ,
  MyMoney1 money,
  MyMoney2 money,
  MyMoney3 money,
  MyMoney4 MONEY,
  MyVarchar VARCHAR(200)
  )
  WITH (
  DATA_COMPRESSION= ROW)
GO
--添加聚集索引
ALTER TABLE TBRow ADD CONSTRAINT [PK_TBRow_TBID] PRIMARY KEY CLUSTERED 
(
TBID ASC
)
GO
--创建页压缩的表
IF OBJECT_ID('dbo.TBPage') IS NOT NULL 
  DROP TABLE dbo.TBPage ;
GO
CREATE TABLE dbo.TBPage
  (
  TBID INT NOT NULL ,
  MyMoney1 money,
  MyMoney2 money,
  MyMoney3 money,
  MyMoney4 money,
  MyVarchar VARCHAR(200)
  )
  WITH (
  DATA_COMPRESSION= PAGE)
GO
--添加聚集索引
ALTER TABLE TBPage ADD CONSTRAINT [PK_TBPage_TBID] PRIMARY KEY CLUSTERED 
(
TBID ASC
)
GO
--插入大量数据
DECLARE @n INT
SET @n = 0
WHILE @n <= 300000 
  BEGIN
  INSERT INTO TBNone
  VALUES ( @n, 100.00,100.00,100.00,100.00,'sdfsdfsfsdfsdf打发士大夫少发说地方是大方说的发是打发士大夫的是说地方是大方说的发是三房的发生的发')
  SET @n = @n + 1
  END
GO
DECLARE @n INT
SET @n = 0
WHILE @n <= 300000 
  BEGIN
  INSERT INTO TBRow
  VALUES ( @n, 100.00,100.00,100.00,100.00,'sdfsdfsfsdfsdf打发士大夫少发说地方是大方说的发是打发士大夫的是说地方是大方说的发是三房的发生的发')
  SET @n = @n + 1
  END
GO
DECLARE @n INT
SET @n = 0
WHILE @n <= 300000 
  BEGIN
  INSERT INTO TBPage
  VALUES ( @n, 100.00,100.00,100.00,100.00,'sdfsdfsfsdfsdf打发士大夫少发说地方是大方说的发是打发士大夫的是说地方是大方说的发是三房的发生的发')
  SET @n = @n + 1
  END
GO
--查看数据结构
DBCC TRACEON(3604)
GO
DBCC IND(DataCompression,TBNone,-1)
DBCC IND(DataCompression,TBRow,-1)
DBCC IND(DataCompression,TBPage,-1)
GO
--测试
SET NOCOUNT ON
SET STATISTICS IO ON
SET STATISTICS Time ON
DBCC DROPCLEANBUFFERS
  --CPU 时间 = 78 毫秒,占用时间 = 1137 毫秒。
SELECT * FROM TBNone WHERE MyMoney1=111
--SQL Server 分析和编译时间: 
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--SQL Server 分析和编译时间: 
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--表 'TBNone'。扫描计数 1,逻辑读取 5476 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

-- SQL Server 执行时间:
-- CPU 时间 = 31 毫秒,占用时间 = 40 毫秒。
DBCC DROPCLEANBUFFERS
-- CPU 时间 = 31 毫秒,占用时间 = 629 毫秒。
SELECT * FROM TBRow WHERE MyMoney1=111
--SQL Server 分析和编译时间: 
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--SQL Server 分析和编译时间: 
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--表 'TBRow'。扫描计数 1,逻辑读取 4627 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

-- SQL Server 执行时间:
-- CPU 时间 = 47 毫秒,占用时间 = 50 毫秒。
DBCC DROPCLEANBUFFERS
-- CPU 时间 = 46 毫秒,占用时间 = 76 毫秒。
SELECT * FROM TBPage WHERE MyMoney1=111