objectbox / objectbox/objectbox-java

query use orderDesc is very slower than order

Aperta
#778 8 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

enhancement
Lingua principale
Java
Stelle
4.6k
Fork
311
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con i metodi segnalati getMessageListByServerID2 e getMessageListByServerID3, quindi riproduci queryTest su Android 8.0 con il dataset Message di 120.000 righe. Confronta i tempi e i risultati di order e orderDesc; il lavoro è completato quando il comportamento della query discendente è spiegato o corretto e coperto da un controllo di regressione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
android, java
Ambito
database, mobile
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.