2009-02-27 12 views
39

Est-il plus efficace d'utiliser un champ varchar dimensionné comme une puissance de deux par rapport à un autre nombre? Je pense que non, parce que pour SQL Server la valeur par défaut est 50.varchar - Une puissance de deux est-elle plus efficace?

Cependant, j'ai entendu (mais je n'ai jamais confirmé) que les champs de dimensionnement comme une puissance de 2 est plus efficace parce qu'ils équivalent à des octets pairs, et des ordinateurs traiter en bits & octets. Donc, est-ce qu'un champ déclaré comme varchar(32) ou varchar(64) a un réel avantage par rapport à varchar(50)?

Répondre

38

No.

Dans d'autres utilisations, il y a des avantages à utiliser des structures avec une puissance de deux dimensions, la plupart du temps parce que vous pouvez adapter à une belle (puissance de deux) nombre de ceux-ci dans un autre mise sous tension structure de deux tailles. Mais cela ne s'applique pas à une Fieldize DB. La seule puissance de deux tailles liée à VARCHARs concerne le type exact de varchar (ou TEXT/BLOB dans certains dialectes SQL): s'il est inférieur à 256, il peut utiliser un seul octet pour indiquer la longueur. si elle est inférieure à 65536 (64 Ko), deux octets suffisent, trois octets fonctionnent jusqu'à 16777216 (16 Mo), quatre octets vont à 4294967296 (4 Go).

En outre, il peut être soutenu que VARCHAR(50) est tout aussi cher que VARCHAR(255), car les deux auront besoin de n + 1 octets de stockage.

Bien sûr, qui est avant de penser Unicode ...

21

J'ai toujours pensé que les gens choisissaient des puissances de deux pour les champs de varchar parce que nous sommes des geeks et c'est ce que nous faisons. Au moins, c'est ce que j'ai toujours fait.

0

Cela dépend de l'implémentation spécifique de la base de données, mais je ne m'y attendais pas. Il n'effectue généralement aucun calcul sur le nombre de caractères, donc il ne devrait pas affecter l'espace de performance.

3

Le seul avantage tangible que vous obtiendrez en utilisant certaines longueurs maximales est l'espace de stockage requis pour le VARCHAR. Une longueur maximale supérieure à 255 nécessiterait un octet supplémentaire pour stocker la longueur de la valeur dans chaque ligne (et 2 octets supplémentaires pour les longueurs de 256^2 ou plus, et ainsi de suite).

4

Pour SQL en général? Non. Pour une implémentation spécifique, peut-être. Ce qui est plus efficace n'est pas déterminé par une spécification (SQL n'est qu'une spécification), mais comment il est implémenté dans un certain SGBD.

+0

Un endroit possible pour que cela se produise serait dans le format en mémoire pour les lignes ... 2 longueurs^n devrait réduire la nécessité de décalages d'alignement. Habituellement, un petit effet, je soupçonne. – dmckee

+1

L'alignement de la mémoire se fait en multiples, pas en puissances. Sur une architecture alignée sur 32 bits, les meilleurs décalages d'octets sont par exemple 4 × n. – Juliano