การอัพเดท BENCHMARKS สำหรับปี 2559 (pg9.5 +)
และใช้การเปรียบเทียบ "pure SQL" (ไม่มีสคริปต์ภายนอก)
ใช้ string_generator ใด ๆ กับ UTF8
มาตรฐานหลัก:
2.1 INSERT
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 และเสริมคำแนะนำ
ผลลัพธ์ในปี 2559 และ 2561
ผลลัพธ์ของฉันโดยเฉลี่ยแล้วในเครื่องหลายเครื่องและการทดสอบหลายอย่าง: เหมือนกันทั้งหมด
(ค่าเบี่ยงเบนมาตรฐานต่ำกว่าจริง)
คำแนะนำ
ใช้text
ประเภทข้อมูล,
หลีกเลี่ยงเก่าvarchar(x)
เพราะบางครั้งมันไม่ได้มาตรฐานเช่นใน CREATE FUNCTION
ข้อ ≠varchar(x)
varchar(y)
แสดงขีด จำกัด (แบบเดียวกับvarchar
ผลการปฏิบัติงาน) โดยมีCHECK
ข้อในเช่นCREATE TABLE
ด้วยการสูญเสียประสิทธิภาพเล็กน้อยใน INSERT / UPDATE คุณสามารถควบคุมช่วงและโครงสร้างสตริง เช่นCHECK(char_length(x)<=10)
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')