เมื่อใดที่คุณไม่ควรใช้ดัชนีอวกาศ


29

ฉันถามสิ่งนี้เพราะฉันทำงานกับ Oracle เป็นหลัก แต่ในปีที่ผ่านมาฉันเพิ่ม PostGIS และ SQLServer 2008 เป็นสองเท่าหน้าที่การใช้งานเชิงพื้นที่ส่วนใหญ่ใน Oracle จะไม่ทำงานหากไม่มีดัชนีเชิงพื้นที่ส่งคืนข้อผิดพลาด ORA-13226:

13226, 00000, "อินเทอร์เฟซไม่รองรับหากไม่มีดัชนีเชิงพื้นที่" // * สาเหตุ: ตารางเรขาคณิตไม่มีดัชนีเชิงพื้นที่ // * การกระทำ: ตรวจสอบว่าตารางเรขาคณิตที่อ้างอิงในตัวดำเนินการเชิงพื้นที่มีดัชนีเชิงพื้นที่อยู่

สำหรับฉันแล้วนี่สมเหตุสมผล คุณเรียกใช้แบบสอบถามแบบปริภูมิ = คุณต้องมีดัชนีเชิงพื้นที่ แต่เท่าที่ฉันเข้าใจ PostGIS ไม่ใช่ SQL Serve ไม่ต้องการสิ่งนี้ PostGIS ดูเหมือนว่าจะมีฟังก์ชั่น (_ * เช่น _STContains) ที่ชัดเจนจะไม่ใช้ดัชนีเชิงพื้นที่

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


3
หากคุณต้องการดูว่าดัชนีทำอะไรช้าลงใน PostGIS SET enable_seqscan = off สิ่งนี้จะบังคับให้ PostgreSQL ใช้ดัชนีทุกครั้ง เปรียบเทียบความเร็วกับมัน
Sean

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

คำตอบ:


12

mapoholic,

โดยทั่วไปการพูดไม่มีเหตุผลที่จะทำแบบสอบถามเชิงพื้นที่โดยไม่มีดัชนีเชิงพื้นที่จนกว่าคุณจะจัดการกับตารางเล็ก ๆ จริงๆ แม้ว่าคุณจะใช้ ST_ ซึ่งไม่ได้ใช้ดัชนี แต่มีตัวดำเนินการ && กล่องลัดวงจรที่สามารถจัดทำดัชนีได้ ฟังก์ชั่นที่เริ่มต้นด้วย _ST นั้นไม่ได้มีไว้สำหรับผู้ใช้ปลายทาง เหตุผลที่พวกเขามีอยู่ก็เพราะพวกเขาต้อง PostGIS spatial index ใช้ SQL inlining เพื่อบังคับให้ใช้ index โดยปกติ _ST จะทำโดย GEOS และ && เป็นดัชนีที่อาจได้รับการจัดลำดับใหม่ ดังนั้น _ST จึงเป็นสิ่งประดิษฐ์ที่ใช้งานจริง

ดังนั้นในระยะสั้นมันไม่ใช่ฟังก์ชั่นเดียวเพื่อให้การดำเนินการดัชนีสามารถจัดลำดับใหม่ให้เกิดขึ้นได้ทั้งหมดในครั้งเดียวก่อนที่การตรวจสอบอวกาศจะเข้มข้นขึ้น


ไชโย LR1234567 ฉันคิดว่านี่คือสิ่งที่ฉันกำลังมองหา
mapoholic

25

หากชุดข้อมูลของคุณถูกเพิ่มและปรับปรุงบ่อยงบ INSERT, DELETE และ UPDATE ซึ่งทำให้ดัชนีถูกสร้างใหม่อาจทำให้ฐานข้อมูลช้าลง

สำหรับการแทรกจำนวนมากเช่นการโหลดชุดข้อมูล OSM ทั้งหมดลงในฐานข้อมูลอาจเร็วกว่าที่จะปล่อยดัชนีและสร้างอีกครั้งหลังจากนั้น

ถ้ามีประสิทธิภาพมากกว่าในการละเว้นดัชนี (ตัวอย่างเช่นตารางมีขนาดเล็กพอที่จะโหลดลงในหน่วยความจำ) ตัวประมวลผลแบบสอบถามฐานข้อมูลควรทำสิ่งนี้โดยอัตโนมัติ

ฉันคาดว่าเหตุผลหลักที่จะอนุญาตให้เรียกใช้ข้อความค้นหาโดยไม่มีดัชนีเชิงพื้นที่คือการวัดประโยชน์ที่ได้รับจากการใช้ดัชนีโดยไม่ต้องลดลง

ในที่สุดหากคุณต้องการแสดงการเพิ่มประสิทธิภาพอย่างมากในการค้นหาและการแสดงแผนที่คุณอาจต้องการชะลอการสร้างดัชนีในช่วงเวลาที่เหมาะสมในการพัฒนาระบบ ...


3
(+1) ฉันตรวจพบความเห็นถากถางดูถูกเล็กน้อยในคำพูดสุดท้ายหรือไม่? :-)
whuber

ไม่เลย ;-) แต่การวาง / สร้างดัชนีที่ปรับอย่างระมัดระวังใหม่เป็นคำตอบที่มีประโยชน์สำหรับ "ทำไม X จึงใช้เวลามากกับการเปลี่ยนแปลงฐานข้อมูล"?
geographika

