比较数据库存储结构对空间使用影响

示例代码:

 

View Code
1 。创建一个和 [ Sales ] . [ SalesOrderDetail ] 同结构的表格,这个表格上没有一个index,所以它是一个堆。
USE   [ AdventureWorks ]
GO
drop   table   [ Sales ] . [ SalesOrderDetail_hash ]
GO
CREATE   TABLE   [ Sales ] . [ SalesOrderDetail_hash ] (
    
[ SalesOrderID ]   [ int ]   NOT   NULL ,
    
[ SalesOrderDetailID ]   [ int ]  ,
    
[ CarrierTrackingNumber ]   [ nvarchar ] ( 25 NULL ,
    
[ OrderQty ]   [ smallint ]   NOT   NULL ,
    
[ ProductID ]   [ int ]   NOT   NULL ,
    
[ SpecialOfferID ]   [ int ]   NOT   NULL ,
    
[ UnitPrice ]   [ money ]   NOT   NULL ,
    
[ UnitPriceDiscount ]   [ money ]   NOT   NULL  ,
    
[ LineTotal ]  numeric ( 38 , 6 ),
    
[ rowguid ]   [ uniqueidentifier ]  ,
    
[ ModifiedDate ]   [ datetime ]
ON   [ PRIMARY ]
GO
insert   into   [ Sales ] . [ SalesOrderDetail_hash ]
select   *   from   [ Sales ] . [ SalesOrderDetail ]
go
dbcc  showcontig( ' [Sales].[SalesOrderDetail_hash] ' )
go

表: 'SalesOrderDetail_hash' (2011154210);索引 ID: 0,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1494
- 扫描区数..............................: 188
- 区切换次数..............................: 187
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 99.47% [187:188]
- 区扫描碎片 ..................: 1.06%
- 每页的平均可用字节数........................: 52.0
- 平均页密度(满).....................: 99.36%

 

 


2 。创建一个同样的,但是有clustered index的表格。所以这是一颗B树。
--  对于B树的操作
USE   [ AdventureWorks ]
GO
drop   table   [ Sales ] . [ SalesOrderDetail_C ]
GO
CREATE   TABLE   [ Sales ] . [ SalesOrderDetail_C ] (
    
[ SalesOrderID ]   [ int ]   NOT   NULL ,
    
[ SalesOrderDetailID ]   [ int ]  ,
    
[ CarrierTrackingNumber ]   [ nvarchar ] ( 25 NULL ,
    
[ OrderQty ]   [ smallint ]   NOT   NULL ,
    
[ ProductID ]   [ int ]   NOT   NULL ,
    
[ SpecialOfferID ]   [ int ]   NOT   NULL ,
    
[ UnitPrice ]   [ money ]   NOT   NULL ,
    
[ UnitPriceDiscount ]   [ money ]   NOT   NULL  ,
    
[ LineTotal ]  numeric ( 38 , 6 ),
    
[ rowguid ]   [ uniqueidentifier ]  ,
    
[ ModifiedDate ]   [ datetime ] ,
 
CONSTRAINT   [ PK_SalesOrderDetailC_SalesOrderID_SalesOrderDetailID ]   PRIMARY   KEY   CLUSTERED  
(
    
[ SalesOrderID ]   ASC ,
    
[ SalesOrderDetailID ]   ASC
ON   [ PRIMARY ]
ON   [ PRIMARY ]
GO
insert   into   [ Sales ] . [ SalesOrderDetail_C ]
select   *   from   [ Sales ] . [ SalesOrderDetail ]
go
dbcc  showcontig( ' [Sales].[SalesOrderDetail_C] ' ) WITH  ALL_INDEXES 
go
表: 'SalesOrderDetail_C' (1915153868);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1494
- 扫描区数..............................: 189
- 区切换次数..............................: 188
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 98.94% [187:189]
- 逻辑扫描碎片 ..................: 0.40%
- 区扫描碎片 ..................: 0.53%
- 每页的平均可用字节数........................: 52.0
- 平均页密度(满).....................: 99.36%

3 。创建一个同样的,但是Primary Key建立在nonclustered index上的表格。所以它是一个堆加一个B树。
USE   [ AdventureWorks ]
GO
drop   table   [ Sales ] . [ SalesOrderDetail_N ]
GO
CREATE   TABLE   [ Sales ] . [ SalesOrderDetail_N ] (
    
[ SalesOrderID ]   [ int ]   NOT   NULL ,
    
[ SalesOrderDetailID ]   [ int ]  ,
    
[ CarrierTrackingNumber ]   [ nvarchar ] ( 25 NULL ,
    
[ OrderQty ]   [ smallint ]   NOT   NULL ,
    
[ ProductID ]   [ int ]   NOT   NULL ,
    
[ SpecialOfferID ]   [ int ]   NOT   NULL ,
    
[ UnitPrice ]   [ money ]   NOT   NULL ,
    
[ UnitPriceDiscount ]   [ money ]   NOT   NULL  ,
    
[ LineTotal ]  numeric ( 38 , 6 ),
    
[ rowguid ]   [ uniqueidentifier ]  ,
    
[ ModifiedDate ]   [ datetime ] ,
 
CONSTRAINT   [ PK_SalesOrderDetailN_SalesOrderID_SalesOrderDetailID ]   PRIMARY   KEY   nonclustered  
(
    
[ SalesOrderID ]   ASC ,
    
[ SalesOrderDetailID ]   ASC
ON   [ PRIMARY ]
ON   [ PRIMARY ]
GO
insert   into   [ Sales ] . [ SalesOrderDetail_N ]
select   *   from   [ Sales ] . [ SalesOrderDetail ]
go
dbcc  showcontig( ' [Sales].[SalesOrderDetail_N] ' ) WITH  ALL_INDEXES 
go

表: 'SalesOrderDetail_N' (1947153982);索引 ID: 0,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1494
- 扫描区数..............................: 188
- 区切换次数..............................: 187
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 99.47% [187:188]
- 区扫描碎片 ..................: 19.15%
- 每页的平均可用字节数........................: 52.0
- 平均页密度(满).....................: 99.36%
DBCC SHOWCONTIG 正在扫描 'SalesOrderDetail_N' 表...
表: 'SalesOrderDetail_N' (1947153982);索引 ID: 2,数据库 ID: 6
已执行 LEAF 级别的扫描。
- 扫描页数................................: 285
- 扫描区数..............................: 38
- 区切换次数..............................: 37
- 每个区的平均页数........................: 7.5
- 扫描密度 [最佳计数:实际计数].......: 94.74% [36:38]
- 逻辑扫描碎片 ..................: 1.05%
- 区扫描碎片 ..................: 94.74%
- 每页的平均可用字节数........................: 8.2
- 平均页密度(满).....................: 99.90%

第3种的非聚集索引用了两块空间,堆和B树。

三种存储方式的比较:

存储方式                                          使用页面数量       使用区数量

没有任何索引                1494            190

有聚集索引             1494          190

没有聚集索引,有非聚集索引        1779            228

建立聚集索引并没有增加使用空间,强烈建议在大表上建立聚集索引。

 

你可能感兴趣的:(数据库)