objectbox / objectbox/objectbox-java

query use orderDesc is very slower than order

Offen
#778 8 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

enhancement
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

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.