CẬP NHẬT LỢI ÍCH NĂM 2016 (pg9.5 +)
Và sử dụng điểm chuẩn "SQL thuần túy" (không có bất kỳ tập lệnh bên ngoài nào)
sử dụng bất kỳ chuỗi_generator nào với UTF8
điểm chuẩn chính:
2.1. CHÈN
2.2. CHỌN so sánh và đếm
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;
Chuẩn bị kiểm tra cụ thể (ví dụ)
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) );
Thực hiện một bài kiểm tra cơ bản:
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
Và các xét nghiệm khác,
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;
... Và sử dụng EXPLAIN ANALYZE
.
CẬP NHẬT LẠI NĂM 2018 (trg10)
chỉnh sửa nhỏ để thêm kết quả của năm 2018 và củng cố các khuyến nghị.
Kết quả năm 2016 và 2018
Kết quả của tôi, sau trung bình, trong nhiều máy và nhiều thử nghiệm: tất cả đều giống nhau
(độ lệch chuẩn tham chiếu ít hơn về mặt thống kê).
sự giới thiệu
Sử dụng text
kiểu dữ liệu,
tránh cũ varchar(x)
bởi vì đôi khi nó không phải là một tiêu chuẩn, ví dụ như trong CREATE FUNCTION
điều khoản varchar(x)
≠varchar(y)
.
thể hiện giới hạn (có cùng varchar
hiệu suất!) bằng CHECK
mệnh đề trong CREATE TABLE
ví dụ CHECK(char_length(x)<=10)
.
Với hiệu suất giảm không đáng kể trong CHERTN / CẬP NHẬT, bạn cũng có thể kiểm soát phạm vi và cấu trúc chuỗi,
vdCHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')