วิธีเพิ่มความเร็วการสืบค้นสำหรับฐานข้อมูลแรสเตอร์?


16

ฉันมีฐานข้อมูลแรสเตอร์ใน postgresql / postgis ด้วยคอลัมน์เหล่านี้:

(ID, Rast, data_of_data)

'rast'คือคอลัมน์ที่มีไฟล์แรสเตอร์ในรูปแบบ WKT ตัวอย่างแบบสอบถามเพื่อค้นหาค่า DN ของจุดในระบบ WGS84 (30.424, -1.66) และสำหรับ 2002-01-09 มีดังต่อไปนี้:

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

มีวิธี (เช่นดัชนีเชิงพื้นที่) เพื่อเพิ่มความเร็วของคำค้นหาเหล่านั้นหรือไม่


บางทีคุณสามารถช่วยเราออกมาได้โดยการให้รายละเอียดเพิ่มเติม: มีบันทึกจำนวนเท่าไหร่ใน my_table? ข้อมูลในคอลัมน์แรสเตอร์มีขนาดใหญ่เพียงใด คุณมีวันที่แตกต่างกันเท่าใดใน date_of_data
dwurf

เพิ่มในสิ่งนี้: SRID ของคอลัมน์ rast คืออะไร
dwurf

คำตอบ:


12

นี่เป็นคำถามที่น่าตื่นเต้น! แรสเตอร์ที่คุณต้องการสืบค้นนั้นใหญ่แค่ไหน? WKTRaster จะถูกเก็บไว้ในฐานข้อมูลเป็นหยด เพื่อหาค่าที่จุดเฉพาะจากรู้จัก (x_0, y_0) มุมพิกัดดัชนี / คอลัมน์แถว (i, j) คำนวณโดยใช้ขั้นตอน (dx, dy) และการหมุน ด้วย (i, j) ที่รู้จักกันฟังก์ชัน ST_Value () สามารถเข้าถึงข้อมูลจริงที่ออฟเซ็ตไบต์ที่ถูกต้อง

ซึ่งหมายความว่าฐานข้อมูลต้องอ่านโดยเฉลี่ยอย่างน้อยครึ่งหนึ่งของหยดข้อมูลเมื่อตอบแบบสอบถามสำหรับจุด (ขึ้นอยู่กับการใช้งานจริงอาจอ่านข้อมูลทั้งหมดตลอดเวลา) ฉันจึงเดาว่าประสิทธิภาพของ WKTRaster จะทนทุกข์เมื่อ BLOB ข้อมูลมีขนาดใหญ่เกินไป การเรียงชุดข้อมูลควรเพิ่มความเร็วในการสืบค้น ดูวิธีจัดการข้อมูล SRTM (มีขนาด 6,000x6000 พิกเซล) ในบทช่วยสอนนี้ จริงๆแล้วพวกเขาเรียงข้อมูลเป็นพิกเซลขนาดเล็ก 50x50 ซึ่งเป็นคำใบ้ที่ชัดเจนว่าการคาดเดาของฉันอาจไม่ไกลจากความจริง

การจัดทำดัชนีข้อมูลเชิงภาพแรสเตอร์อาจเป็นเพียงแค่การทำดัชนีกล่องขอบเขตซึ่งไม่มีความช่วยเหลือที่แท้จริงสำหรับปัญหาของคุณ


1
สิ่งที่เรียงกันเป็นวิธีที่จะไป - ดูลิงค์นี้ คุณจะต้องเพิ่มดัชนีเช่นนี้: CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));(ที่มา )
dwurf

4

สองด้านที่ฉันพบเร่งการคำนวณแรสเตอร์ PostGIS ของฉันคือการใช้ค่าจำนวนเต็มในแรสเตอร์และการใช้แรสเตอร์แบบหลายวงถ้าเป็นไปได้ ในกรณีนี้ค่า DN สามารถจัดเก็บเป็นจำนวนเต็มได้หรือไม่ถ้ายังไม่เสร็จ?

ความคิดอื่น ๆ (และฉันไม่แน่ใจว่ามีความเกี่ยวข้องที่นี่) คือการใช้แรสเตอร์หลายวง ตัวอย่างเช่นหากคุณกำลังดูข้อมูลรายเดือนแต่ละเดือนอาจเป็นเลเยอร์แรสเตอร์ จากนั้นคุณสามารถดึงค่าหลาย ๆ ค่าของจุดในช่วงเวลาที่แตกต่างกันโดยการสอบถามแรสเตอร์แบบเลเยอร์ ฉันพบว่าวิธีนี้เร็วกว่าการสืบค้น rasters แยกต่างหาก

ในที่สุดเมื่อคุณโหลดข้อมูลของคุณมี-tธงTILE_SIZE คุณสามารถสำรวจว่าขนาดไทล์ที่คุณใช้นั้นทำงานได้ดีสำหรับการค้นหาของคุณหรือไม่


rasters Multiband มีแนวโน้มว่าจะช่วยถ้าคุณต้องการสอบถามค่าพิกเซลเดียวกันเป็นเวลาหลายเดือนในเวลาเดียวกัน (เพื่อยึดกับตัวอย่างของคุณ) เช่นเพื่อวิเคราะห์อนุกรมเวลา แบบสอบถามในคำถามจะดึงวันที่ที่ระบุเพียงวันเดียวเท่านั้น หากวันที่นั้นอยู่ในวงดนตรีหนึ่ง DBMS จะต้องอ่านทุกวงอื่น ๆ เช่นกันแม้ว่าพวกเขาจะไม่สนใจที่จะตอบแบบสอบถาม ซึ่งอาจลดประสิทธิภาพลง
bhell

ฉันเห็นด้วย - บางทีฉันไม่ได้เน้นว่ามันจะมีประโยชน์ก็ต่อเมื่อจำเป็นต้องใช้หลายค่าพร้อมกัน; ฉันจะอธิบายเรื่องนี้
djq

3

ขึ้นอยู่กับการกระจายของข้อมูลของคุณคุณอาจได้รับ speedups ที่ดีมากเพียงแค่สร้างดัชนีdate_of_dataคอลัมน์

คุณสามารถใช้ไวยากรณ์อธิบายเพื่อวิเคราะห์ว่าดัชนีของคุณกำลังถูกใช้หรือไม่


ดัชนีชนิดใด คุณจะเจาะจงมากขึ้นได้ไหม?
f.ashouri

เพียงดัชนี btree มาตรฐาน: create index tbl_name_date_idx on tbl_name (date_of_data). หากคุณมีวันที่แตกต่างกันมากสิ่งนี้จะลดจำนวนข้อมูลที่ PostGIS ต้องดำเนินการอย่างมาก
dwurf

ขอบคุณ แต่มันใช้ไม่ได้กับคำค้นหาของฉัน
f.ashouri

มันไม่ทำงานอย่างไร ไม่มีประสิทธิภาพที่เพิ่มขึ้นหรือปัญหาอื่น ๆ ? หากคุณมีคอลัมน์ตารางที่ปรากฏเป็นประจำในWHEREข้อคุณควรพิจารณาสร้างดัชนี มันจะไม่เพียง แต่ช่วยในกรณีนี้ถ้าคุณมีวันที่แตกต่างกันมากมาย (เช่นโดเมนที่มีค่ามาก) แต่ถ้าคุณมีบันทึกจำนวนมากในตาราง
bhell

แบบสอบถามใช้ดัชนีหรือไม่ คุณสามารถ Pastebin เอาท์พุทของexplain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
dwurf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.