Daha çox

Postgis ST_Intersects üçün yavaş planlaşdırma


Aşağıdakı sorğunu işləməyə çalışıram:

ST_Intersects (geom, ST_GeomFromText ('POINT (-73.990452 40.994184)', 4326)) olduğu çitlərdən SEÇİN *

İzah et təhlilini çalıştırdığım zaman aşağıdakıları alıram:

"Çitler üzərində fencegeomindex1 istifadə edərək indeks taraması (maliyet = 0.41… 8.68 satır = 1 genişlik = 980) (faktiki vaxt = 0.231… 0.353 satır = 9 döngə = 1)" "İndeks Cond: (geom && '0101000020E61000008010C990637F52C06D1ADB6B417F44' ' "Filter: _st_intersects (geom, '0101000020E61000008010C990637F52C06D1ADB6B417F4440' :: geometry)" "Planlaşdırma vaxtı: 0.239 ms" "İcra müddəti: 0.393 ms"

Normal bir postgresql çoxbucağı istifadə edən bu sorğunu işlədən zaman:

SEÇ * SEÇİN HESAPLARDAN POL @ @ '(-73.990452,40.994184)'

Alıram:

"Public.fences-də bitmap yığın taraması (maliyet = 464.69… 24194.22 satır = 6229 en = 980) (faktiki vaxt = 0.058… 0.087 satır = 9 döngə = 1)" "Yenidən yoxlayın: (fences.poly @> '((- 73.990452,40.994184)) ':: poliqon) "" Heap Blocks: dəqiq = 7 "" Tamponlar: paylaşılan hit = 14 "" -> Bitmap İndeksi Fencepolyindex1-də Bitmap İndeksi Taraması (cost = 0.00… 463.13 rows = 6229 width = 0) (actual zaman = 0.042… 0.042 satır = 9 döngə = 1) "" İndeks Vəziyyəti: (fences.poly @> '((-73.990452,40.994184))' :: çoxbucaqlı) "" Tamponlar: paylaşılan vuruş = 7 "" Planlama vaxtı: 0.094 ms "" İcra müddəti: 0.136 ms "

Maliyyət baxımından ST_Intersects postgisindən istifadə edərək sorğu daha ucuz görünür, lakin planlaşdırmaq və sonra icra etmək daha uzun çəkir. Bunun niyə baş verdiyinə dair hər hansı bir fikir. Cədvəli təmizlədim və təhlil etdim.

PostGIS istifadə edən real tətbiqimizdəki iki fərqli sorğunu işə salmaq, düz bir postgresql sorğusu olaraq məhsulun 1/3 hissəsini bizə bağlayır.

Daha bir qeyd, əlavə şəbəkə trafikinin qarşısını almaq üçün bu sorğuların yerinə yetirilməsinə təsir edəcəyindən əmin olmaq üçün bir çox sorğunu birləşdiririk.

misal:

SEOM * geom && ST_GeomFromText ('POINT (-82.85966597206304 31.44405266605823)') çitlerinden SEÇİN * BİRLİYİ BÜTÜN SEÇİN * geom && ST_GeomFromText ('POINT (-82.85966597206306) 314) 314

Planlaşdırma müddətlərindəki mütləq fərq milisaniyənin kəsrləridir. Doğma PostgreSQL planlayıcısının bir üstünlüyü var, çünki əslində belə deyil et bir seçicilik hesablanması üçün bir şey, yalnız sabit bir dəyər qaytarır. PostGIS seçicilik funksiyası, həqiqətən məlumatların məkan histogramına qarşı bir test istifadə edərək seçiciliyi müəyyənləşdirir. Bu daha mürəkkəbdir (0.2 milyon daha mürəkkəbdir, görünür işin həcmini nəzərə alaraq olduqca yaxşıdır). Həm də daha dəqiqdir ("satır" qiymətləndirməsinə baxın).

İstədiyiniz halda PostGIS seçicilik qiymətləndiricisini daimi seçicilik qiymətləndiricisi ilə opclass tərifi üçün SQL-də çox sürərək əvəz edə bilərsiniz. Ancaq braindead sadə SQL işlədiyiniz üçün yaxşı planlaşdırma, həqiqətən tələb etmədiyiniz bir lüksdür, yalnız yerli / yerli olmaya bilər.

Raison d'etre yalnız maksimum tərs coğrafi kodlaşdırma qabiliyyətinə sahibdirsə, http://twofishes.net/ kimi ayrılmış bir tərs coğrafi kodlayıcı ilə daha da yaxşı iş görərsən və ya bir neçə python və GEOS sətri ilə özünəməxsus şəkildə yaza bilərsən. kitabxana. (Və ya bir neçə sətir Java və JTS kitabxanası, əgər çantanızdırsa)


Videoya baxın: Postgis - QGIS Stintersects Stdistance (Oktyabr 2021).