Wojciech Sitterlee

Wojciech Sitterlee Architekt Systemów
Informatycznych

Temat: Oracle Spatial

Jacek Tomaka:

Wcześniej było nieprawdziwe? Można się spodziewać niedoróbek. I właśnie o tym mówię. Jeśli kochasz tę bazę danych i lubisz testować ją to ok. Ja wolę zaufać rozwiązaniom które są przetestowane już przez kogoś.

W wersji 10g współrzędna Z była tylko ściemą nie braną do przeliczeń 3D. W wersji 11g już jest.
I nie mów, że jak firma wypuszcza jakiś nowy produkt, to od razu jest on dopracowany we wszystkich szczegółach. Bo nie jest. I o tym właśnie mówię.
Napisałem też, że 3D nie używam. Używam tego, co już jest przetestowane.

Kocham to ja kobiety. Bazę danych używam.
Zgoda. Dopóki nie popatrzy się na wynik hulania.

A coś z nimi nie tak?

Zdarza się, że są błędne. Piszę o tym w poprzednim poście i jeszcze poprzednim.

Jak masz polygon o 500 tyś werteksów reprezentujący wijącą się drogę w Andach, to może.
Mi się jeszcze nie zdarzyło.
To zależy co się robi. Jeśli wyświetlasz mapkę z danych zebranych z GPS'a na prezentacji dla klienta, i podstawowe analizy, możesz wykorzystać mechanizmy bazy danych. Jeśli wyświetlasz dane w portalu - możesz wykorzystać mechanizmy bazy danych.
Ale jeśli potrzebujesz wykonac szereg analiz gdzie każdy metr kwadratowy to konkretna ilość pieniędzy to ja bym odradzał wydanie 10k USD/CPU na coś co po prostu się nie sprawdzi.

Jak do tej pory Oracle świetnie się sprawdzał w analizach przestrzennych wykonywanych na działkach na potrzeby dopłat unijnych. Takie projekty robiliśmy wielokrotnie i nie było żadnych błędów.
Nie. Tolerancja nie załatwia wszystkiego. Tolerancja mówi jak daleko dwa punkty mogą być blisko siebie, żeby były traktowane jako dwa różne punkty.
Nie mówi nic o odległości punktu od odcinka.

Zgadza się. Ale stwierdzenie że "obiekty nachodzą na siebie" tyczy właśnie tego. Od tolerancji zależy czy funkcja zwróci "TRUE" czy "FALSE". I nawet w projektach gdzie chodzi o pieniądze nie ma znaczenia, czy działka ma 0.01 mm granice przesuniętą czy nie. Bo klient i tak zaokrągla powierzchnię. Ma to znaczenie, jak wspomniałem, dla nas, dla poprawności obliczeń.
Jeśli uważasz, że to nie problem to ja chętnie wezmę działkę powstałą w wyniku wszystkich obliczeń na terenie Polski ;D

No mam takie, klient ma i wszyscy są zadowoleni. W bazie ma tolerancję e-6 i żadnych błędów.
Oracle nie jest konkurencją.
Żeby było jasne. Ja nie uważam, że Oracle jest złą bazą danych. Przeciwnie. Uważam, że to najlepsza baza danych na świecie. Ale płaci się za optymalizowanie zapytań i efektywny dostęp do danych. Cała reszta, m.in. Spatial (wyłączając może Locatora) to wodotryski i nie należy tego mylić z silnikami GIS. Jeszcze długo nie.

Bo to nie są silniki GIS.
Ale bez Spatiala, LRS-a i jego dynamicznej segmentacji, topologii i sieci, Oracle byłby zwykłym kontenerem danych.Wojciech Sitterlee edytował(a) ten post dnia 12.04.12 o godzinie 18:40

Temat: Oracle Spatial

Wojciech Sitterlee:
W wersji 10g współrzędna Z była tylko ściemą nie braną do przeliczeń 3D. W wersji 11g już jest.

Zgoda.
I nie mów, że jak firma wypuszcza jakiś nowy produkt, to od razu jest on dopracowany we wszystkich szczegółach. Bo nie jest.

Nie mówię. Mówię, że jak chcę dostać się do Grecji to wybieram samolot, a nie samochód. Choć można i tak i tak. Kwestia bezpieczeństwa, komfortu i czasu.
I o tym właśnie mówię.
Napisałem też, że 3D nie używam. Używam tego, co już jest przetestowane.

Kocham to ja kobiety. Bazę danych używam.

Gratuluję.

Jak masz polygon o 500 tyś werteksów reprezentujący wijącą się drogę w Andach, to może.
Mi się jeszcze nie zdarzyło.

