AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 12521
Accepted
Mitch Wheat
Mitch Wheat
Asked: 2012-02-09 23:14:16 +0800 CST2012-02-09 23:14:16 +0800 CST 2012-02-09 23:14:16 +0800 CST

SQL Server 表大小差异

  • 772

希望这有一个简单的答案,我错过了一些明显的东西。我有一个表,其中行数 * 行大小比表使用的实际数据空间小得多。

如果我运行标准报告“Top Tables 的磁盘使用情况”,我得到的数字是:

# Records   Reserved (KB)      Data (KB)      Indexes (KB)      Unused (KB) 
33,245        32,962,192       31,070,264       144               1,891,784

这(除非我遗漏了什么)意味着每一行占用不到 1MB!

表模式(我没有设计)是:

CREATE TABLE [MySchema].[MyTable]
(
    [Code]     [varchar](4) NOT NULL,
    [SomeID]   [smallint] NOT NULL,
    [SomeID1]  [smallint] NOT NULL,
    [Updated]  [datetime] NOT NULL,
    [SomeId2]  [int] NULL,
    [SomeId3]  [int] NULL,
    [Somekey]  [real] NULL,
    [desc1]    [char](12) NULL,
    [colA]     [real] NULL,
    [someid4]  [char](20) NULL,
    [starttime] [real] NULL,
    [endtime]  [real] NULL,
    [duration] [real] NULL,
    [reason]   [real] NULL,
    [status]   [real] NULL,
    [category] [real] NULL,
    [comment]  [char](30) NULL,
    [ColB]     [real] NULL,
    [ColC]     [real] NULL
)

它没有索引或键。

一些研究让我想到,也许在过去,表中的可变长度列已被删除,所以我运行DBCC CLEANTABLE时没有做任何更改。

SQL Server 2005 x64 Service Pack 3(据我所知,可以从以下版本字符串中得出:

[Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 2009 年 5 月 26 日 14:13:01 版权所有 (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 5.2 (Build 3790: Service Pack 2)]

更新:我很确定这是由于 HEAP 病理性碎片造成的……我通过应用聚集索引(根据缺少的索引报告需要索引)进行了重建,并且大小差异已经消失。

sql-server sql-server-2005
  • 2 2 个回答
  • 1757 Views

2 个回答

  • Voted
  1. Best Answer
    gbn
    2012-02-10T02:01:03+08:002012-02-10T02:01:03+08:00

    当您从堆中删除时,分配的空间可能不会未分配,除非您使用表锁。请参阅MSDN 上 DELETE 中的“从堆中删除行”

    这是碎片化的一个单独问题(当然会发生)

    以防万一,您是否尝试过此方法来更新使用信息?

    EXEC sp_spaceused 'MySchema.MyTable', 'true'
    

    没有索引或键,您无法正常对其进行碎片整理。
    您可以添加/删除聚集索引,或执行类似的操作

    SELECT * INTO [MySchema].[MyTableNew] 
    FROM [MySchema].[MyTable]
    -- ORDER BY something
    
    -- if you like
    EXEC sp_spaceused 'MySchema.MyTableNew', 'true'
    
    DROP TABLE [MySchema].[MyTable];
    
    EXEC sp_rename 'MySchema.MyTableNew', 'MyTable';
    

    哎呀:刚刚看到更新,我的互联网断断续续......

    • 6
  2. adaptr
    2012-02-10T00:44:16+08:002012-02-10T00:44:16+08:00

    我使用这个脚本:

    CREATE TABLE #Temp
     (  [Table_Name] varchar(50),
        Row_Count int,
        Table_Size varchar(50),
        Data_Space_Used varchar(50),
        Index_Space_Used varchar(50),
        Unused_Space varchar(50) )
    INSERT INTO #temp exec sp_msforeachtable 'sp_spaceused "?"'
    
    SELECT Table_Name AS [Table], Row_Count AS [Row Count],
            dbo.strip_kb(Table_Size) / 1024 AS [Table size],
            dbo.strip_kb(Data_Space_Used) / 1024 AS [Data Space],
            dbo.strip_kb(Index_Space_Used) / 1024 AS [Index Space],
            dbo.strip_kb(Unused_Space) / 1024 AS [Unused Space],
            CASE Row_Count WHEN 0 THEN 0 ELSE dbo.strip_kb(Data_Space_Used) * 1024 / Row_Count END AS [Avg Row Size]
        FROM #temp order by Row_Count DESC
    
    DROP TABLE #temp
    

    它为您提供了每个表的平均行大小,以及您在上面显示的数据,但我倾向于相信它的输出比内置报告多一点:)

    • 2

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve