Because of how NULL variable-length columns are stored you should not see a difference in your two sample tables.
Try changing one of the columns to fixed-length though and you'll see a difference:
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'SparseColTest_NonSparse')
AND type IN ( N'U' ) )
DROP TABLE SparseColTest_NonSparse;
GO
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'SparseColTest_Sparse')
AND type IN ( N'U' ) )
DROP TABLE SparseColTest_Sparse;
GO
CREATE TABLE SparseColTest_NonSparse
(
AddressID INT IDENTITY(1, 1)
NOT NULL,
AddressLine1 INT NULL,
AddressLine2 VARCHAR(500) NULL,
AddressLine3 VARCHAR(500) NULL,
PostalCode VARCHAR(20) NULL,
Country VARCHAR(50)
)
GO
CREATE TABLE SparseColTest_Sparse
(
AddressID INT IDENTITY(1, 1)
NOT NULL,
AddressLine1 INT SPARSE
NULL,
AddressLine2 VARCHAR(500) SPARSE
NULL,
AddressLine3 VARCHAR(500) SPARSE
NULL,
PostalCode VARCHAR(20) SPARSE
NULL,
Country VARCHAR(50)
);
GO
DECLARE @i INT = 100000;
INSERT INTO dbo.SparseColTest_NonSparse
(
AddressLine1,
AddressLine2,
AddressLine3,
PostalCode,
Country
)
SELECT TOP (@i)
NULL AS AddressLine1,
NULL AS AddressLine2,
NULL AS AddressLine3,
NULL AS PostalCode,
NULL AS Country
FROM sys.columns c1
CROSS JOIN sys.columns c2;
INSERT INTO dbo.SparseColTest_Sparse
(
AddressLine1,
AddressLine2,
AddressLine3,
PostalCode,
Country
)
SELECT TOP (@i)
NULL AS AddressLine1,
NULL AS AddressLine2,
NULL AS AddressLine3,
NULL AS PostalCode,
NULL AS Country
FROM sys.columns c1
CROSS JOIN sys.columns c2;
EXEC sp_spaceUsed
'SparseColTest_NonSparse'
EXEC sp_spaceUsed
'SparseColTest_Sparse'
/*
name rows reserved data index_size unused
----------------------------- -------------------- ------------------ ------------------ ------------------ ------------------
SparseColTest_NonSparse 100000 1736 KB 1688 KB 8 KB 40 KB
name rows reserved data index_size unused
----------------------------- -------------------- ------------------ ------------------ ------------------ ------------------
SparseColTest_Sparse 100000 1352 KB 1288 KB 8 KB 56 KB
*/
There are no special teachers of virtue, because virtue is taught by the whole community.
--Plato