(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 "pure SQL" (sans aucun script externe)
-
utilisez n'importe quel string_generator avec UTF8
-
benchmarks principaux:
2.1. INSÉRER
2.2. SÉLECTION comparer et compter
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 un test spécifique (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 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
.
À NOUVEAU MIS À JOUR 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 la moyenne, sur de nombreuses machines et de nombreux tests: tous les mêmes
(statistiquement inférieur à l'écart type).
Recommandation
-
Utilisez le type de données text
,
évitez les anciens varchar(x)
car parfois ce n'est pas un standard, par exemple dans les clauses CREATE FUNCTION
varchar(x)
≠varchar(y)
.
-
exprimez des limites (avec les mêmes performances de varchar
!) avec la clause CHECK
dans le CREATE TABLE
par exemple CHECK(char_length(x)<=10)
.
Avec une perte de performance négligeable lors de l'INSERTION/MISE À JOUR, vous pouvez également contrôler les plages et la structure des chaînes de caractères
par exemple CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')