Queremos calcular o total de bytes de armazenamento "na linha" para cada linha na tabela. Como entendemos, devemos somar o DATALENGTH() de cada coluna enquanto também contabilizamos NULLs e coisas como VARCHAR(MAX) que possuem apenas um ponteiro de 24 bytes "na linha". Estamos cientes de que também há alguma sobrecarga para cada linha que não é contabilizada na consulta abaixo.
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
;
Que fera! E é apenas uma aproximação.
Então descobrimos
DBCC SHOWCONTIG ('EXAMPLE_TABLE') WITH TABLERESULTS
que retorna MaximumRecordSize. Isso revela que já existe um algoritmo enterrado em algum lugar no SQL Server que é capaz de calcular o tamanho exato de uma linha.
Como podemos acessar esse algoritmo diretamente?
No que diz respeito à resposta a esta pergunta, especificamente, você não pode acessá-la diretamente. Não há nada onde você possa dizer
SELECT GetMeMaxRowSize(MyTable, MyPartition, MyIndex)
.No entanto, como LowlyDBA apontou, você pode usar sys.dm_db_index_physical_stats para fornecer mais informações do que ShowContig. O bastante interessante é que se você executar
DBCC SHOWCONTIG()
, capturando informações obsoletas, deverá ver uma mensagem para usar o DMV mencionado no lugar doShowContig
comando.