Witam,
Mam taki problem jak w temacie. Zacznę od tego jaką tabelę posiadam:
CREATE TABLE "public"."device_data" (
"deviceid" Bigint REFERENCES cars (deviceid),
"ts" Timestamp Without Time Zone,
"longitude" Double Precision,
"lattitude" Double Precision,
"speedgps" Numeric( 5, 0 ),
"heading" Numeric( 5, 0 ),
"altitude" Numeric( 5, 0 ),
"satelite" Numeric( 3, 0 ),
"eventid" Numeric( 3, 0 ),
"mileagegps" Numeric( 20, 0 ),
"inputs" Numeric( 5, 0 ));
Powyższa tabela zawiera dane z pojazdu i teraz chcę wyciągnąć stąd informacje takie jak:
- numer ID - deviceid
- data rozpoczęcia trasy - ts
- data zakończenia trasy - ts
Data rozpoczęcia trasy ma miejsce wtedy gdy pole eventid = 11 oraz mod pola inputs = 1. Data zakończenia trasy ma miejsce wtedy gdy pole eventid = 11 oraz mod pola inputs = 0.
Utworzyłem taki widok:
CREATE VIEW historiatras AS
SELECT
DataRozpoczeciaTrasy.deviceid AS deviceid,
DataZakonczeniaTrasy.ts - DataRozpoczeciaTrasy.ts AS RoznicaCzasu,
DataRozpoczeciaTrasy.ts AS RozpoczecieTrasy, DataZakonczeniaTrasy.ts AS ZakonczenieTrasy,
DataRozpoczeciaTrasy.totaldistance AS PrzebiegCANPoczatkowy, DataZakonczeniaTrasy.totaldistance AS PrzebiegCANKoncowy,
DataRozpoczeciaTrasy.mileagegps AS PrzebiegGPSPoczatkowy, DataZakonczeniaTrasy.mileagegps AS PrzebiegGPSKoncowy,
DataRozpoczeciaTrasy.totalfuel AS ZuzytePaliwoPoczatkowe, DataZakonczeniaTrasy.totalfuel AS ZuzytePaliwoKoncowe,
DataRozpoczeciaTrasy.inputs AS StanInputsRozpoczecie, DataZakonczeniaTrasy.inputs AS StanInputsZakonczenie,
DataRozpoczeciaTrasy.eventid AS StanEventidRozpoczecie, DataZakonczeniaTrasy.eventid AS StanEventidZakonczenie
FROM DEVICE_DATA DataRozpoczeciaTrasy
JOIN DEVICE_DATA DataZakonczeniaTrasy ON DataRozpoczeciaTrasy.deviceid = DataZakonczeniaTrasy.deviceid AND mod(DataZakonczeniaTrasy.inputs,2)=0 AND DataZakonczeniaTrasy.eventid = 11 AND DataZakonczeniaTrasy.ts > DataRozpoczeciaTrasy.ts
WHERE mod(DataRozpoczeciaTrasy.inputs,2)=1
AND DataRozpoczeciaTrasy.eventid = 11
Następnie, aby wylistować wszystkie trasy dla wszystkich numerów ID wysyłam:
SELECT * FROM HistoriaTras Trasy
WHERE RoznicaCzasu = (SELECT MIN(Trasy1.RoznicaCzasu) FROM HistoriaTras Trasy1 WHERE Trasy.RozpoczecieTrasy = Trasy1.RozpoczecieTrasy)
Niestety baza zawiera 100 tysięcy wierszy - to i tak mało - a SELECT wykonuje się 982717.118 ms czyli dramatycznie długo.
Moje pytanie brzmi - w jaki sposób to przyśpieszyć? Dziękuje za pomoc.