Nie do końca ma znaczenie ilość wierzchołków.
Jak do tej pory Oracle świetnie się sprawdzał w analizach przestrzennych wykonywanych na działkach na potrzeby dopłat unijnych. Takie projekty robiliśmy wielokrotnie i nie było żadnych błędów.

A ja twierdzę, że na danych referencyjnych się nie sprawdza.
Nie. Tolerancja nie załatwia wszystkiego. Tolerancja mówi jak daleko dwa punkty mogą być blisko siebie, żeby były traktowane jako dwa różne punkty.
Nie mówi nic o odległości punktu od odcinka.

Zgadza się. Ale stwierdzenie że "obiekty nachodzą na siebie" tyczy właśnie tego. Od tolerancji zależy czy funkcja zwróci "TRUE" czy "FALSE". I nawet w projektach gdzie chodzi o pieniądze nie ma znaczenia, czy działka ma 0.01 mm granice przesuniętą czy nie. Bo klient i tak zaokrągla powierzchnię. Ma to znaczenie, jak wspomniałem, dla nas, dla poprawności obliczeń.

Widziałeś może kiedyś o ile potrafi odjechać ta różnica 0.01mm w PUWG1992 po konwersji do WGS84 lub odwrotnie np. na działce o boku 100m? Polecam takie ćwiczenie. Ziemia niestety nie jest płaska.
No mam takie, klient ma i wszyscy są zadowoleni. W bazie ma tolerancję e-6 i żadnych błędów.

W jakim układzie współrzędnych? Jeśli w jakimś geograficznym to mówimy tutaj o centymetrach lub metrach. Czyli o różnicach w powierzchni rzędu wielu metrów kwadratowych.

Jeżeli dla Twojego klienta w Twoim projekcie dokładność i niezawodność oferowane przez operacje przestrzenne Spatiala jest wystarczająca to fajnie. W moim projekcie dla mojego klienta tak nie jest. Staram się stosować odpowiednie narzędzia do odpowiednich celów.
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Oracle Spatial

Wracając do tematu, to taka ciekawostka:
http://www.goldenline.pl/forum/2937348/indexy-spatialo...

konto usunięte

Temat: Oracle Spatial

Kamil Stawiarski:
Wracając do tematu, to taka ciekawostka:
http://www.goldenline.pl/forum/2937348/indexy-spatialo...

Nie ma takieeej stroooony, nie ma takieeej stroooony :)
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Oracle Spatial

Krzysztof P.:
Kamil Stawiarski:
Wracając do tematu, to taka ciekawostka:
http://www.goldenline.pl/forum/2937348/indexy-spatialo...

Nie ma takieeej stroooony, nie ma takieeej stroooony :)

Coś chyba krzywo klikasz, bo u mnie działa :) No chyba, że się nie dołączyłeś członków grupy "Optymalizacja Oracle" ... Ale specjalnie dla Ciebie, Krzysztof - post jeszcze raz tutaj :)

--------------------------------------------------------------

Witam!
Ostatnio bawiłem się z optymalizacją jednego zapytanka, korzystającego z indeksów spatialowych i chciałem się podzielić spostrzeżeniami:

Były dwa zapytania:

Zapytanie 1:

select *
from tabela
where mdsys.sdo_filter
(shape,
mdsys.sdo_geometry(2003,
2180,
NULL, mdsys.sdo_elem_info_array(1,3,3),
mdsys.sdo_ordinate_array(200872.16707840492, 610397.420979471, 201887.68583438097, 611344.5935072843)),
'mask=ANYINTERACT querytype=window') = 'TRUE'
and (otype, subtype) in ((4022006,0));

-----------------------------------------------------+-----------------------------------+
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------+-----------------------------------+
| 0 | SELECT STATEMENT | | | | 5860 | |
| 1 | TABLE ACCESS BY INDEX ROWID | TABELA | 28K | 1641K | 5860 | 166:26:45 |
| 2 | DOMAIN INDEX | RTREE_IDX| | | 1 | 00:02:43 |
-----------------------------------------------------+-----------------------------------+



Wykonanie: 0.5 sek.

oraz Zapytanie 2:


select *
from tabela
where mdsys.sdo_filter
(shape,
mdsys.sdo_geometry(2003,
2180,
NULL, mdsys.sdo_elem_info_array(1,3,3),
mdsys.sdo_ordinate_array(200872.16707840492, 610397.420979471, 201887.68583438097, 611344.5935072843)),
'mask=ANYINTERACT querytype=window') = 'TRUE'
and (otype, subtype) in ((4022500,0));

-----------------------------------------------------+-----------------------------------+
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-----------------------------------------------------+-----------------------------------+
| 0 | SELECT STATEMENT | | | | 1629 | |
| 1 | TABLE ACCESS BY INDEX ROWID | TABELA | 1258 | 71K | 1629 | 46:16:54 |
| 2 | INDEX RANGE SCAN | BTREE_IDX| 138K | | 68 | 02:56:53 |
-----------------------------------------------------+-----------------------------------+



