Jestem początkującym w postgis i mam problem z wydajnością zapytań.
To moje zapytanie:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
problem polega na tym, że mój wielokąt zawiera BARDZO duże wielokąty (600 stron długich w dokumencie doc!), a wykonanie zajęło ponad 2 godziny!
Czy istnieje sposób na zoptymalizowanie mojego zapytania lub użycie innego sposobu?
Proszę bardzo o pomoc!
To zależy od tego, jakiej jakości - precyzji potrzebujesz. Możesz oczywiście uprościć wielokąty, używając: http://postgis.net/docs/ST_Simplify.html
To, co często robiłem podczas opracowywania mojej aplikacji GIS, to zastanawianie się, jak najlepiej zminimalizować dane. Na przykład. na przykład wstępnie zaznacz wielokąty w polu granicy. - W zależności od poziomu powiększenia nie potrzebujesz ultra precyzyjnych wyników (st_simplify), więc ...
Mam nadzieję, że ci trochę pomogło!
źródło
W zależności od twojej postgresu i / lub wiedzy SQL masz kilka opcji:
przeanalizuj zapytanie za pomocą polecenia EXPLAIN, aby dowiedzieć się, czy napotkasz określone wąskie gardło. Ostrzeżenie: czasami wynik działania WYJAŚNIENIA może być trudny do zrozumienia
jeśli spodziewasz się, że większość lub znaczna część geometrii w tabeli 1 NIE przecina wieloboku, możesz spróbować zastosować warunek wstępny wobec prostszego wielokąta (tj. rozbijając multiploygon na mniejsze kawałki), a następnie uruchomić cięższe przecięcie wieloboku tylko na te wyniki. Przykład poniżej.
wtedy i tylko wtedy, gdy wąskim gardłem jest procesor (tzn. serwer utknął w obliczeniach) Tępo sugeruję, aby uzyskać większy, szybszy, mocniejszy procesor lub wynająć jednorazową instancję o wysokiej wydajności poza EC2 Amazon i zniszczyć go, gdy jesteś gotowy
Przykładowe zapytanie do pozycji 2:Aby poprawić wydajność, możesz również tymczasowo zmaterializować podselekcję st1 jako tabelę, abyś mógł ją indeksować.@Nicklas słusznie podkreśla w komentarzach, że przykład sugestii 2 nie powinien pomóc. Ma rację, ale myślę, że ja też (częściowo) mam rację.
W rzeczywistości wydaje się, że bardzo podobne pytanie zostało zadane (i udzielono odpowiedzi) w listopadzie zeszłego roku na postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
i okazuje się, że sugeruje się rozbicie wielokąta, aby indeks mógł najskuteczniej odfiltrować fałszywe przecięcia, które w innym przypadku zostałyby uruchomione przez proste sprawdzenie granicy.
źródło
Za pomocąST_SubDivide()
W wersji 2.2 Postgis można użyć
ST_SubDivide
.Ty też możesz
Tutaj używamy
ST_SubDivide
do rozbicia wielokąta na subpoligony o 10 lub mniejszej liczbie wierzchołków.Następnie
Nie rób powyższego, wprowadza błędy zaokrąglania
Ogólne strojenie
Zobacz także sekcję zatytułowaną Wskazówki dotyczące wydajności w dokumentach. Upewnij się, że jesteś odpowiednio dostrojony. Rozważ podniesienie,
max_parallel_workers_per_gather
aby skorzystać z równoległości (obecnie domyślnie jest wyłączone).źródło