ST_D ภายในของฉันเร็วกว่าการทดสอบ ST_Intersects เป็นเรื่องที่น่าประหลาดใจโดยเฉพาะอย่างยิ่งเนื่องจากอัลกอริธึมเรขาคณิตที่เตรียมไว้นั้นควรที่จะเตะในกรณีเช่นนี้ ฉันคิดว่ามีโอกาสที่จะเร็วกว่าที่ฉันแสดงที่นี่
ฉันทำการทดสอบเพิ่มเติมและสองสิ่งเกือบจะเพิ่มความเร็วเป็นสองเท่า ครั้งแรกฉันลองใช้คอมพิวเตอร์รุ่นใหม่กว่า แต่ก็ยังเป็นแล็ปท็อปธรรมดาค่อนข้างอาจยกเว้นจาก SATA3 ssd -disks
จากนั้นแบบสอบถามด้านล่างใช้เวลา 18 วินาทีแทนที่จะเป็น 62 วินาทีบนแล็ปท็อปเก่า ต่อไปฉันพบว่าฉันผิดทั้งหมดก่อนเมื่อฉันเขียนว่าดัชนีในตารางจุดไม่จำเป็น เมื่อดัชนีนั้นเข้าแทนที่ ST_Intersects ก็จะทำงานตามที่คาดไว้และสิ่งต่าง ๆ ก็เริ่มเร็วมาก ฉันเพิ่มจำนวนคะแนนในตารางคะแนนเป็น 1 ล้านคะแนนและข้อความค้นหา:
CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id
FROM imported_ct , t WHERE ST_Intersects(imported_ct.geom , t.geom);
ทำงานใน 72 วินาที เนื่องจากมีรูปหลายเหลี่ยม 1249 การทดสอบ 1249000000 จึงเสร็จใน 72 วินาที นั่นทำให้มีการทดสอบประมาณ 17000000 ครั้งต่อวินาที หรือทดสอบเกือบ 14,000 คะแนนจากรูปหลายเหลี่ยมต่อวินาที
จากการทดสอบ 400000000 คะแนนของคุณในการทดสอบควรใช้เวลาประมาณ 8 ชั่วโมงโดยไม่มีปัญหากับการกระจายโหลดไปยังหลายแกน PostGIS ไม่เคยหยุดสร้างความประทับใจให้ฉัน :-)
ขั้นแรกเพื่อให้เห็นภาพผลลัพธ์คุณสามารถเพิ่มรูปทรงเรขาคณิตของจุดลงในตารางผลลัพธ์เปิดมันใน QGIS เช่นและจัดรูปแบบด้วยค่าที่ไม่ซ้ำกันในฟิลด์ import_ct
ประการที่สองใช่คุณสามารถรับคะแนนที่อยู่นอกรูปหลายเหลี่ยมโดยใช้การเข้าร่วมที่ถูกต้อง (หรือซ้าย) ดังนี้
CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id
FROM imported_ct right join t ON ST_Intersects(imported_ct.the_geom , t.geom);
ฉันทำการทดสอบบางอย่างเพื่อตรวจสอบว่าเป็นไปได้หรือไม่ว่า PostGIS
สิ่งแรกที่ฉันไม่เข้าใจ คุณมีสองคะแนนต่อแถว จุดทั้งสองอยู่ในรูปหลายเหลี่ยมเดียวกันเสมอหรือไม่ จากนั้นก็เพียงพอที่จะทำการคำนวณในจุดใดจุดหนึ่ง หากพวกเขาสามารถอยู่ในรูปหลายเหลี่ยมที่แตกต่างกันสองคุณจะต้องมีวิธีการเชื่อมต่อแถวจุดหนึ่งไปยังสองรูปหลายเหลี่ยม
ดูเหมือนว่าจะเป็นไปได้จากการทดสอบ แต่คุณอาจต้องการโซลูชันที่สร้างสรรค์เพื่อกระจายโหลดมากกว่าหนึ่ง cpu-core
ฉันทดสอบแล็ปท็อปอายุ 4 ปีกับซีพียู dual core centrino (ประมาณ 2.2GHz ฉันคิดว่า) 2GB RAM หากคุณมี RAM 48 BG ฉันคิดว่าคุณมีซีพียูมากขึ้นเช่นกัน
สิ่งที่ฉันทำคือการสร้างตารางจุดสุ่มด้วยคะแนน 100,000 คะแนนเช่นนี้:
CREATE TABLE t AS
WITH r AS
(SELECT ST_Extent(the_geom)::geometry ext FROM imported_ct)
SELECT ST_Point(x,y) AS geom FROM
(SELECT GENERATE_SERIES(1,100000)) s,
(SELECT ST_Xmin(ext)+(random()*(ST_Xmax(ext)-ST_Xmin(ext))) x, ST_Ymin(ext)+(random()*(ST_Ymax(ext)-ST_Ymin(ext))) y FROM r
) f;
จากนั้นเพิ่ม gid เช่น:
ALTER TABLE t ADD COLUMN GID SERIAL;
จากนั้นเรียกใช้:
CREATE TABLE points_ct AS
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE ST_Dwithin(imported_ct.the_geom , t.geom,0);
ใช้เวลาประมาณ 62 วินาที (เปรียบเทียบกับผลลัพธ์ ArcGIS ของคุณด้วยจำนวนคะแนนเท่ากัน) ผลลัพธ์คือตารางที่เชื่อมต่อจุดต่าง ๆ ในตารางของฉันกับ gid ในตารางที่มีการสำรวจสำมะโนประชากร
ด้วยความเร็วนั้นคุณจะทำคะแนน 200 mill ได้ในเวลาประมาณ 34 ชั่วโมง ดังนั้นถ้ามันเพียงพอกับการตรวจสอบจุดใดจุดหนึ่งแลปท็อปเครื่องเก่าของฉันสามารถทำได้ด้วยหนึ่งแกน
แต่ถ้าคุณต้องตรวจสอบทั้งสองประเด็นมันอาจจะยากกว่านี้
จากนั้นคุณสามารถกระจายโหลดไปยังมากกว่าหนึ่งคอร์ด้วยตนเองโดยเริ่มต้นเซสชันจำนวนมากกับฐานข้อมูลและเรียกใช้คิวรีที่แตกต่างกัน
ในตัวอย่างของฉันมี 50,000 คะแนนและสอง cpu-cores ฉันพยายาม:
CREATE TABLE t1 as
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE t.gid >50000 and ST_Dwithin(imported_ct.the_geom , t.geom,0);
ในหนึ่ง db-session ในเวลาเดียวกันกับที่ทำงาน:
CREATE TABLE t2 as
SELECT imported_ct.gid as ct_gid, t.gid as point_id FROM imported_ct , t WHERE t.gid <=50000 and ST_Dwithin(imported_ct.the_geom , t.geom,0);
ในอีก db- เซสชั่น
ใช้เวลาประมาณ 36 วินาทีดังนั้นจึงช้ากว่าตัวอย่างแรกเล็กน้อยขึ้นอยู่กับการเขียนแผ่นดิสก์ในเวลาเดียวกัน แต่เนื่องจากแกนแกนสองบิตทำงานในเวลาเดียวกันจึงใช้เวลาไม่เกิน 36 วินาทีในเวลาของฉัน
หากต้องการรวมตาราง t1 และ t2 ลอง:
CREATE TABLE t3 AS
SELECT * FROM t1
UNION ALL
SELECT * FROM t2;
ใช้ประมาณครึ่งวินาที
ดังนั้นด้วยฮาร์ดแวร์ที่สดใหม่และกระจายโหลดไปยังหลายคอร์สิ่งนี้น่าจะเป็นไปได้แม้ว่าโลกแห่งความจริงจะช้ากว่ากรณีทดสอบ
อาจจะน่าสังเกตว่าตัวอย่างนี้มาจาก Linux (Ubuntu) การใช้ Windows จะเป็นอีกเรื่องหนึ่ง แต่ฉันมีแอปพลิเคชั่นรายวันอื่น ๆ ทั้งหมดที่ใช้งานอยู่ดังนั้นแล็ปท็อปจึงค่อนข้างโหลดอย่างหนักจากเมื่อก่อน ดังนั้นที่อาจจำลองกรณี windows ค่อนข้างดีโดยไม่ต้องเปิดอะไรนอกจาก pgadmin