IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Best practice - Stockage d'un long texte


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut Best practice - Stockage d'un long texte
    Bonjour à tous,

    Dans ma BDD j'ai une table qui contient une trace des appels à des Webservices que mes applications peuvent faire.
    J'aimerai mettre en face de chacun de mes appels, le JSON envoyé en POST, et donc stocker cela dans une colonne à part entière.
    Chacun de mes appels génère actuellement un fichier de 20ko à peu près.

    Est ce que selon vous ce serait judicieux de créer une colonne nvarchar(max) ? Ou bien mieux vaut il créer des dossiers sur le serveur pour y stocker les fichiers directement ?

  2. #2
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 20 779
    Points : 49 221
    Points
    49 221
    Billets dans le blog
    1
    Par défaut
    Colonne NVARCHAR(max) dans la table avec IMPÉRATIVEMENT la directive TEXTIMAGE_ON pour le CREATE TABLE avec une destination spécifique d'un groupe de fichier dédié.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut
    Quelque chose de ce type ? Pourquoi dans un filegroup séparé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE test
    (
       [etc...]
       [json] [nvarchar](max) NOT NULL
    )
    ON [fg_json] TEXTIMAGE_ON [fg_json]

  4. #4
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut
    Ok ça semble fonctionner, je vais encore faire des tests de performance avant de crier victoire.
    Est ce qu'il y a une possibilité de compresser uniquement cette colonne ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    septembre 2016
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2016
    Messages : 717
    Points : 1 371
    Points
    1 371
    Par défaut
    Bonjour,

    Citation Envoyé par Pfeffer Voir le message
    je vais encore faire des tests de performance avant de crier victoire.
    Est ce qu'il y a une possibilité de compresser uniquement cette colonne ?
    Comment vois-tu les choses entre la compression et la performance ?
    Le savoir est une nourriture qui exige des efforts.

  6. #6
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut
    Si je compresse le JSON dans un FILESTREAM par exemple ? Est ce que je gagne en compression ?
    Ou si je compresse mon json et que je stocke dans un varbinary(maxlength) ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    septembre 2016
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2016
    Messages : 717
    Points : 1 371
    Points
    1 371
    Par défaut
    Bonjour,

    le malheur est qu'on ne fait que de la technique, pas de la magie. Désolé.

    Pour utiliser un filestream le type de donnée doit être du VARBINARY(MAX).
    voir ici https://docs.microsoft.com/fr-fr/sql...0file%20system.

    Et je ne comprends toujours pas pourquoi vouloir chercher à compresser un flux Json stocké dans une colonne d'une table d'une base de données ACID, le tout en cherchant des performances ?

    Q1 : Allez vous faire des recherches au sein du flux Json ? => est-ce que le flux est considéré comme atomique ou pas ?
    Q2 : Quels sont vos protocoles de test de performances ? => quel est votre pondération entre les tests portants sur l'espace disque, le CPU, la RAM, la concurrence d'accès ?

    Personnellement je vous conseillerais de traiter votre Json pour stocker les valeurs dans une ou plusieurs tables et d'utiliser la compression au niveau ROW voire PAGE.
    Mais encore une fois comment mesure t'on la performance ?
    Le savoir est une nourriture qui exige des efforts.

  8. #8
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 20 779
    Points : 49 221
    Points
    49 221
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pfeffer Voir le message
    Si je compresse le JSON dans un FILESTREAM par exemple ? Est ce que je gagne en compression ?
    Ou si je compresse mon json et que je stocke dans un varbinary(maxlength) ?
    Un FILESTREAM ne peut être utilisé que pour un fichier, pas un flux.

    Oui, vous pouvez compresser via les fonction COMPRESS et DECOMPRESS (qui utilise du LZD) avant stockage mais cela n'a aucun intérêt dans un FILESTREAM.
    Les performances de FILESTREAM sont intéressant si la moyenne du volume de chacun des fichiers stockées est au dessus de 2 Mo.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut
    Le JSON ne servira que de logs, et dans un usage très limité.
    Aucun requête ne se fera sur ce champs.
    C'est pour cette raison que je me disais qu'il serait peut être intéressant de trouver une solution de compression pour éviter d'avoir trop de volume à charger.

  10. #10
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2004
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : février 2004
    Messages : 443
    Points : 209
    Points
    209
    Par défaut
    Alors pour votre information:

    Passer en varbinary(max), en envoyant dans le INSERT un tableau de byte[] compressé (avec sharpziplib) c'est hyper efficace.
    2s à l'intégration au lieu de 28s.

    Lorsque je veux récupérer mon champs, je fais l'inverse, récupération tableau de byte[] et décompression.
    Et la aussi très rapide.

    Ca répond parfaitement à mon besoin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Tronquer un long texte à un saut de ligne
    Par php_de_travers dans le forum Langage
    Réponses: 1
    Dernier message: 14/05/2006, 22h33
  2. Réponses: 10
    Dernier message: 10/05/2006, 22h04
  3. Très long texte dans Quick Report - Comment faire ?
    Par delphi+ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo