ОБНОВЛЕНИЕ ЭТАЛОНОВ НА 2016 ГОД (pg9.5 +)
И с помощью тестов «чистый SQL» (без какого-либо внешнего скрипта)
использовать любой string_generator с UTF8
Основные показатели:
2.1. ВСТАВИТЬ
2.2. ВЫБЕРИТЕ сравнение и подсчет
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;
Подготовить конкретный тест (примеры)
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) );
Выполните базовый тест:
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
И другие тесты,
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;
... и пользуйся EXPLAIN ANALYZE
.
ОБНОВЛЕНИЕ СНОВА 2018 (pg10)
немного изменить, чтобы добавить результаты 2018 года и подкрепить рекомендации.
Результаты в 2016 и 2018 годах
Мои результаты, в среднем, во многих машинах и во многих тестах: все одинаковые
(статистически меньше стандартного отклонения).
Рекомендация
Используйте text
тип данных,
избегайте старых, varchar(x)
потому что иногда это не стандарт, например, в CREATE FUNCTION
пунктах varchar(x)
≠varchar(y)
.
выразить ограничения (с той же varchar
производительностью!) с помощью CHECK
пункта в, CREATE TABLE
например CHECK(char_length(x)<=10)
.
С незначительной потерей производительности в INSERT / UPDATE вы также можете управлять диапазонами и структурой строк,
напримерCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')