Chociaż nie zgadzam się z tym, że BLOBy powinny znajdować się w innej tabeli - w ogóle nie powinny znajdować się w bazie danych . Zapisz wskaźnik do miejsca, w którym plik znajduje się na dysku, a następnie pobierz go z bazy danych ...
Głównym problemem, który powodują (dla mnie), jest indeksowanie. Używając XML z planami zapytań, ponieważ wszyscy są gotowi, zróbmy tabelę:
SELECT TOP 1000
ID = IDENTITY(INT,1,1),
deq.query_plan
INTO dbo.index_test
FROM sys.dm_exec_cached_plans AS dec
CROSS APPLY sys.dm_exec_query_plan(dec.plan_handle) AS deq
ALTER TABLE dbo.index_test ADD CONSTRAINT pk_id PRIMARY KEY CLUSTERED (ID)
To tylko 1000 wierszy, ale sprawdzanie rozmiaru ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
To ponad 40 MB na zaledwie 1000 wierszy. Zakładając, że dodajesz 40 MB co 1000 wierszy, może to dość szybko stać się brzydkie. Co się stanie, gdy trafisz 1 milion wierszy? To tylko około 1 TB danych.
Wszelkie zapytania, które wymagają użycia indeksu klastrowego, muszą teraz wczytać wszystkie te dane BLOB do wyjaśnienia pamięci : gdy odwołuje się do kolumny danych BLOB.
Czy możesz wymyślić lepszy sposób wykorzystania pamięci SQL Server niż przechowywanie BLOBów? Ponieważ na pewno mogę.
Rozwijanie go do indeksów nieklastrowanych:
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
Możesz zaprojektować indeksy nieklastrowane, aby w dużej mierze unikać kolumny BLOB, aby regularne zapytania mogły ominąć indeks klastrowany, ale gdy tylko potrzebujesz tej kolumny BLOB, potrzebujesz indeks klastrowany.
Jeśli dodasz go jako INCLUDED
kolumnę do indeksu nieklastrowanego, aby uniknąć scenariusza wyszukiwania klucza, powstanie gigantyczny indeks nieklastrowany:
Więcej problemów, które powodują:
- Jeśli ktoś uruchomi
SELECT *
zapytanie, otrzyma wszystkie dane BLOB.
- Zajmują miejsce w kopiach zapasowych i przywracają, spowalniając je
- Zwalniają
DBCC CHECKDB
, bo wiem, że sprawdzasz, czy nie ma korupcji, prawda?
- A jeśli wykonasz jakąkolwiek konserwację indeksu, one również to spowolnią.
Mam nadzieję że to pomoże!