Wykonanie: 120 sek.

Oczywiście wystarczyło zajrzeć na plan wykonania zapytania, żeby stało się jasne co jest problemem - w przypadku zapytania drugiego access nastąpił na poziomie indeksu B-Tree a nie R-Tree, natomiast przy zapytaniu pierwszym (tym szybszym) był elegancko użyty index R-Tree. Zastanawiałem się dlaczego CBO podjął taką a nie inną decyzję - potraktowałem chama trace'em 10053 i oto co zobaczyłem po przebiciu się przez całe tony tekstu:

Zapytanie 1:

Bitmap nodes:
Used RTREE_IDX
Cost = 1.000000, sel = 0.010000
Used BTREE_IDX
Cost = 1547.610041, sel = 0.765717
Access path: Domain index - accepted
Cost: 5860.124212 Cost_io: 5860.120140 Cost_cpu: 236114748.981652 Sel: 0.010000
Not Believed to be index-only
****** finished trying bitmap/domain indexes ******
Best:: AccessPath: IndexDomain
Cost: 5860.12 Degree: 1 Resp: 5860.12 Card: 28973.38 Bytes: 0


Zapytanie 2:

Bitmap nodes:
Used RTREE_IDX
Cost = 1.000000, sel = 0.010000
Used BTREE_IDX
Cost = 67.600436, sel = 0.033249
Access path: Domain index - accepted
Cost: 5860.124212 Cost_io: 5860.120140 Cost_cpu: 236114748.981652 Sel: 0.010000
Not Believed to be index-only
****** finished trying bitmap/domain indexes ******
Best:: AccessPath: IndexRange
Index:BTREE_IDX
Cost: 1628.60 Degree: 1 Resp: 1628.60 Card: 1258.07 Bytes: 0


Ewidentnie w obydwu przypadkach selektywność oszacowana przez CBO jest na korzyść indeksu R-Tree, jednak w drugim zapytaniu Oracle stwierdził, że nie jest to aż tak duża przewaga i zdecydował się na użycie zwykłego range scan'a... Wydaje mi się, że błąd tutaj wynika z funkcji użytych do oszacowania kosztów indeksów spatialowych - bardzo ładnie widać w raporcie bloki anonimowe wykonywane przez optymalizator w celu znalezienia odpowiednich kosztów:


declare
cost sys.ODCICost := sys.ODCICost(NULL, NULL, NULL, NULL);
obj0 "MDSYS"."SDO_GEOMETRY" := "MDSYS"."SDO_GEOMETRY"(NULL, NULL, NULL, NULL, NULL);

begin
:1 := "MDSYS"."SDO_STATISTICS".ODCIStatsFunctionCost(
sys.ODCIFuncInfo('MDSYS',
'SDO_3GL',
'FILTER',
2),
cost,
sys.ODCIARGDESCLIST(sys.ODCIARGDESC(2, 'TABELA', 'TEST', '"SHAPE"', NULL, NULL, NULL), sys.ODCIARGDESC(3, NULL, NULL, NULL, NULL, NULL, NULL), sys.ODCIARGDESC(3, NULL, NULL, NULL, N
ULL, NULL, NULL))
, obj0, "MDSYS"."SDO_GEOMETRY"(2003,2180,NULL,"MDSYS"."SDO_ELEM_INFO_ARRAY"(1,3,3),"MDSYS"."SDO_ORDINATE_ARRAY"(200872.16707840492,610397.420979471,201887.68583438097,611344.5935072
843)), :5,
sys.ODCIENV(:6,:7,:8,:9));
if cost.CPUCost IS NULL then
:2 := -1.0;
else
:2 := cost.CPUCost;
end if;
if cost.IOCost IS NULL then
:3 := -1.0;
else
:3 := cost.IOCost;
end if;
if cost.NetworkCost IS NULL then
:4 := -1.0;
else
:4 := cost.NetworkCost;
end if;
exception
when others then
raise;
end;
Bind :5 Value 'mask=ANYINTERACT querytype=window'
ODCIEnv Bind :6 Value 0
ODCIEnv Bind :7 Value 0
ODCIEnv Bind :8 Value 0
ODCIEnv Bind :9 Value 3
MDSYS.SDO_STATISTICS.ODCIStatsFunctionCost returned:
CPUCost : 1000
IOCost : 0
NetworkCost : -1


