objectbox / objectbox/objectbox-java
query use orderDesc is very slower than order
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Java
- Sterne
- 4.6k
- Forks
- 311
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
android 8.0 huawei P9
objectVersion:2.4.0
I inserted 12w pieces of data into Message table
@Entity
public class Message implements Serializable {
@Id
public long id;
@Index
private long serverId;
@Index
private String sid;
.......
}
the query method:
private void queryTest() {
queryTest(1);
queryTest(10);
queryTest(50);
queryTest(100);
queryTest(1000);
queryTest(3000);
queryTest(6000);
queryTest(10000);
}
private void queryTest(int queryNum) {
long time = SystemClock.uptimeMillis();
List<Message> messageList = Message.getMessageListByServerID2("k-007-liushengyun", Long.MIN_VALUE, queryNum);
Log.d(TAG, "queryTest queryNum =" + queryNum + ",size=" + messageList.size() + ",orderTime=" + (SystemClock.uptimeMillis() - time));
time = SystemClock.uptimeMillis();
messageList = Message.getMessageListByServerID3("k-007-liushengyun", Long.MIN_VALUE, queryNum);
Log.d(TAG, "queryTest queryNum =" + queryNum + ",size=" + messageList.size() + ",orderDescTime=" + (SystemClock.uptimeMillis() - time));
messageList.clear();
}
public static List<Message> getMessageListByServerID2(String sid, long minServerID, int count) {
try {
Query<Message> query = StoreManager.getBoxStore().boxFor(Message.class).query()
.equal(Message_.sid, sid)
.greater(Message_.serverId, minServerID).or().equal(Message_.serverId, minServerID)
.order(Message_.serverId).build();
return count > 0 ? query.find(0, count) : query.find();
} catch (Exception e) {
SogouPlus.onException(e);
return new LinkedList<>();
}
}
public static List<Message> getMessageListByServerID3(String sid, long minServerID, int count) {
try {
Query<Message> query = StoreManager.getBoxStore().boxFor(Message.class).query()
.equal(Message_.sid, sid)
.greater(Message_.serverId, minServerID).or().equal(Message_.serverId, minServerID)
.orderDesc(Message_.serverId).build();
return count > 0 ? query.find(0, count) : query.find();
} catch (Exception e) {
SogouPlus.onException(e);
return new LinkedList<>();
}
}
the query result:(ms)
queryTest queryNum =1,size=1,orderTime=71
queryTest queryNum =1,size=1,orderDescTime=301
queryTest queryNum =10,size=10,orderTime=72
queryTest queryNum =10,size=10,orderDescTime=581
queryTest queryNum =50,size=50,orderTime=73
queryTest queryNum =50,size=50,orderDescTime=908
queryTest queryNum =100,size=100,orderTime=75
queryTest queryNum =100,size=100,orderDescTime=1079
queryTest queryNum =1000,size=1000,orderTime=114
queryTest queryNum =1000,size=1000,orderDescTime=1952
queryTest queryNum =3000,size=3000,orderTime=175
queryTest queryNum =3000,size=3000,orderDescTime=2504
queryTest queryNum =6000,size=6000,orderTime=293
queryTest queryNum =6000,size=6000,orderDescTime=2846
queryTest queryNum =10000,size=10000,orderTime=483
queryTest queryNum =10000,size=10000,orderDescTime=3123
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit den gemeldeten Methoden getMessageListByServerID2 und getMessageListByServerID3 und reproduziere anschließend queryTest unter Android 8.0 mit dem Message-Datensatz mit 120.000 Zeilen. Vergleiche die Timings und Ergebnisse von order und orderDesc; abgeschlossen ist die Aufgabe, wenn das Verhalten der absteigenden Abfrage erklärt oder korrigiert und durch eine Regression-Prüfung abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- android, java
- Bereich
- database, mobile
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 25/100