Sql-Server

計算每行的總“行上”字節數……簡單的方法

  • February 21, 2019

我們要計算表中每一行的總“行上”儲存字節數。正如我們所理解的,我們必須將每列的 DATALENGTH() 相加,同時還要考慮 NULL 和諸如 VARCHAR(MAX) 之類的東西,它們“在行上”只有一個 24 字節的指針。我們知道每一行也有一些成本,這些成本在下面的查詢中沒有考慮。

SELECT   ROW_ID,

        CASE
             WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL1','PRECISION') = -1 THEN 24
             ELSE ISNULL(DATALENGTH(COL1), 1)
        END
         +
        CASE
             WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL2','PRECISION') = -1 THEN 24
             ELSE ISNULL(DATALENGTH(COL2), 1)
        END
         +
        CASE
             WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL3','PRECISION') = -1 THEN 24
             ELSE ISNULL(DATALENGTH(COL3), 1)
        END
         +
        ...
        ...
        AS ROW_SIZE

FROM     EXAMPLE_TABLE

ORDER BY ROW_SIZE DESC
;

什麼野獸!這只是一個近似值。

然後我們發現

DBCC SHOWCONTIG ('EXAMPLE_TABLE') WITH TABLERESULTS

它返回MaximumRecordSize。這表明 SQL Server 中已經存在一種算法,它能夠計算行的確切大小。

我們如何直接訪問該算法?

我們如何直接訪問該算法?

就這個問題的答案而言,具體來說,您無法直接訪問它。沒有什麼可以說SELECT GetMeMaxRowSize(MyTable, MyPartition, MyIndex)的。

但是,正如LowlyDBA所指出的,您可以使用sys.dm_db_index_physical_stats為您提供比 ShowContig 更多的資訊。非常有趣的是,如果您執行DBCC SHOWCONTIG(),擷取已棄用的資訊,您應該會看到一條消息,使用上述 DMV 代替ShowContig命令。

引用自:https://dba.stackexchange.com/questions/230422