AKTUALIZACJA PORÓWNAWCZYCH NA 2016 R. (str.5.5 +)
I przy użyciu testów porównawczych „czystego SQL” (bez zewnętrznego skryptu)
użyj dowolnego string_generatora z UTF8
główne punkty odniesienia:
2.1 WSTAWIĆ
2.2 WYBIERZ porównywanie i liczenie
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;
Przygotuj konkretny test (przykłady)
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) );
Wykonaj podstawowy test:
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
I inne testy,
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;
... i użyj EXPLAIN ANALYZE
.
AKTUALIZACJA PONOWNIE 2018 (str.10)
mała edycja, aby dodać wyniki z 2018 roku i wzmocnić rekomendacje.
Wyniki w 2016 i 2018 r
Moje wyniki, po uśrednieniu, na wielu maszynach i wielu testach: wszystkie takie same
(statystycznie mniejsze odchylenie standardowe).
Rekomendacje
Użyj text
typu danych,
unikaj starych, varchar(x)
ponieważ czasami nie jest to standard, np. W CREATE FUNCTION
klauzulach varchar(x)
≠varchar(y)
.
wyraźne limity (z tą samą varchar
wydajnością!) za pomocą CHECK
klauzuli CREATE TABLE
np CHECK(char_length(x)<=10)
.
Przy nieznacznej utracie wydajności w INSERT / UPDATE można także kontrolować zakresy i strukturę łańcuchów,
npCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')