Oczywiście jedno z rozwiązań to hint i po problemie ale chciałem też pokazać alternatywne rozwiązanie, które dostarcza trochę informacji na temat transformatora SQL - jeśli ubierze się zapytanie do postaci CTE, tak że wewnątrz definicji CTE posłużymy się filtrem spatialowym a na zewnątrz dodamy dodatkowe filtry na wartościach prostych, to można by się spodziewać, że Oracle wykona najpierw plan dla zapytania wewnątrz CTE a dopiero obliczy plan całościowy. Jednak zapytanie pozostawione w takiej postaci:


with v_shape as
(
select *
from tabela
where mdsys.sdo_filter
(shape,
mdsys.sdo_geometry(2003,
2180,
NULL, mdsys.sdo_elem_info_array(1,3,3),
mdsys.sdo_ordinate_array(200872.16707840492, 610397.420979471, 201887.68583438097, 611344.5935072843)),
'mask=ANYINTERACT querytype=window') = 'TRUE'
)
select *
from v_shape
where (otype, subtype) in ((4022500,0));


Nie zdaje egzaminu ze względu na to, że transformator SQL wykonuje fazę subquery unnesting, przepisując nam zapytanie do postaci pierwotnej - bez żadnych podzapytań czy CTE. Jeśli jednak zrobimy mały trick:


with v_shape as
(
select rownum, t.*
from tabela t
where mdsys.sdo_filter
(shape,
mdsys.sdo_geometry(2003,
2180,
NULL, mdsys.sdo_elem_info_array(1,3,3),
mdsys.sdo_ordinate_array(200872.16707840492, 610397.420979471, 201887.68583438097, 611344.5935072843)),
'mask=ANYINTERACT querytype=window') = 'TRUE'
)
select *
from v_shape
where (otype, subtype) in ((4022500,0));


Okazuje się, że użycie ROWNUM w składni z CTE, powoduje, że transformator SQL nie przepisuje zapytania (brak fazy "subquery unnesting") - tym samym rozwijany jest najpierw plan dla SQL zdefiniowanego jako CTE (używając indeksu przestrzennego) a dopiero potem odfiltrowywane są wyniki dla otype i subtype.

Oj... mam nadzieję, że nie namieszałem za bardzo :) Tak czy inaczej - wydaje mi się, że sytuacja ciekawa i warta przemyślenia :)

Pozdrawiam!
Kamil.
Przemysław Kantyka

Przemysław Kantyka Oracle Certified
Professional, Oracle
Database SQL
Certif...

Temat: Oracle Spatial

Kamil Stawiarski:
[...]
Okazuje się, że użycie ROWNUM w składni z CTE, powoduje, że transformator SQL nie przepisuje zapytania (brak fazy "subquery unnesting") - tym samym rozwijany jest najpierw plan dla SQL zdefiniowanego jako CTE (używając indeksu przestrzennego) a dopiero potem odfiltrowywane są wyniki dla otype i subtype.
[...]
Pozdrawiam!
Kamil.

Generalnie fajny case, i dobrze się czyta, ale mam jedno pytanko (troche z boku) - zamiast ROWNUM, nie prościej było użyć /*+ MATERIALIZED */?Przemysław Kantyka edytował(a) ten post dnia 26.06.12 o godzinie 20:55
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Oracle Spatial

Przemysław Kantyka:

Generalnie fajny case, i dobrze się czyta, ale mam jedno pytanko (troche z boku) - zamiast ROWNUM, nie prościej było użyć /*+ MATERIALIZED */?

Prościej ale /*+MATERIALIZE */ wymusza zbędny w tym przypadku ruch na TEMP'ach, czego akurat tutaj chciałem uniknąć. ROWNUM powoduje tylko uniknięcie fazy subquery unnesting - bez materializacji w postaci tymczasowej tabeli.
Przemysław Kantyka

Przemysław Kantyka Oracle Certified
Professional, Oracle
Database SQL
Certif...

Temat: Oracle Spatial

Nie mówię, że ROWNUM jest zły i odnośnie materialized - zgoda, a co zatem z hintem NO_PUSH_PRED?

PozdrawiamPrzemysław Kantyka edytował(a) ten post dnia 26.06.12 o godzinie 22:41
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Oracle Spatial

Przemysław Kantyka:
Nie mówię, że ROWNUM jest zły i odnośnie materialized - zgoda, a co zatem z hintem NO_PUSH_PRED?

Pozdrawiam

Nie próbowałem NO_PUSH_PRED ale przypuszczam, że mógłby zadziałać, podobnie jak NO_UNNEST - tylko że jeśli przyjmujemy użycie hintów, to dobrze spisałoby się też wymuszenie użycia indeksu RTREE w tym przypadku... A ja mam awersję do hintów :)

Pozdrawiam,
Kamil.Kamil Stawiarski edytował(a) ten post dnia 27.06.12 o godzinie 21:40

Następna dyskusja:

Administrator Oracle




Wyślij zaproszenie do