ขอบคุณ geographica- และฉันเห็นด้วยกับคำพูดของ whuber! ;-) ฉันเข้าใจว่าคุณจะวาง / ปิดการใช้งานดัชนีอวกาศเมื่อโหลดจำนวนมาก - หรือดัชนีทั้งหมดสำหรับเรื่องนี้ แต่คุณไม่สามารถคิดเหตุผลว่าทำไมคุณจะทำแบบสอบถามเชิงพื้นที่โดยไม่ใช้ดัชนีปริภูมิ? หากตารางมีขนาดเล็กเพียงพอการใช้ดัชนีอาจไม่ทำให้เกิดความแตกต่างพอเพียง แต่การเลือกที่จะไม่ใช้ดัชนีนั้น ไม่ทราบฉันเดาว่าฉันเพิ่งงงงวยมากขึ้นด้วยฟังก์ชั่นการทำงานของดัชนีที่ไม่ใช่เชิงพื้นที่ของ PostGIS ...
mapoholic

2
หากตารางมีขนาดเล็กและเหมาะสมกับหน่วยความจำการใช้ดัชนีจำเป็นต้องใช้การเข้าถึงดิสก์แบบสุ่มซึ่งมีค่าใช้จ่ายสูงกว่าการสแกนตามลำดับ wiki.postgresql.org/wiki/…
Sean

2
@mapoholic - _ST_Contains อาจค้างอยู่เมื่อคุณทำการ prefilter ข้อมูลของคุณด้วยตนเอง, ตัดสินจากold.nabble.com/…
geographika

10

ฉันคิดว่านี่เป็นนัย แต่ฉันจะไม่ใช้ดัชนีเชิงพื้นที่สำหรับแบบสอบถามเมื่อฉันมีดัชนีที่ไม่ใช่เชิงพื้นที่ที่ฉันสามารถใช้แทนได้ ตัวอย่างเช่นฉันมี 2,113,450 คะแนนที่ขยายสหรัฐอเมริกาโหลดลงในตาราง หากฉันต้องการดึงคะแนนทั้งหมดที่อยู่ในสถานะของมลรัฐอะแลสกาฉันสามารถทำแบบสอบถามเชิงพื้นที่ที่ใช้ดัชนี GIST บนรูปทรงเรขาคณิตของจุดเพื่อเปรียบเทียบกับรูปทรงเรขาคณิตของรัฐอลาสกาหรือฉันก็สามารถใช้ ฟิลด์ "state_alpha" ในข้อมูลจุด (ซึ่งจัดทำดัชนีไว้ด้วย) เพื่อส่งคืนคะแนนทั้งหมดที่มี "state_alpha" = 'AK'

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

ด้านล่างนี้คือผลลัพธ์บางส่วนจากอธิบายการวิเคราะห์ที่พิสูจน์จุดนั้น (หมายเหตุ: ฉันพยายามทำให้การสืบค้นเชิงพื้นที่มีประสิทธิภาพมากที่สุดโดยใช้การสืบค้น BBOX การใช้โครงร่างสถานะจะทำให้ช้าลงเท่านั้น)

# explain analyze select count(*) from gnis_names where state_alpha = 'AK';
Aggregate  (cost=57359.45..57359.46 rows=1 width=0) (actual time=76.606.. 76.607 rows=1 loops=1)
<snip>
Total runtime: 76.676 ms

# explain analyze select count(*) from gnis_names where the_geom && GeomFromText('POLYGON((-179.14734 51.219862,-179.14734 71.3525606439998,179.77847 71.3525606439998,179.77847 51.219862,-179.14734 51.219862))',4326);
Aggregate  (cost=27699.86..27699.87 rows=1 width=0) (actual time=86.523..86.524 rows=1 loops=1)
<snip>
Total runtime: 86.584 ms 

ขอบคุณมากสำหรับสิ่งนั้น อาจดูเหมือนชัดเจนเมื่อคุณพูด แต่ความคิดแรกของฉันคือการเรียกใช้การสืบค้นเชิงพื้นที่ไม่ใช่แบบเฉพาะแอตทริบิวต์ +1 สำหรับสิ่งนี้!
mapoholic

0

เพิ่งสังเกตเห็นคำสั่งนี้

สำหรับฉันแล้วนี่สมเหตุสมผล คุณเรียกใช้แบบสอบถามแบบปริภูมิ = คุณต้องมีดัชนีเชิงพื้นที่

สำหรับฉันมันไม่สมเหตุสมผลเลยและฉันคิดว่าทั้ง SQL Server และ Postgis ทำงานได้ดีขึ้นหรืออย่างน้อยก็ไม่รบกวนคุณกับรายละเอียดประสิทธิภาพ ในความเป็นจริงทั้ง SQL Server และ Postgis บางครั้งไม่ได้ใช้ดัชนีอวกาศเลย (กลับไปใช้การสแกนแบบเต็มตาราง)

สำหรับ Oracle คุณต้องสร้างดัชนีและดังนั้นคุณต้องเติม user_sdo_geom_metadata

เพียงแค่เปรียบเทียบสิ่งนี้กับดัชนีตัวอักษรและตัวเลขพวกเขาอยู่ที่นั่นด้วยเหตุผลด้านประสิทธิภาพคำสั่ง SQL ของคุณควรทำงานด้วยและไม่มี

ในฐานข้อมูล Oracle ให้วางดัชนีและคุณจะได้รับข้อผิดพลาดและแอพที่ไม่สามารถใช้การสืบค้นเชิงพื้นที่ดังนั้นจึงไม่สามารถใช้งานได้

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