Při čtení knížky jsem narazil na možnost definovat sloupec jako sparse column, který nějak efektivněji pracuje s null hodnoty. Rozhodl jsem se udělat pár testů. Mám dvě databáze a v každé databázi jednu tabulku:

   1: -- databaze ve ktere budou nektere sloupce SPARSE NULL
   2: CREATE DATABASE SPARSENULLDB ON PRIMARY
   3: ( NAME = N'SPARSENULLDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SPARSENULLDB.mdf',
   4:     SIZE = 3MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% )
   5: LOG ON
   6: ( NAME = N'SPARSENULLDB_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SPARSENULLDB.ldf',
   7:     SIZE = 2MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10MB)
   8:     
   9: -- database ve ktere budou nektere sloupce NULL
  10: CREATE DATABASE NULLDB ON PRIMARY
  11: ( NAME = N'NULLDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\NULLDB.mdf',
  12:     SIZE = 3MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% )
  13: LOG ON
  14: ( NAME = N'NULLDB_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\NULLDB.ldf',
  15:     SIZE = 2MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10MB)

V každé DB je jedna tabulka, kde v první databázi obsahuje tabulka sparse columns a v druhé nikoliv

   1: -- Vytvorim si odpovidajici tabulky
   2: use SPARSENULLDB
   3: CREATE TABLE Address
   4: (AddressID        INT            IDENTITY(1,1),
   5: AddressType        VARCHAR(20)    NOT NULL,
   6: AddressLine1    VARCHAR(50)    NOT NULL,
   7: AddressLine2    VARCHAR(50)    SPARSE NULL,
   8: AddressLine3    VARCHAR(50)    SPARSE NULL,
   9: City            VARCHAR(50)    NOT NULL,
  10: StateProvince    VARCHAR(50)    SPARSE NULL,
  11: Country            VARCHAR(70) SPARSE NULL,
  12: CONSTRAINT pk_customeraddress PRIMARY KEY(AddressID)) 
  13: GO
  14:  
  15: use NULLDB
  16: CREATE TABLE Address
  17: (AddressID        INT            IDENTITY(1,1),
  18: AddressType        VARCHAR(20)    NOT NULL,
  19: AddressLine1    VARCHAR(50)    NOT NULL,
  20: AddressLine2    VARCHAR(50)    NULL,
  21: AddressLine3    VARCHAR(50)    NULL,
  22: City            VARCHAR(50)    NOT NULL,
  23: StateProvince    VARCHAR(50)    NULL,
  24: Country            VARCHAR(70) NULL,
  25: CONSTRAINT pk_customeraddress PRIMARY KEY(AddressID)) 
  26: GO

Povinné jsou položky AddressType, AddressLine1 a City a tyto povinné položky jsem naplnil stejnými daty

  • AddressType – a (10) – 10x písmeno ‘a’
  • AddressLine1 – a(30) – 30x písmeno ‘a’
  • City– a(30) – 30x písmeno ‘a’

Zde jsou výsledky:

  1. Databáze s tabulkou, která obsahuje sparse columns
    1. 100 000 řádků   = 11 403 264 bytes
    2. 1 000 000 řádků  = 104 529 920 bytes
    3. 10 000 000 řádků = 937 951 232 bytes
  2. Databáze s tabulkou, která neobsahuje sparse columns
    1. 100 000 řádků   = 12 582 912 bytes
    2. 1 000 000 řádků  = 104 529 920 bytes
    3. 10 000 000 řádků = 1 031 798 784 bytes

Pro větší počet dat jsem to už nezkoušel, na mojem nb to bylo dosti časově náročné.

Výsledky mě nějak extra nenadchly, moc velké rozdíly v tom nevidím….možná to pochopím později, až se budu v SQL serveru více orientovat :-)