2017-07-28 3 views
0

Ich habe eine Abfrage, die bis zu 2000 Dokumente zurückgeben kann. Innerhalb dieser Dokumente brauche ich sechs pcdata Elemente als String-Werte zurückgeben. Es gibt eine Möglichkeit, da die Größe der Dokumente von klein bis sehr groß ist, exp-Baum-Cache-Fehler.Task-Server auf ML

Ich schaue auf Spawn-Funktion, um meine Ergebnismenge zu brechen. Ich werde Wildcard-Werte übergeben, basierend auf der bekannten "eindeutigen Schlüsselstruktur", und weiß die maximale Anzahl der möglichen Ergebnisse, wobei jeder Platzhalterwert maximal 100 Dokumente zurückgibt. Hinweis: Die pcdata für die eindeutige Schlüsselstruktur haben einen Bereichsindex.

Bin ich auf der richtigen Spur mit unten? Der Task-Server erstellt drei Aufgaben. Der Task-Server ermöglicht die Ausführung mehrerer Abfragen, aber was verhindert, dass sie alle gleichzeitig ausgeführt werden und den Exp-Tree-Cache ausbluten? d. H. Was, wenn überhaupt, zwingt einen Thread, auf einen anderen zu warten? Oder eine Aufgabe, auf eine andere zu warten, damit sie den Exp-Tree-Cache nicht zusammen ausblasen?

xquery version "1.0-ml"; 
let $messages := 
(:each wildcard values will return 100 documents max:) 
for $message in ("WILDCARDVAL1","WILDCARDVAL2", "WILDCARDVAL3") 
let $_ := xdmp:log("Starting") 
return 
    xdmp:spawn-function(function() { 
    let $_ := xdmp:sleep(5000) 
    let $_ := xdmp:log(concat("Searching on wildcard val=", $message)) 
    return concat("100 pcdata items from the matched documents for ", $message) }, 
    <options xmlns="xdmp:eval"> 
     <result>true</result> 
     <transaction-mode>update-auto-commit</transaction-mode> 
    </options>) 
return $messages 

Antwort

1

Die Task Server-Konfiguration, die in der Admin-Benutzeroberfläche aufgeführt ist, definiert die maximale Anzahl simultaner Threads. Wenn mehr Aufgaben erzeugt werden als Threads, werden sie in die Warteschlange gestellt (FIFO, denke ich, obwohl ML9 über Aufgabenprioritätsoptionen verfügt, die dieses Verhalten ändern), und die erste in der Warteschlange stehende Aufgabe nimmt den nächsten verfügbaren Thread.

Die Option <result>true</result> erzwingt die Spawning-Abfrage blockiert, bis die Aufgaben zurückgeben. Die Aufgaben selbst werden unabhängig und parallel ausgeführt, und sie warten nicht aufeinander ab. Es kann immer noch zu Problemen mit dem erweiterten Baumcache kommen, aber wenn die Abfrage in kleinere aufgeteilt wird, ist dies möglicherweise weniger wahrscheinlich.

Um zu verstehen, warum Sie den Cache ausbluten, werfen Sie einen Blick auf die Funktionen xdmp:query-trace() und xdmp:query-meters(). Die Verwendung des Task-Servers ist eher eine Brute-Force-Lösung, und Sie werden wahrscheinlich bessere Ergebnisse erzielen, wenn Sie Ihre Abfragen mithilfe von Informationen aus diesen Funktionen optimieren.

Wenn Sie Ihre Abfrage nicht selektiver als 2000 Dokumente erstellen können, aber nur einige Zeichenfolgenwerte benötigen, können Sie Bereichsindizes für diese Werte erstellen und cts:values verwenden, um nur diese Werte direkt aus dem Index auszuwählen, gefiltert nach Abfrage. Diese Methode würde verhindern, dass die Datenbank Dokumente in den Cache lädt.

+0

Mit dem Platzhalterwerte werden übergeben, keine * individuelle * Aufgabe wird bei mehr als 100 Dokumenten funktionieren. Leider kann die Datenstruktur an dieser Stelle nicht wirklich geändert werden. Ich habe an Bereichsindex für Werte gedacht. – paulj

+0

Ich habe verstanden, dass sie nicht aufeinander gewartet haben , aber sie würden nicht "laufen", wenn Ressourcen nicht verfügbar wären, dh 8 Aufgaben laufen alle mit dem Exp-Tree-Cache, so dass sie "blockieren" ly resource sind die max-threads, die sie in die warteschlange zwingen. – paulj

+1

@paulj Ja, aber wenn Sie die Jobs aufteilen, können Sie verhindern, dass der Cache auf einmal hochfährt. In diesem Fall sind möglicherweise weniger Task-Threads für Ihre Abfrage besser.Alles, was Dokumente liest, liest aus dem erweiterten Baum-Cache, der auf einer Thread-Ebene nicht blockiert. Reichweitenindizes sind wahrscheinlich die beste Wahl. – wst

1

Es kann effizienter sein, die Fähigkeit von MarkLogic zu verwenden, Co-Vorkommen oder sogar 3+ Tupel von Wertkombinationen aus Dokumenten zurückzugeben, die Funktionen wie cts:values verwenden. Sie können in einer Mischung (cts:uri-reference] (http://docs.marklogic.com/cts:uri-reference) das Dokument uri zurück als Teil der Tupeln zu erhalten.

Es erfordert Bereich Indizes auf all diesen Werten obwohl ..

HTH!