ACTUALIZACIÓN DE BANCOS PARA 2016 (pg9.5 +)
Y utilizando puntos de referencia "SQL puro" (sin ningún script externo)
use cualquier string_generator con UTF8
principales puntos de referencia:
2.1. INSERTAR
2.2. SELECCIONE comparando y contando
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;
Preparar prueba específica (ejemplos)
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) );
Realizar una prueba básica:
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
Y otras pruebas,
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;
... y uso EXPLAIN ANALYZE
.
ACTUALIZADO DE NUEVO 2018 (pg10)
pequeña edición para agregar los resultados de 2018 y reforzar las recomendaciones.
Resultados en 2016 y 2018
Mis resultados, después de la media, en muchas máquinas y muchas pruebas: todo lo mismo
(estadísticamente menos desviación estándar que el estándar).
Recomendación
Utilice el text
tipo de datos,
evite los antiguos varchar(x)
porque a veces no es un estándar, por ejemplo, en las CREATE FUNCTION
cláusulas varchar(x)
≠varchar(y)
.
límites expresos (¡con el mismo varchar
rendimiento!) con CHECK
cláusula en el CREATE TABLE
ej CHECK(char_length(x)<=10)
.
Con una pérdida insignificante de rendimiento en INSERT / UPDATE, también puede controlar los rangos y la estructura de la cadena,
por ejemploCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')