ATUALIZAÇÃO DE BENCHMARKS PARA 2016 (pág. 9.5 +)
E usando benchmarks "puro SQL" (sem nenhum script externo)
use qualquer string_generator com UTF8
principais benchmarks:
2.1 INSERIR
2.2 SELECIONAR comparando e 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 teste específico (exemplos)
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) );
Execute um teste básico:
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
E outros testes,
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;
... E use EXPLAIN ANALYZE
.
ATUALIZADO NOVAMENTE 2018 (página 10)
pouca edição para adicionar os resultados de 2018 e reforçar as recomendações.
Resultados em 2016 e 2018
Meus resultados, depois da média, em muitas máquinas e muitos testes: todos iguais
(estatisticamente menos do que o desvio padrão).
Recomendação
Use o text
tipo de dados,
evite o antigo, varchar(x)
porque às vezes não é um padrão, por exemplo, nas CREATE FUNCTION
cláusulas varchar(x)
≠varchar(y)
.
expressar limites (com o mesmo varchar
desempenho!) por com CHECK
cláusula no CREATE TABLE
eg CHECK(char_length(x)<=10)
.
Com uma perda insignificante de desempenho em INSERT / UPDATE, você também pode controlar intervalos e estrutura de cadeias,
por exemploCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')