MISE À JOUR DES RÉFÉRENCES POUR 2016 (pg9.5 +)
Et en utilisant des benchmarks "SQL pur" (sans aucun script externe)
utiliser n'importe quel string_generator avec UTF8
repères principaux:
2.1. INSÉRER
2.2. SELECT comparant et comptant
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éparer 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 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
.
À JOUR 2018 (p. 10)
petite modification 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: tout de même
(écart type statistiquement inférieur).
Recommandation
Utilisez le text
type de données,
évitez l'ancien varchar(x)
car parfois ce n'est pas un standard, par exemple dans les CREATE FUNCTION
clauses varchar(x)
≠varchar(y)
.
exprimer les limites (avec les mêmes varchar
performances!) par la CHECK
clause with dans le CREATE TABLE
eg CHECK(char_length(x)<=10)
.
Avec une perte de performances négligeable dans INSERT / UPDATE, vous pouvez également contrôler les plages et la structure des chaînes,
par exempleCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')