我正在開發一個跟蹤用戶當前位置並將其存儲到SQLite數據庫的應用程序。一切工作正常,但現在我有問題時查詢數據庫超過1000條記錄的軌道,它需要近1.5分鐘。在我的桌面上,它只需要1秒。爲Android sqlite優化SQL語句
我知道這是一個查詢與許多子選擇,但我不能以另一種方式得到正確的結果。在我看來,這屬於像avg()和sum()這樣的集合函數。
這裏是我的查詢:
Cursor c = readableDB
.rawQuery(
"SELECT DISTINCT t._id , title , strftime('%Y-%m-%d' , starttime , 'unixepoch' , 'localtime') as date , description, "
+ "round((SELECT sum(distToPrev)/1000 FROM positions p WHERE p.trackid=t._id) , 2) as distance , "
+ "(SELECT count(latitude) FROM positions p WHERE p.trackid=t._id) as waypoints, "
+ "(SELECT (avg(speed)*3.6) FROM positions p WHERE p.trackid=t._id) as avgspeed, "
+ "(SELECT (max(speed)*3.6) FROM positions p WHERE p.trackid=t._id) as maxspeed, "
+ "(SELECT sum(altitudeUP) FROM positions p WHERE p.trackid=t._id) as climb , "
+ "(SELECT avg(heartbeat) FROM heartbeats h WHERE h.trackid=t._id) as avgheartbeat , "
+ "(SELECT max(heartbeat) FROM heartbeats h WHERE h.trackid=t._id) as maxheartbeat , "
+ "(SELECT avg(cadence) FROM heartbeats h WHERE h.trackid=t._id) as avgcadence "
+ "FROM tracks t LEFT JOIN heartbeats h ON t._id = h.trackid WHERE t._id = ?",
new String[]{String.valueOf(trackId)});
c.moveToFirst();
我怎樣才能優化這個查詢?我已經以這種方式嘗試過了,但結果是錯誤的,花費了相同的時間。
SELECT t._id , title , strftime('%Y-%m-%d' , starttime , 'unixepoch' , 'localtime') as date , description,
sum(distToPrev)/1000 as distance ,
count(latitude) as waypoints,
(avg(speed)*3.6) as avgspeed,
(max(speed)*3.6) as maxspeed,
sum(altitudeUP) as climb ,
avg(heartbeat) as avgheartbeat ,
max(heartbeat) as maxheartbeat ,
avg(cadence) as avgcadence
FROM tracks t
LEFT JOIN heartbeats h ON t._id = h.trackid
INNER JOIN positions p ON t._id = p.trackid
WHERE t._id = ?
由於2個小時我正在尋找解決方案,我不知道我在做什麼錯。也許我必須休息一下。
編輯:
在這裏,我創建語句:
CREATE TABLE heartbeats(_id INTEGER PRIMARY KEY AUTOINCREMENT, trackid INTEGER NOT NULL, heartbeat INTEGER NOT NULL, cadence INTEGER, timestamp TIMESTAMP);
CREATE TABLE positions(_id INTEGER PRIMARY KEY AUTOINCREMENT, trackid INTEGER NOT NULL, longitude REAL NOT NULL, latitude REAL NOT NULL, altitude REAL, altitudeUP REAL, speed REAL, accuracy REAL, distToPrev REAL, timestamp TIMESTAMP);
CREATE TABLE tracks(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, starttime DATETIME NOT NULL, endtime DATETIME);
指定表別名,但無法將它們用於第一個SELECT列之外。我們不知道哪些表的剩餘部分來自於能夠建議任何有價值的東西...... – 2010-07-23 17:56:15
請張貼您的表架構,幷包括您也有的索引。 – Pentium10 2010-07-23 17:57:19
添加了我的創建語句。表格中沒有索引。 – tarantel 2010-07-23 18:23:06