(cette réponse est un Wiki, vous pouvez modifier - veuillez corriger et améliorer!)
MISE À JOUR DES BENCHMARKS POUR 2016 (pg9.5+)
Et en utilisant des benchmarks "SQL pur" (sans aucun script externe)
-
utilisez n'importe quel générateur de chaînes avec UTF8
-
benchmarks principaux:
2.1. INSERT
2.2. SELECT comparaison et décompte
CREATE FUNCTION string_generator(int DEFAULT 20,int DEFAULT 10) RETURNS text AS $f$
SELECT array_to_string( array_agg(
substring(md5(random()::text),1,$1)||chr( 9824 + (random()*10)::int )
), ' ' ) as s
FROM generate_series(1, $2) i(x);
$f$ LANGUAGE SQL IMMUTABLE;
Préparez des tests spécifiques (exemples)
DROP TABLE IF EXISTS test;
-- CREATE TABLE test ( f varchar(500));
-- CREATE TABLE test ( f text);
CREATE TABLE test ( f text CHECK(char_length(f)<=500) );
Effectuez un test de base :
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
Et d'autres tests,
CREATE INDEX q on test (f);
SELECT count(*) FROM (
SELECT substring(f,1,1) || f FROM test WHERE f<'a0' ORDER BY 1 LIMIT 80000
) t;
... Et utilisez EXPLAIN ANALYZE
.
MISE À JOUR ENCORE EN 2018 (pg10)
petite édition pour ajouter les résultats de 2018 et renforcer les recommandations.
Résultats en 2016 et 2018
Mes résultats, après moyenne, sur de nombreuses machines et de nombreux tests : tous identiques
(statistiquement inférieur à l'écart-type).
Recommandation
-
Utilisez le type de données text
,
évitez le vieux varchar(x)
car parfois ce n'est pas une norme, par exemple dans les clauses CREATE FUNCTION
varchar(x)
≠varchar(y)
.
-
exprimez des limites (avec les mêmes performances que varchar
!) avec une clause CHECK
dans le CREATE TABLE
par exemple CHECK(char_length(x)<=10)
.
Avec une perte de performance négligeable dans INSERT/UPDATE vous pouvez également contrôler les plages et la structure de la chaîne
par exemple CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')