Temat: GeoServer i SQL Server - problemy z wydajnością
Spatial index można zawsze przebudować. Też na początku myślałem, że to główny winowajca, ale zasadniczo dane z bazy powinny być pobierane dużo szybciej niż z plików typu shp. Nie udało mi się osiągnąć nawet połowy wydajności sql servera w porównaniu ze źródłem danych w postaci shp.
Od razu w kwestii wyjaśnienia - wina nie leży po stronie SQL Servera, ale nie leży też po stronie Geoservera...
A gdzie leży? Ano właśnie... Optymalizacji wymaga plugin geoserverowy do odczytu danych z SQL Servera. W chwili obecnej geoserver ciągnie dane geometryczne w postaci WKT. Różnica w czasie pobrania z servera geometrii binarnej, a geometrii przetworzonej do WKT jest kolosalna - ja zanotowałem w testach przyrost czasu rzędu 1000 - 2000% przy genrowaniu wkt względem wkb. To oczywiście zależy od ilości danych i stopnia ich komplikacji. Jeżeli pracujesz z wyższą wersją niż express odpal sobie profilera i zobacz o co pyta geoserver sql servera i zobacz jakie są różnice w czasie wykonania zapytania względem tego samego, ale bez przetwarzania geometrii do wkt.
A to dopiero pierwszy etap przetwarzania danych na linii sql server -> geoserver. W kolejnym geoserver musi przeparsować WKT do czegoś zrozumiałego dla siebie (niewykluczone, że geometrii w zapisie binarnym) i dopiero potem może przystąpić do renderowania (nie jestem pewien, czy robi najbierw batchowy odczyt geometrii, a potem renderowanie, czy może sekwencyjnie oczyt, renderowanie, odczyt, etc., ale filozofia działania jest pewnie mniej więcej taka)
Jeżeli nie masz profilera, to dla jakiegoś obszaru odpal sobie zapytanie najpierw w postaci mniej więcej takiej: DECLARE @bbox geometry; SET @bbox = STGeomFrom...; SELECT [geom] FROM [myTable] WHERE [geom].Filter(@bbox) = 1;
a potem SELECT [geom].ToString() i zobacz, jakie są różnice w czasie wykonania zapytania.
Przynajmniej pluging używa dużo szybszego Filter, zamiast STIntersetcs, jednak jak na tablicę nie jest założony index przestrzenny, to zamiast Filter wykonywany jest STIntersects. Różnica w wykorzystaniu Filter jest taka, że sprawdzenie odbywa się po spatial index, więc istnieje prawdopodobieństwo wybrania większej ilości rekordów niż powinno ich być - tzw. false positives, ale do celów takich jak wyrenderowanie kafelka przez wms to nie ma znaczenia.
Dla porównania obadaj sobie jakie opcje oferuje źródło danych PostGIS - tam możesz ciągnąć geometrię binarnie, albo jako wkt, jednak sugerowane jest pobieranie geometrii w postaci wkb, ponieważ jest szybsze.
Jeżeli możesz więc pozwolić sobie na zmianę bazy, to postaw postgisa. Albo podłub w pluginie ;-)