2014-09-30 40 views
0

我是新來的SQL我知道如何獲得數據庫的大小使用 EXEC sp_spaceused 我有一個問題我如何獲得Sql Server數據庫中的表的大小。數據庫中的表大小

像數據庫中的員工表。

謝謝提前。

+0

問題,爲什麼你需要桌子的尺寸? – Tanner 2014-09-30 10:24:54

+0

坦納我需要我的問題的答案 http://stackoverflow.com/questions/26112601/how-memory-allocation-is-assign-to-each-attribute-in-database – 2014-09-30 10:26:37

+0

這並不真正回答我的問題至於爲什麼你想/需要這些信息。 – Tanner 2014-09-30 10:40:06

回答

0

在MySQL中,你可以使用這個查詢來顯示錶的大小:

SELECT table_name AS "Table", 
round(((data_length + index_length)/1024/1024), 2) "Size in MB" 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME" 
AND table_name = "$TABLE_NAME"; 

在SQL:

註釋sp_spaceused可以得到你的表所使用的磁盤空間信息,索引視圖或整個數據庫。

USE MyDatabase; GO 

EXEC sp_spaceused N'dbo.MyTable'; GO 

使用這種一次性爲所有表:

USE MyDatabase; GO 

sp_msforeachtable 'EXEC sp_spaceused [?]' GO 
+0

其實我陷入了一種情況,我有一個表t,它有w int column1,column2可以爲null值。如果我在column1中插入值,並且column2爲null,那麼它將在行級別獲得多少字節。 – 2014-09-30 09:58:17

+0

SQL NULL值在記錄目錄中保留一個或兩個字節。除此之外,如果存儲在可變長度列中,則SQL NULL值在記錄的數據部分保留零字節。在固定長度的列中,它在記錄的數據部分中保留列的固定長度。 – deadman 2014-09-30 10:03:51

+0

有空的列會佔用空間嗎? 4字節的int? http://stackoverflow.com/questions/26112601/how-memory-allocation-is-assign-to-each-attribute-in-database – 2014-09-30 10:17:19

0

的一種方法是看sys.dm_db_index_physical_stats輸出。

min_record_size_in_bytes,max_record_size_in_bytes和avg_record_size_in_bytes會給你你想要的尺寸。

如果你想看到一個特定記錄的大小,另一種方式是找到物理排位置,看到

SQL Server 2008: New (undocumented) physical row locator function.

然後你可以轉儲行物理結構,看到記錄的剖析。

1

這稍微參與T-SQL語句會給你完全相同的信息sp_spaceused回報:

WITH pages AS 
(
    SELECT 
     object_id, 
     SUM(reserved_page_count) AS reserved_pages, 
     SUM(used_page_count) AS used_pages, 
     SUM(CASE 
       WHEN (index_id < 2) 
        THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count) 
       ELSE lob_used_page_count + row_overflow_used_page_count 
      END) AS pages 
    FROM 
     sys.dm_db_partition_stats 
    GROUP BY 
     object_id), 
extra AS 
(
    SELECT 
     p.object_id, 
     SUM(reserved_page_count) AS reserved_pages, 
     SUM(used_page_count) AS used_pages 
    FROM 
     sys.dm_db_partition_stats p 
    INNER JOIN 
     sys.internal_tables it ON p.object_id = it.object_id 
    WHERE 
     it.internal_type IN (202, 204, 211, 212, 213, 214, 215, 216) 
    GROUP BY 
     p.object_id) 
SELECT 
    SchemaName = s.NAME, 
    TableName = t.NAME, 
    CompleteName = s.NAME + '.' + t.NAME, 
    (p.reserved_pages + ISNULL(e.reserved_pages, 0)) * 8 AS reserved_kb, 
    pages * 8 AS data_kb , 
    (CASE 
     WHEN p.used_pages + ISNULL(e.used_pages, 0) > pages 
      THEN (p.used_pages + ISNULL(e.used_pages, 0) - pages) 
      ELSE 0 
    END) * 8 AS index_kb , 
    (CASE 
     WHEN p.reserved_pages + ISNULL(e.reserved_pages, 0) > p.used_pages + ISNULL(e.used_pages, 0) 
      THEN (p.reserved_pages + ISNULL(e.reserved_pages, 0) - p.used_pages + ISNULL(e.used_pages, 0)) 
      ELSE 0 
    END) * 8 AS unused_kb 
FROM 
    pages p 
INNER JOIN 
    sys.tables t ON t.object_id = p.object_id 
INNER JOIN 
    sys.schemas s ON s.schema_id = t.schema_id 
LEFT OUTER JOIN 
    extra e ON p.object_id = e.object_id 
WHERE 
    t.is_ms_shipped = 0 
ORDER BY 
    s.Name, t.Name 

當然,理想情況下,你會「隱藏」這個你自己的一個很好的可用存儲過程讓它在任何需要的時候都可用...