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 :

Utiliser varchar(max) partout ?


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Utiliser varchar(max) partout ?
    Bonjour,


    J'ai pris l'habitude d'utiliser varchar(max) partout dans mes procédures stockées..

    Est ce que cela peut impacter les performances ?

    Vaut il mieux restreindre la taille du varchar quand on le peut ?


    D'avance merci

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    plus la taille est restreinte, moins on utilise de place, et de mémoire et moins il y a besoin de ressource pour interroger, trouver... ces informations.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    tu veux dire la taille réelle de la donnée qui est réellement mise dans le varchar ou le simple fait de déclarer un varchar dans la procédure stockée ??

    Car je crois que la taille utilisée par un varchar est la taille réelle + 2 octets.
    D'où le fait que j'ai toujours cru qu'un varchar(max) et un varchar(100) par exemple, étaient identique en mémoire.. mais je me trompe peut être.

    Et que se passe t'il dans une procédure stockée, dans laquelle on rempli plusieurs fois des données (de longueurs différentes) dans un varchar déclaré en MAX ?

    Merci

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Personellement je ne pense pas que tu aies un impact sur tes performances.

    varchar [ ( n | max ) ]
    Variable-length, non-Unicode character data. n can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes. The storage size is the actual length of data entered + 2 bytes. The data entered can be 0 characters in length. The SQL-2003 synonyms for varchar are char varying or character varying.
    On peut remarquer qu'un varchar prend en taille n+2bytes ou n est le nombre de caractères qu'il contient.
    Les 2 bytes supplémentaires servent de descripteur de variable, ils contiennent la longueur de la chaine en fait si mes souvenirs sont corrects.

    Donc d'après moi utiliser du varchar(max) partout n'aura pas vraiment d'impact sur tes performances. Par contre je verrais plus un probleme de qualité de données, voir de sécurité...
    En effet, si tu récupères des données , par exemple, d'un formulaire sur le net, définir une taille maximum pour les champs peut te permettre de déja filtrer certaines "mauvaises informations" ainsi que d'éviter de te rammasser un script de 2^31-1 bytes (la capacité max du varchar(max)) d'inject sql par exemple.

    De plus, définir des tailles maximum te permet en relisant le code d'avoir directement un apercu de ton modèle de données.

    Voila mon avis sur la chose, et vos avis m'interessent

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Salut Ptit_Dej,


    D'accord avec toi..

    Mais un avantage à utiliser les varchar(max) pourrait être que lorsque tu as besoin d'augmenter la taille d'un champ d'une table (ce qui arrive parfois), tu n'ais pas à revenir sur tout ton code SQL dans tes procédures stockées et autres objets pour modifier les varchar(50) en varchar(100) par exemple..

    Ceci dit, les inject sql sont contrées par les requêtes paramétrées, et les saisies de string trop grands dans les formulaires web (normallement les textbox sont limitées à la saisie) sont tronquées dans la base de données au moment de l'insertion dans un champ limité (à moins que ça jette une erreur je sais plus)..

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    Je suis d'accord avec Ptit Dje, en terme de qualité des données, il est préférable de savoir précisement ce que l'on manipule. Ne serait ce que pour savoir qu'en sortie de procédure stockée, on sort 50 caractères et que l'on recevra 50 caractères maximums dans C#. Si tu utilises du VARCHAR(Max), tu ne sais plus si il s'agit d'un BLOB en sortie ou d'une variable de taille raisonnable... Le traitement d'un BLOB peut exiger un traitement à part.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 982
    Points
    52 982
    Billets dans le blog
    6
    Par défaut
    J'ai pris l'habitude d'utiliser varchar(max) partout dans mes procédures stockées..
    En principe pas de réel impact sur les performances dans le cas de paramètres de fonctions UDF.

    En revanche risque élevé d'attaque par injection de SQL. Par exemple si vous devez utiliser du SQL dynamique et que vous avez prévu de passer en argument le nom d'une table, il vaudrait mieux utiliser du NVARCHAR(128). EN effet en utilisant du VARCHAR(max) cela permet à un utilisateur mal intentionné de compléter sa saisie par une requête destructive du genre : "exec sp_renamedb 'msdb', '.'"

    A +

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Bonjour à tous,
    bonjour SqlPro

    merci pour vos conseils. Je vais désormais utiliser moins souvent les varchar(max) lorsqu'il y a des risques d'injection sql, ou réfléchir aux autres raisons évoquées

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

Discussions similaires

  1. DS 8.5 - Utiliser des champs VARCHAR(MAX)
    Par smuller dans le forum DataStage
    Réponses: 1
    Dernier message: 16/04/2015, 10h51
  2. [Oracle 9i][Débutant] Utilisation de MAX avec autres champs
    Par Requin15 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/06/2006, 11h58
  3. [Oracle9] utilisation de max
    Par moicwill dans le forum Oracle
    Réponses: 10
    Dernier message: 08/03/2006, 11h12
  4. [Think Pascal] Utilisable sous Max OS X ?
    Par clavius dans le forum Autres IDE
    Réponses: 1
    Dernier message: 13/01/2006, 22h26
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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