2016-04-29 11 views
1

zu beschleunigen ich eine SQL-Abfrage bin mit Geld-Transaktionen aus meiner Orientdb Datenbank (v2.1.16)Orientdb: langsame Abfragen, die Hilfe benötigen, Index erstellen es

Die Abfrage läuft langsam abgerufen werden, und ich möchte wissen, wie man den Index erstellt, der es beschleunigt.

Die Abfrage ist:

SELECT timestamp, txId 
FROM MoneyTransaction 
WHERE (
    out("MoneyTransactionAccount").in("AccountMoneyProfile")[accountId] = :accountId 
    AND moneyType = :moneyType 
    AND :registerType IN registerQuantities.keys()  
)  
ORDER BY timestamp DESC, @rid DESC 

Ich habe auch eine andere Variante, die die Liste von einem bestimmten Zeitpunkt wieder aufgenommen:

SELECT timestamp, txId 
FROM MoneyTransaction 
WHERE (
    out("MoneyTransactionAccount").in("AccountMoneyProfile")[accountId] = :accountId 
    AND moneyType = :moneyType 
    AND :registerType IN registerQuantities.keys()  
) 
AND timestamp <= :cutoffTimestamp 
AND txId NOT IN :cutoffTxIds 

ORDER BY timestamp DESC, @rid DESC 

Die Schwierigkeit Ich habe versucht, herauszufinden, wie zu erstellen ein Index mit den komplexeren Feldern, nämlich das Feld accountId, das sich nicht innerhalb desselben Eckpunkts befindet, und das Feld registerType, das sich in einem EMBEDDEDMAP-Feld befindet.

Welchen Index würden Sie erstellen, um diese Abfrage zu beschleunigen? Oder wie würden Sie diese Abfrage umschreiben?

Meine Struktur ist wie folgt:

[Account] --> (1 to 1) AccountMoneyProfile --> [MoneyProfile] 
[MoneyTransaction] --> (n to 1) MoneyTransactionAccount --> [MoneyProfile] 

Wichtige Felder:

Account.accountId STRING 
MoneyTransaction.registerQuantities EMBEDDEDMAP 
MoneyTransaction.timestamp DATETIME 

Das Konto, das ich im Moment bin Holen hat etwa 500 MoneyTransaction Ecken daran befestigt.

+0

Hallo @hbCyber, könnten Sie ein Beispiel Ihrer Struktur posten? Wie viele Datensätze haben Sie in Ihrer DB? – LucaS

+0

@LucaS Danke für die Nachfrage, ich habe die obigen Details hinzugefügt. – hbCyber

+0

Hallo @hbCyber, sind Ihre Klassen ähnlich denen: 'Konto (accountId)', 'MoneyTransaction (txId, timestamp, registerQuantities, moneyType)', 'MoneyProfile (?)'? – LucaS

Antwort

1

über den Index Wahl hängt es von den Mengen des Datasets:

  • Wenn der Datensatz nicht sehr groß ist, könnten Sie einen SB-TREE Index verwenden, weil sie maintain Sortier- und Streckenbetrieb ermöglichen; Wenn das Dataset stattdessen sehr groß ist, können Sie ein HASH INDEX verwenden, das bei großen Zahlen funktionsfähiger ist und weniger Ressourcen verbraucht als andere Indizes, aber Bereichsoperationen nicht unterstützt.

In Ihrem Fall könnten Sie zum Beispiel erstellen, eine SB-TREE UNIQUE INDEX auf die accountId (zB Account.accountId) und schreiben Sie Ihre Frage in einer Weise, dass die Ziel Abfrage direkt den Index übereinstimmt und so, dass es liest weniger Datensätze als möglich. Beispiel:

SELECT timestamp, txId 
FROM (
    SELECT expand(out("AccountMoneyProfile").in("MoneyTransactionAccount")) 
    FROM Account 
    WHERE accountId = :accountId 
    ) 
WHERE moneyType = :moneyType AND :registerType IN registerQuantities.keys() 
ORDER BY timestamp DESC, @rid DESC 

Auf diese Weise können Sie direkt wählen Sie die Account Aufzeichnungen Sie suchen (durch den Index zuvor erstellten verwenden) und dann können Sie nur die angeschlossenen MoneyTransaction Datensätze abrufen.

Weitere Informationen zu Indizes finden Sie in der OrientDB official documentation.

Ein anderer Weg, basierte auf der Tatsache, dass Sie, dass MoneyProfile Klasse nicht enthält wichtige Daten angegeben (wenn ich richtig verstanden habe), könnte sein, um die Struktur zu ändern, die Suche direkter zu machen. Z.B.:

Bevor:

enter image description here

Nach (ich vorher einen neuen AccountMoneyTransaction Kantenklasse erstellt haben):

enter image description here

Hoffnung gewesen hilfreich

Verwandte Themen