ฉันจะเปรียบเทียบการสืบค้นข้อมูลของ PostgreSQL ได้อย่างไร


34

ฉันต้องการเปรียบเทียบแบบสอบถามที่มีฟังก์ชั่นที่ผู้ใช้กำหนดฉันได้เขียนสำหรับ PostgreSQL มีวิธีมาตรฐานในการใช้มาตรฐานดังกล่าวหรือไม่?

ฉันรู้ว่าเวลาสามารถเปิดได้ด้วย\timingที่พร้อมต์ psql แต่ในอุดมคติฉันต้องการมีสคริปต์ที่ดูแลทุกอย่างโดยอัตโนมัติ: การเรียกใช้แบบสอบถามสองสามครั้งล้างแคช PostgreSQL หลังจากการเรียกใช้แต่ละครั้ง (อาจเป็นการรีสตาร์ท PostgreSQL บริการ) และการส่งออกเวลาทำงานเฉลี่ย (และหน่วยความจำที่ใช้เป็นบวก)


3
ตรวจสอบpgbench; คุณสามารถรันด้วยสคริปต์ที่กำหนดเองเพื่อทำสิ่งที่คุณต้องการ ด้วยสคริปต์ตัวแรปเปอร์เชลล์เพื่อหยุดและรีสตาร์ท Pg และปล่อยแคชดิสก์ของ OS คุณมีสิ่งที่คุณต้องการเป็นส่วนใหญ่
Craig Ringer

ค่อนข้างไม่ซ้ำกันของdba.stackexchange.com/questions/3148/...
Jon of All Trades

คำตอบ:


29

เครื่องมือที่ใช้กันอย่างแพร่หลายคือคำสั่ง SQL EXPLAIN ANALYZEอาจมีตัวเลือกเพิ่มเติมสำหรับรายละเอียดเพิ่มเติมในคำตอบ นั่นจะแสดงผลแผนแบบสอบถามด้วยการประมาณการของผู้วางแผนรวมถึงเวลาดำเนินการจริง

ทำไมคุณต้องการล้างแคช กรณีการใช้โดยทั่วไปที่มีแนวโน้มมากกว่าคือมีการเติมแคช ถ้าคุณยังต้องการที่จะไปเส้นทางที่นี่เป็นคำตอบที่เกี่ยวข้องในดังนั้น

หากไม่รีเซ็ตแคชต่อไปนี้เป็นวิธีง่ายๆสองวิธีในการทดสอบด้วยการทำซ้ำหลาย ๆ

UDF ง่าย ๆ

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

หรือด้วยการสุ่มอินพุต - ตัวเลขสุ่มระหว่าง 0 ถึง 5,000 ในตัวอย่าง:

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

หรือด้วยตารางชีวิตจริง:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

ฟังก์ชัน / คิวรีที่ซับซ้อนมากขึ้น

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

โทร:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

ระวัง : มีการดำเนินการค้นหาจริง ๆ !
ระวัง : ไม่เหมาะสำหรับการใช้งานสาธารณะ การฉีด SQL ที่เป็นไปได้

อีกครั้งคุณสามารถใช้พารามิเตอร์สุ่มหากจำเป็น อาจเป็นไปได้กับประโยคUSINGEXECUTE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.