ОНОВЛЕННЯ БЕНХАРКІВ НА 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 (стор. 10)
трохи редагувати, щоб додати результати 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%')