首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单个记录的大小?SQL

单个记录的大小?SQL
EN

Stack Overflow用户
提问于 2009-04-21 06:19:22
回答 5查看 46.8K关注 0票数 16

我有一个场景,每个用户都被分配了2MB的数据库空间。现在,我必须显示他们分配的空间的感知使用情况,为此,我需要知道表中单个记录的大小。

我曾尝试使用sp_spaceused,甚至编写了一个使用数据长度的自定义过程。但他们在结果上表现出巨大的差异。

有没有什么办法能把这件事做好。

EN

回答 5

Stack Overflow用户

发布于 2009-04-21 13:08:03

使用您的表名运行DBCC SHOWCONTIG

代码语言:javascript
运行
复制
dbcc showcontig ('TableName') with tableresults

然后查看最大最小值和平均记录大小

票数 25
EN

Stack Overflow用户

发布于 2009-05-11 21:02:46

下面的查询将通过查看数据库的对象分配了多少页来告诉您数据正在使用的@SpaceAllotted的百分比。

不值得尝试在行级测量使用情况,因为SQL Server在区级分配所有空间。每个区段由8个8KB数据页组成。因此,如果您的数据库只有一行,而该行有4个字节的数据,那么仍然需要分配整个区段来容纳这4个字节(或者使用具有未分配页的现有区段)。这称为混合范围)。

代码语言:javascript
运行
复制
DECLARE @SpaceAllotted      FLOAT
-- 2MB converted to kilobytes...
SET     @SpaceAllotted = 2048

SELECT 
    -- Allocation is done on the extent-level.
    -- Each extent contains eight 8KB data pages.
    ((1 / (@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT) / 8) * 64) * 100 AS PercentageUsed
FROM
    [sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips
    -- This will allow us to retrieve the page count of all tables in the
    -- current database, regardless of whether or not they have clustered
    -- indexes and/or non-clustered indexes.
INNER JOIN
    [sys].[indexes] i
    ON
        [ips].[object_id] = [i].[object_id]
    AND [ips].[index_id] = [i].[index_id]

由于我们确实有混合区段的可能性,并且没有好的方法(有一些方法,但它们不会很好)来确定将哪些页分配给哪些区段,所以这不是100%准确的。此外,区段甚至可能有空闲的页面(这些页面是保留的,因此仍然占用磁盘空间),因此通常情况下,这个估计值总是很低。但是,这可能是您在不编写任何东西来检查页面级数据库的情况下获得的最好结果。

啊,是的,看看其他答案,这是另一个选择。这将基本上查看页面中所有数据文件的当前大小,并确定它们占用的空间百分比。现在,这里也有一些注意事项...

  • 如果没有为数据库指定最大大小(自动增长已启用且不受限制),则不会执行此操作,因为max_size将作为-1.
  • Again,返回,因此我们无法准确确定实际数据使用了多少空间。这里我们查看的是文件系统上实际使用了多少空间。
  • 我们不查看日志文件空间。是的,这仍然会消耗磁盘空间。

希望其中一个能解决你的问题。

代码语言:javascript
运行
复制
SELECT 
    ((1 / CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed
FROM 
    [sys].dm_io_virtual_file_stats(DB_ID(), NULL)   vfs
INNER JOIN 
    [sys].[database_files]  df
    ON 
        [vfs].[file_id] = [df].[file_id]
WHERE 
    [df].[type] = 0
票数 12
EN

Stack Overflow用户

发布于 2012-09-27 01:11:13

由于showcontig将被弃用,因此您还可以使用:

代码语言:javascript
运行
复制
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/771248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档