geopython / geopython/GeoHealthCheck

Optimization: Reduce number of queries to DB

Aperta
#76 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
enhancement
Lingua principale
Python
Stelle
92
Fork
75
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Using PostgreSQL as backend, logging the DB statements, there seems to be quite a number of queries just to display a single Resource page with a single WMS Resource like `GET /?lang=en&resource_type=OGC%3AWMS`:

```
LOG: statement: BEGIN
LOG: statement: SELECT t.oid, typarray
FROM pg_type t JOIN pg_namespace ns
ON typnamespace = ns.oid
WHERE typname = 'hstore';

LOG: statement: ROLLBACK
LOG: statement: BEGIN
LOG: statement: select version()
LOG: statement: select current_schema()
LOG: statement: show transaction isolation level
LOG: statement: SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
LOG: statement: SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
LOG: statement: SELECT 'x' AS some_label
LOG: statement: ROLLBACK
LOG: statement: BEGIN
LOG: statement: show standard_conforming_strings
LOG: statement: SELECT resource.identifier AS resource_identifier, resource.resource_type AS resource_resource_type, resource.title AS resource_title, resource.url AS resource_url, resource.latitude AS resource_latitude, resource.longitude AS resource_longitude, resource.owner_identifier AS resource_owner_identifier
FROM resource
WHERE resource.resource_type = 'OGC:WMS'
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime ASC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime ASC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier) AS anon_1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier AND run.success = true) AS anon_1
LOG: statement: SELECT "user".user_id AS user_user_id, "user".username AS user_username, "user".password AS user_password, "user".email AS user_email, "user".role AS user_role, "user".registered_on AS user_registered_on
FROM "user"
WHERE "user".user_id = 1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT resource.resource_type AS resource_resource_type
FROM resource) AS anon_1
LOG: statement: SELECT resource.resource_type AS resource_resource_type, count(resource.resource_type) AS count_1
FROM resource GROUP BY resource.resource_type
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier ORDER BY run.checked_datetime DESC
LIMIT 1
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier
LOG: statement: SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier) AS anon_1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier AND run.success = true) AS anon_1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier) AS anon_1
LOG: statement: SELECT count(*) AS count_1
FROM (SELECT run.identifier AS run_identifier, run.resource_identifier AS run_resource_identifier, run.checked_datetime AS run_checked_datetime, run.success AS run_success, run.response_time AS run_response_time, run.message AS run_message
FROM run
WHERE 2 = run.resource_identifier AND run.success = true) AS anon_1
127.0.0.1 - - [19/Dec/2016 21:34:41] "GET /?lang=en&resource_type=OGC%3AWMS HTTP/1.1" 200 -
```

This happens behind the facade of SQLAlchemy I guess. Possibly some statements in https://github.com/geopython/GeoHealthCheck/blob/master/GeoHealthCheck/models.py in combination with the templates may be optimized.

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.