关于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
--SQL Server 分析和编译时间:
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--SQL Server 分析和编译时间:
-- CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
--表 'TBPage'。扫描计数 1,逻辑读取 417 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
-- SQL Server 执行时间:
-- CPU 时间 = 47 毫秒,占用时间 = 49 毫秒。
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
-------------------------------------------
以上是脚本,大家执行后可以测试
在清除缓存的情况下,性能有提升。毋庸置疑。毕竟IO少了
在数据表全部在内存的时候,行压缩、页压缩相对于无压缩的消耗的CPU相同并且IO更小,但是Duration时间反而长呢?不解
请问cpu reads duration之间是什么关系(分别从有缓存和无缓存考虑)?
[解决办法]
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 SQL Server 执行时间: CPU 时间 = 15 毫秒,占用时间 = 24 毫秒。SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。表 'TBNone'。扫描计数 1,逻辑读取 5476 次,物理读取 37 次,预读 5463 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间: CPU 时间 = 78 毫秒,占用时间 = 1396 毫秒。DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 SQL Server 执行时间: CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。表 'TBRow'。扫描计数 1,逻辑读取 4627 次,物理读取 29 次,预读 4623 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间: CPU 时间 = 110 毫秒,占用时间 = 1017 毫秒。DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。 SQL Server 执行时间: CPU 时间 = 15 毫秒,占用时间 = 3 毫秒。SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。表 'TBPage'。扫描计数 1,逻辑读取 417 次,物理读取 3 次,预读 411 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 SQL Server 执行时间: CPU 时间 = 63 毫秒,占用时间 = 135 毫秒。