Bien que je ne sois pas d'accord pour dire que les BLOB devraient simplement être dans une autre table - ils ne devraient pas du tout être dans la base de données . Stockez un pointeur vers l'emplacement du fichier sur le disque, puis récupérez-le dans la base de données ...
Le principal problème qu'ils provoquent (pour moi) concerne l'indexation. Utiliser XML avec des plans de requête, parce que tout le monde en a un, créons un tableau:
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)
Ce n'est que 1000 lignes, mais vérifier la taille ...
sp_BlitzIndex @DatabaseName = 'StackOverflow', @SchemaName = 'dbo', @TableName = 'index_test'
C'est plus de 40 Mo pour seulement 1000 lignes. En supposant que vous ajoutez 40 Mo toutes les 1000 lignes, cela peut devenir assez moche assez rapidement. Que se passe-t-il lorsque vous atteignez 1 million de lignes? C'est à peu près 1 To de données, là.
Toutes les requêtes qui doivent utiliser votre index cluster doivent désormais lire toutes ces données BLOB dans la clarification de la mémoire : lorsque la colonne de données BLOB est référencée.
Pouvez-vous imaginer de meilleures façons d'utiliser la mémoire SQL Server que de stocker des BLOB? Parce que je le peux.
Extension à des index non clusterisés:
CREATE INDEX ix_noblob ON dbo.index_test (ID)
CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan)
Vous pouvez concevoir vos index non clusterisés pour éviter largement la colonne BLOB afin que les requêtes régulières puissent éviter l'index clusterisé, mais dès que vous avez besoin de cette colonne BLOB, vous avez besoin de l'index clusterisé.
Si vous l'ajoutez en tant que INCLUDED
colonne à un index non cluster pour éviter un scénario de recherche de clé, vous vous retrouvez avec de gigantesques index non cluster:
Plus de problèmes qu'ils causent:
- Si quelqu'un exécute une
SELECT *
requête, il obtient toutes ces données BLOB.
- Ils occupent de l'espace dans les sauvegardes et les restaurations, les ralentissant
- Ils ralentissent
DBCC CHECKDB
, parce que je sais que vous vérifiez la corruption, non?
- Et si vous effectuez une maintenance d'index, cela ralentit également.
J'espère que cela t'aides!