2015-08-13 1 views
1

J'ai quelques tables (Table A et Table B) avec une spécification BIGINT avec IDENTITY comme clé primaire. Dans ces tableaux, j'ai 2 colonnes VARBINARY (MAX). Les mises à jour et les suppressions sont très rares.PK Fragmentation d'index sur les colonnes IDENTITY avec colonne VARBINARY (MAX) dans le tableau

Ils ont presque le même nombre de lignes, le tableau B un peu moins mais ont plus de données significatives dans les colonnes VARBINARY (MAX). J'ai été surpris de voir que le stockage utilisé par PK dans le tableau B était beaucoup plus élevé que le stockage utilisé par PK dans le tableau A. Faire un peu de lecture, corrigez-moi si je me trompe, sur le sujet clarifié c'est a quelque chose à faire avec la taille maximale de la ligne autour de 8k. Il y a donc une pagination avec une référence d'octet qui est ensuite incluse dans l'index. D'où le plus grand stockage utilisé par PK dans le tableau B. Il représente environ 30% de la taille totale de la base de données. Je pensais que seul le BIGINT faisait partie de l'index.

Ma question est de savoir s'il existe une solution de rechange pour cela? Des conceptions, des techniques ou des hacks qui peuvent empêcher cela?

salutations

Vilma

Répondre

0

A PK est un index cluster: les données sont stockées avec la clé. Vous ne pouvez avoir qu'un seul index cluster par table, car les données ne peuvent être stockées qu'au même endroit. Ainsi, tout index clusterisé (tel qu'un PK) occupera plus d'espace qu'un index non clusterisé.

S'il y a plus de table varbinary dans B, alors je m'attendrais à ce que le PK prenne plus d'espace.

Cependant, étant donné que ce varbinary est (MAX), la pensée initiale est que seul le pointeur de données doit être stocké avec la clé. Toutefois, si la ligne est suffisamment petite (c'est-à-dire < 8000 octets), j'imagine que SQL Server optimise le stockage/récupération en conservant les données avec la clé, augmentant ainsi la taille de l'index. Je ne sais pas si cela arrive, mais je n'ai rien trouvé pour le dire; comme une optimisation est raisonnable.

Prenez cela pour ce que ça vaut!

+0

Je vois. Donc, l'hypothèse est que les données VARBINARY (MAX) dans ce cas sont intégrées dans l'index cluster PK. Est-ce que c'est redondant alors? Mening qu'il est stocké dans la colonne aussi? – Vilma

+0

Ma spéculation était que dans certaines circonstances (quand le varbinary est assez court) il serait stocké avec l'index, oui; quand il devient assez long pour que cela soit impossible alors il est shunté à l'endroit où de grandes choses sont stockées et remplacées dans l'index avec un pointeur vers le stockage de grandes affaires. –