Existe-t-il des désavantages de performance dans SQL pour joindre une table sur une valeur char (ou varchar), par opposition à dire joindre une valeur entière?jointures sur ints vs jointures sur chars (ou varchars)
Répondre
Il existe performances considérations liées à la taille de la colonne de jointure. Un entier a une largeur de 4 octets - donc toute valeur de caractère supérieure à 4 octets nécessite plus d'E/S disque, d'espace cache, etc. Évidemment, un char (5) n'affecterait pas beaucoup, mais un char (4000) serait extraordinairement inutile . Doublez les tailles de caractères si vous utilisez des types Unicode.
Habituellement, cette question survient dans le contexte des clés naturelles vs substituts. Dans cet argument, la taille du type de données n'est pas le seul facteur - car vous pouvez souvent éviter une jointure avec une clé naturelle (char).
Bien sûr, aucun des deux n'est susceptible d'être le goulot d'étranglement dans votre application - alors concevez en toute impunité (au moins dans ce domaine).
Non, il n'y en a pas (dans Oracle). Ce qui peut faire la différence est:
- Si les types de données dans votre condition de jointure sont différents (la conversion implicite peut avoir une pénalité de performance). Donc, joindre un char à un varchar peut être mauvais.
- Si un champ a un index et l'autre pas.
- Si les données d'une colonne sont beaucoup plus longues que dans l'autre colonne.
Non, tant que les types de données sont les mêmes entre les tables que vous vous adhérez devrait être bien
Un char ou varchar seront stockées en ASCII ou unicode en fonction de votre jeu de caractères. Un int sera stocké sous une forme emballée. Si vous prenez un nombre en forme int, il sera plus petit que le même nombre en forme de caractère (chaîne). Le stockage en tant que types numériques sera toujours plus performant que le stockage en tant que caractères.
La jointure sur un char ou un char var aura normalement un préfixe au lieu de se joindre à un int. Il y a deux facteurs que je suis au courant lorsque l'on compare les caractères:
- collation doit être pris en compte
- champs de type char ont plus de données à comparer *
* (chaque caractère est représenté par 8 bits, un 10 la valeur de carbonisation est donc 80 bits de long, par rapport à 32 bits pour un int)
* (ce qui est de 16 bits par caractère si l'on utilise NCHAR ou NVARCHAR)
Je savais que cette question susciterait votre intérêt :) –
Il dit cela parce que si je vois des jointures sur des champs de caractères, je souffle mon haut :) – MatBailie
Cela dépend du volume avant que vous puissiez dire que ce ne sera pas significatif. Lors du traitement de grandes quantités de données stockées dans un entrepôt, joindre des champs CHAR (64) est nettement moins efficace que de se joindre à des champs INT. – MatBailie
En réalité, ce char (64) contiendrait une partie de données de domaine unique (la clé naturelle). Souvent, vous pouvez éviter la jointure si vous avez déjà la clé naturelle - ce qui est encore mieux que l'int. Mais oui, si vous concevez un grand entrepôt de données, vous pouvez avoir votre propre opinion sur ces questions. –