我有一个场景,每个用户都被分配了2MB的数据库空间。现在,我必须显示他们分配的空间的感知使用情况,为此,我需要知道表中单个记录的大小。
我曾尝试使用sp_spaceused,甚至编写了一个使用数据长度的自定义过程。但他们在结果上表现出巨大的差异。
有没有什么办法能把这件事做好。
发布于 2009-04-21 13:08:03
使用您的表名运行DBCC SHOWCONTIG
dbcc showcontig ('TableName') with tableresults然后查看最大最小值和平均记录大小
发布于 2009-05-11 21:02:46
下面的查询将通过查看数据库的对象分配了多少页来告诉您数据正在使用的@SpaceAllotted的百分比。
不值得尝试在行级测量使用情况,因为SQL Server在区级分配所有空间。每个区段由8个8KB数据页组成。因此,如果您的数据库只有一行,而该行有4个字节的数据,那么仍然需要分配整个区段来容纳这4个字节(或者使用具有未分配页的现有区段)。这称为混合范围)。
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%准确的。此外,区段甚至可能有空闲的页面(这些页面是保留的,因此仍然占用磁盘空间),因此通常情况下,这个估计值总是很低。但是,这可能是您在不编写任何东西来检查页面级数据库的情况下获得的最好结果。
啊,是的,看看其他答案,这是另一个选择。这将基本上查看页面中所有数据文件的当前大小,并确定它们占用的空间百分比。现在,这里也有一些注意事项...
希望其中一个能解决你的问题。
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发布于 2012-09-27 01:11:13
由于showcontig将被弃用,因此您还可以使用:
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')https://stackoverflow.com/questions/771248
复制相似问题