Existe-il des problèmes de performances de stockage de fichiers dans PostgreSQL?
Est ok stocker des fichiers comme des pages HTML, images, PDF, etc dans un tableau dans PostgreSQL ou c'est trop lent? J'ai lu des articles disant que ce n'est pas recommandé, mais je ne sais pas si c'est vrai.
Et quoi de mieux pour utiliser, stocker comme BLOB
(il stocke dans un fichier, non?) ou dans une colonne avec bytea
type?
Vous devez vous connecter pour publier un commentaire.
Vous avez deux choix. Vous pouvez stocker les données à droite de la ligne ou vous pouvez utiliser le grand objet de la facilité. Depuis PostgreSQL utilise maintenant quelque chose qui s'appelle TOAST de déplacer de grands champs de la table il ne devrait pas être la performance de la pénalité associée avec le stockage de données de grande taille dans la ligne directement. Il reste 1 GO de limite à la taille d'un champ. Si c'est trop limité ou si vous voulez un streaming API, vous pouvez utiliser le grand objet de la facilité, ce qui vous donne quelque chose de plus comme les descripteurs de fichier dans la base de données. Vous stockez le LO ID dans votre colonne et peut lire et écrire à partir de cette ID.
Personnellement, je vous suggère d'éviter les grosses fonction d'objet, sauf si vous avez absolument besoin. Avec du pain grillé, la plupart des cas d'utilisation sont couvertes par juste en utilisant la base de données comme vous le souhaitez. Avec de grands objets, vous vous donnez supplémentaires le fardeau de l'entretien, parce que vous devez garder une trace de la LO Id que vous avez utilisé, et être sûr de le dissocier d'eux quand ils ne servent plus (mais pas avant) ou ils vont s'asseoir dans votre répertoire de données prenant de la place 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 performance de la pénalité associée avec le stockage de données de grande taille dans la base de données est que l'ORM logiciel va sortir le big data sur chaque requête, sauf si vous demandez spécifiquement de ne pas. Vous devez prendre soin de raconter Hibernate ou ce que vous utilisez pour traiter ces colonnes de la taille et de seulement les récupérer quand ils sont spécifiquement demandé.
bytea
est un bon choix pour des données binaires. Vous pouvez également utilisertext
ouvarchar
si les données textuelles et dans le même encodage que la base de données.La GOUTTE (LO) type de données stocke des données dans 2KB morceaux à l'intérieur de standard de PostgreSQL tas de pages par défaut à 8 ko. Ils ne sont pas enregistrés comme indépendants, la cohésion des fichiers dans le système de fichiers - par exemple, vous ne seriez pas en mesure de localiser le fichier, faites un octet-par-octet de comparaison et de s'attendre à être le même que le fichier d'origine des données que vous avez chargé dans la base de données, puisqu'il y a aussi Postgres tas de page les en-têtes et les structures de délimiter les morceaux.
Vous devez éviter d'utiliser les Objets Volumineux (LO) de l'interface si votre demande aurait besoin de mettre à jour fréquemment les données binaires, et notamment si cela a impliqué un grand nombre de petits, random access writes, qui, en raison de la façon dont PostgreSQL met en œuvre le contrôle de concurrence (MVCC) peut conduire à une explosion de la quantité d'espace disque utilisée jusqu'à ce que vous VIDE la base de données. Le même résultat est probablement aussi applicable à des données stockées en ligne dans une colonne avec le bytea type ou de la même TOAST avais.
Toutefois, si vos données suit un Write-Once-Lire-Plusieurs motif (par exemple télécharger une image PNG et ne jamais modifier par la suite), il devrait être bon du point de vue de l'utilisation du disque.
Voir cette pgsql-liste de diffusion générale fil pour la poursuite des discussions.