Données de dépassement de ligne de plus de 8 Ko

Une table peut contenir au maximum 8 060 octets par ligne. Dans SQL Server 2008, cette restriction est assouplie pour les tables qui contiennent des colonnes de type varchar, nvarchar, varbinary, sql_variant ou des colonnes CLR de type défini par l'utilisateur. La longueur de chacune de ces colonnes ne doit cependant pas dépasser la limite de 8 000 octets ; néanmoins, la combinaison de leurs largeurs peut dépasser la limite de 8 060 octets. Cela concerne la création et la modification des colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l'utilisateur, ainsi que la mise à jour et l'insertion des données.

[!REMARQUE]

Cette restriction ne concerne pas les colonnes varchar(max), nvarchar(max), varbinary(max), ntext, text, image ou xml. Pour plus d'informations sur le stockage de ces colonnes, consultez Utilisation de types de données de valeur élevée, Utilisation des données de type text et image et Utilisation de données XML.

Observations relatives au dépassement de ligne

Lorsque vous combinez des colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l'utilisateur qui dépassent 8 060 octets par ligne, tenez compte des points suivants :

  • Le dépassement de la limite de 8 060 octets par ligne peut affecter les performances car le SQL Server maintient toujours une limite de 8 Ko par page. Lorsqu'une combinaison de colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l'utilisateur dépasse cette limite, le Moteur de base de données SQL Server déplace la colonne d'enregistrements la plus large vers une autre page dans l'unité d'allocation ROW_OVERFLOW_DATA, tout en maintenant un pointeur de 24 octets sur la page initiale. Les enregistrements volumineux sont automatiquement déplacés vers une autre page dès lors que les enregistrements s'allongent suite à une opération de mise à jour. Les opérations de mise à jour qui raccourcissent les enregistrements peuvent provoquer le rapatriement d'enregistrements vers la page initiale dans l'unité d'allocation IN_ROW_DATA. En outre, l'interrogation et autres opérations de sélection, telles que les tris ou les jointures portant sur des enregistrements volumineux qui contiennent des données de dépassement de ligne, ralentissent le temps de traitement car ces enregistrements sont traités de façon synchrone et non de manière asynchrone.

    Par conséquent, lorsque vous concevez une table comportant plusieurs colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l'utilisateur, évaluez le pourcentage de lignes susceptibles de dépasser et la fréquence à laquelle ces données de dépassement sont susceptibles d'être interrogées. S'il est probable qu'il y ait de fréquentes requêtes sur de nombreuses lignes de données de dépassement de ligne, pensez à normaliser la table de manière à ce que certaines colonnes soient déplacées vers une autre table. Celle-ci peut ensuite être interrogée lors d'une opération JOIN asynchrone.

  • La longueur des différentes colonnes ne doit pas dépasser la limite de 8 000 octets par colonne de type varchar, nvarchar, varbinary, sql_variant et CLR défini par l'utilisateur. Seule la combinaison de leurs longueurs peut dépasser la limite de 8 060 octets par ligne d'une table.

  • La somme des longueurs des colonnes d'autres types de données, notamment char et nchar, ne doit pas dépasser la limite de 8 060 octets par ligne. En outre, les données d'objet volumineux ne sont pas soumises à la limite de 8 060 octets par ligne.

  • La clé d'un index cluster ne peut pas contenir de colonnes varchar qui possèdent des données dans l'unité d'allocation ROW_OVERFLOW_DATA. Si un index cluster est créé sur une colonne varchar et que les données existantes se trouvent dans l'unité d'allocation IN_ROW_DATA, les actions d'insertion ou de mise à jour réalisées ultérieurement sur la colonne et susceptibles d'envoyer les données hors ligne sont vouées à l'échec. Pour plus d'informations sur les unités d'allocation, consultez Organisation des tables et des index.

  • Vous pouvez inclure des colonnes qui contiennent des données de dépassement de ligne en tant que colonnes clés ou non clés d'un index non-cluster.

  • La limite de taille d'enregistrement pour les tables qui utilisent des colonnes fragmentées est de 8 018 octets. Lorsque les données converties plus les données de l'enregistrement existantes dépassent 8 018 octets, MSSQLSERVER ERROR 576 est retourné. Lorsque les colonnes sont converties entre les types fragmenté et non fragmenté, Moteur de base de données garde une copie des données de l'enregistrement actif. Cela double temporairement le stockage requis pour l'enregistrement.

  • Pour obtenir des informations sur les tables ou les index pouvant contenir des données de dépassement de ligne, utilisez la fonction de gestion dynamique sys.dm_db_index_physical_stats.