Professional Documents
Culture Documents
Sprawozdanie
Projekt:
Porównanie wydajności modułów przestrzennych w
najnowszych wersjach systemów baz danych MySQL i
PostgreSQL
Wykonali:
Julia Karwat 300557
Marcin Kotulski 300570
1. Cel pracy
Celem projektu jest porównanie wydajności modułów przestrzennych różnych baz
danych. Polega ono na zaimportowaniu identycznych danych do baz oraz
wykonywaniu różnych rodzajów zapytań na danych. Wykorzystując metryki takie jak
czas wykonywania operacji, użycie CPU ... podczas wykonywania zapytań
wywnioskujemy, który moduł lepiej radzi sobie z opracowywaniem danych
przestrzennych.
2. Schemat danych
W każdej bazie danych znalazły się dwie tabele zawierające dane na temat
budynków znajdujących się w województwie.
Każda tabela zawierała kolumny:
4. Wykorzystane zapytania
Tutaj ST_Contains sprawdza, czy geometria geom w każdym wierszu tabeli zawiera
punkt określony przez współrzędne lon i lat.
4.2. Przecięcie z odcinkiem lub innym obiektem:
Operator <-> zwraca odległość między punktami w sposób przybliżony, ale jest
szybki i użyteczny dla zapytań KNN (k najbliższych sąsiadów).
Obiekty w zadanej odległości:
select * from dolnoslaskie where ST_Distance(geom,
ST_GeomFromText('POINT(16.860772 51.026913)', 4326))> 0.60;
4.6Obliczanie odległości:
SELECT ST_Distance(geom, ST_GeomFromText('POINT(16.860772
51.026913)', 4326)) from lubuskie;
5. Środowisko testowe
Bazy danych zostały uruchomione na kontenerach Dockerowych. Parametry obu
kontenerów były takie same aby nie wpływały one na wyniki projektu.
Komenda uruchamiająca kontener postgis
$ docker run --name spdb-postgis1 -e POSTGRES_PASSWORD=mysecretpassword -d
postgis/postgis -p 5432:5432
7. Wyniki i wnioski
Do uzyskania wyników wykorzystano skrypt napisany w języku Python:
import psycopg2
import time
import psutil
try:
cursor = connection.cursor()
cursor.execute(query)
result = cursor.fetchall()
connection.commit()
except Exception as e:
connection.rollback()
print(f"Error: {str(e)}")
finally:
cursor.close()
end_time = time.time()
cpu_usage = psutil.cpu_percent()
ram_usage = psutil.virtual_memory().percent
execution_time = end_time - start_time
disk_io_counters = psutil.disk_io_counters()
print(f"Disk I/O Counters: {disk_io_counters}")
print(f"CPU Usage: {cpu_usage}%")
print(f"RAM Usage: {ram_usage}%")
print(f"Execution Time: {execution_time} seconds")
return result
# Lista zapytań do pomiaru
queries = [
"SELECT * FROM lubuskie WHERE ST_Contains(geom, ST_GeomFromText('Point(15.001020149877485
52.67181144981775)', 4326))",
"SELECT * FROM dolnoslaskie WHERE ST_Intersects(geom, ST_GeomFromText('LINESTRING(16.860772
51.026913, 17.054226 51.182742)', 4326)) ",
"SELECT * FROM lubuskie WHERE ST_Within(ST_GeomFromText('Point(15.001020149877485
52.67181144981775)', 4326), geom)",
"SELECT * FROM dolnoslaskie WHERE ST_Within(geom, ST_MakeEnvelope(16.860772, 51.026913,
17.054226, 51.182742 ,4326))",
"SELECT * FROM dolnoslaskie order by geom <-> ST_GeomFromText('POINT(51.09470061779064
17.032347931267115)', 4326) limit 100",
"SELECT * FROM dolnoslaskie where ST_Distance(geom, ST_GeomFromText('POINT(16.860772
51.026913)', 4326))> 0.6",
"SELECT ST_Area(geom) FROM dolnoslaskie",
"SELECT ST_Area(geom) FROM lubuskie where name='Abc'",
"SELECT ST_Distance(geom, ST_GeomFromText('POINT(16.860772 51.026913)', 4326)) from
lubuskie",
" SELECT d.gid, d.name, ST_AsText(d.geom), ST_Area(d.geom) FROM dolnoslaskie d WHERE d.name
like ‘Z%’ and ST_Area(d.geom) < (SELECT AVG(ST_Area(l.geom)) FROM lubuskie l WHERE l.name =
d.name);"]
pg_conn.close()