2009-11-30 3 views
3

Quelle est la meilleure pratique pour stocker une grande quantité de données d'image dans SQL Server 2008? Je m'attends à stocker environ 50 000 images en utilisant environ 5 Go d'espace de stockage. Actuellement, je fais cela en utilisant une seule table avec les colonnes:Structure de table SQL Server pour stocker un grand nombre d'images

ID: int/PK/identity 
Picture: Image 
Thumbnail: Image 
UploadDate: DateTime 

Je suis préoccupé parce qu'à environ 10% de ma capacité totale attendue, il semble que les inserts prennent beaucoup de temps. Une image typique est d'environ 20k - 30k. Y a-t-il une meilleure structure logique pour stocker ces données? Ou dois-je me pencher sur le clustering ou une autre solution informatique pour gérer la charge de données?

+0

Les systèmes de fichiers font bien les fichiers. – dnagirl

+0

@dnagirl - curieux, comment synchronisez-vous les fichiers et les métadonnées? Si les images sont souvent modifiées (retouche photo avec versionnage), j'imagine que la restauration d'un db et une sauvegarde de fichier entraînerait des données orphelines? – JeffO

+0

Avec une taille typique de 20-30K, vous pouvez totalement stocker cela dans la table, pas de problème. Mais s'il vous plaît utilisez VARBINARY (MAX) au lieu du type "IMAGE" obsolète! –

Répondre

4

Image est un type de données dans SQL Server désapprouvée 2008. Il a été remplacé par VARBINARY(MAX) depuis SQL Server 2005. Si vous décidez de stocker l'image dans la base de données, vous devez utiliser VARBINARY(MAX) champs et envisager d'ajouter l'option FILESTREAM.

Pour les données de transmission en continu, comme des images, FILESTREAM est beaucoup plus rapide que VARBINARY(MAX) seul, selon this white paper:

Filestream vs. varbinary(max) performance http://i.msdn.microsoft.com/cc949109.image002(en-us).gif

Notez que pour atteindre cette performance en streaming, vous devez utiliser l'API appropriée dans votre conception et obtenir le Win32 handle of the BLOB.Notez que les mises à jour dans une colonne FILESTREAM (y compris INSERTS) seront plus lentes que VARBINARY(MAX). Pourquoi stockez-vous les images dans la base de données au lieu de simplement stocker le chemin de chaque image?

4

DB ou pas à DB, telle est la question.

Vous commencez une guerre religieuse ici avec Images en DB. L'opinion serait divisée pour SQL 2000, mais 2005 et au-dessus font un travail assez décent de stocker des blobs - il suffit de regarder le nombre d'installations SharePoint qui utilisent MS SQL Server comme leur stockage. Je ne ferais que cette route pour le stockage d'image mineur. Si vous finissez par les mettre dans la base de données, je dirais que vous devez séparer l'image des données qui y sont associées pour faciliter l'interrogation et la réduction de vos E/S et des instances lorsque les développeurs écrivent SELECT * (et oui, ils volonté).

Découvrez FILESTREAM dans SQL 2008 - il est destiné à des choses comme ça.

Voici quelques autres points sur DB vs système de fichiers que vous pouvez envisager:

  • stockage DB, les sauvegardes, la restauration, les licences de maintenance est coûteuse
  • Stockage dans DB est alors plus difficile d'obtenir au que sur le disque
  • disque peut être accélérée
  • Vous aurez besoin d'écrire du code pour obtenir/images fixes dans DB - ne sont pas nécessaires pour le disque
+0

Comment synchroniseriez-vous une restauration de sauvegarde entre la base de données et les fichiers? Cela serait difficile avec une application qui gère les images souvent modifiées et nécessite un contrôle de version. On dirait que les fichiers et les enregistrements de métadonnées seraient désactivés. – JeffO

+0

Je préfère les modèles à base d'insert pour mettre à jour les modèles basés. Donc, si un utilisateur a une nouvelle image, je ne remplacerais pas l'enregistrement, je choisirais d'ajouter une nouvelle ligne et l'ancienne avec un drapeau de non-utilisation. J'aurais écrit dans le fichier et la base de données en une seule transaction - ils sont toujours synchronisés à un moment donné. –

2

Découvrez les nouvelles fonctionnalités Filestream dans SQL Server 2008. Essentiellement, il vous permet de stocker des données blob (read: image) dans la base de données, sans avoir à lire les données dans les tampons sql à chaque lecture et écriture. Il utilise de manière transparente le système de fichiers pour stocker vos fichiers volumineux au lieu de pages SQL. Cela peut conduire à des temps de lecture et d'écriture beaucoup plus rapides pour les fichiers plus volumineux et, mieux encore, puisque tout cela se passe sous le capot, vous n'avez pas besoin de modifier les process stockés existants pour travailler avec les colonnes filestream. Voir here pour les exemples de code et certains profils de performances.

Questions connexes