Y a-t-il des problèmes de performance pour stocker des fichiers dans PostgreSQL? [fermé]

est-ce que ok stocke des fichiers comme des pages HTML, des images, PDF, etc dans une table dans PostgreSQL ou c'est lent? J'ai lu des articles disant que ce n'est pas recommandé, mais je ne sais pas si c'est vrai.

et ce qui est mieux à utiliser, stocker comme BLOB (il stocke dans un fichier, cliquez droit?) ou dans une colonne avec bytea type?

25
demandé sur Renato Dinhani 2012-03-07 20:59:48
la source

2 ответов

Vous avez deux choix. Vous pouvez stocker les données directement dans la rangée ou vous pouvez utiliser la facilité grand objet. Depuis PostgreSQL utilise maintenant quelque chose appelé TOAST pour déplacer de grands champs hors de la table il ne devrait pas y avoir de pénalité de performance associée au stockage de grandes données dans la rangée directement. Il reste une limite de 1 GO dans la taille d'un champ. Si cela est trop limité ou si vous voulez une API de streaming, vous pouvez utiliser la fonction Grand object, ce qui vous donne quelque chose de plus comme les descripteurs de fichier dans la base de données. Vous stockez la carte dans votre colonne et pouvez lire et écrire à partir de cette carte.

personnellement, je vous suggérerais d'éviter la facilité grand objet sauf si vous en avez absolument besoin. Avec TOAST, la plupart des cas d'utilisation sont couverts en utilisant la base de données comme vous l'attendez. Avec les objets de grande taille, vous vous donnez un fardeau de maintenance supplémentaire, parce que vous devez garder une trace des disques que vous avez utilisés et assurez-vous de les débloquer quand ils ne sont plus utilisés (mais pas avant) ou ils vont s'asseoir dans votre répertoire de données prenant l'espace pour toujours. Il y a aussi beaucoup d'installations exceptionnelles comportement autour d'eux, dont les détails m'échappent parce que je n'ai jamais utiliser.

pour la plupart des gens, la grande pénalité de performance associée au stockage de grandes données dans la base de données est que votre logiciel ORM sortira les grandes données sur chaque requête à moins que vous lui donnez des instructions spécifiques de ne pas le faire. Tu devrais le dire à hibernation ou à qui que ce soit. utiliser pour traiter ces colonnes comme grandes et ne les récupérer que lorsqu'elles sont spécifiquement demandées.

42
répondu Daniel Lyons 2012-03-07 21:29:43
la source

le type BLOB (LO) stocke les données en morceaux de 2KB dans les pages de tas PostgreSQL standard qui par défaut à 8KB en taille. Ils ne sont pas stockés en tant que fichiers indépendants et cohérents dans le système de fichiers - par exemple, vous ne seriez pas en mesure de localiser le fichier, faire une comparaison byte-byte et s'attendre à ce qu'il soit le même que les données du fichier original que vous avez chargé dans la base de données, car il ya aussi Postgres headers de page et les structures qui délimitent les morceaux.

vous devriez éviter d'utiliser l'interface grand objet (LO) si votre application aurait besoin de mettre à jour fréquemment les données binaires, et en particulier si cela impliquait beaucoup de petites Écritures à accès aléatoire, ce qui en raison de la façon PostgreSQL met en œuvre le contrôle de la concurrence (MVCC) peut conduire à une explosion de la quantité d'espace disque utilisé jusqu'à ce que vous aspirez la base de données. Le même résultat est probablement aussi applicable aux données stockées en ligne dans une colonne avec le bytea type ou de la même TOAST.

cependant, si votre les données suivent un modèle en écriture-une fois-lu-beaucoup (par exemple télécharger une image PNG et ne jamais la modifier après), il devrait être très bien du point de vue de l'utilisation du disque.

Voir c'pgsql-liste de diffusion générale, thread pour plus de discussion.

8
répondu singularsyntax 2014-11-21 03:16:22
la source

Autres questions sur