2009-09-25 2 views

Antwort

23

Ja, es wird die Größe Ihres Indexes erhöhen, weil CouchDB das gesamte Dokument in diesen Fällen effektiv kopiert. Verwenden Sie für Fälle, in denen Sie können, include_docs=true.

Es gibt jedoch eine Race Condition, die beachtet werden muss, wenn Sie diese verwenden, die im Wiki erwähnt wird. Während der Zeit zwischen dem Lesen der Ansichtsdaten und dem Abrufen des Dokuments ist es möglich, dass das Dokument geändert wurde (oder gelöscht wurde; in diesem Fall wird _deletedtrue sein). Dies ist dokumentiert unter here unter "Abfrageoptionen".

+0

perfekt, danke. Ich erinnere mich, über die Race Condition gelesen zu haben, aber die Nebenwirkung des Einschließens des Docs in die Emission kam mir erst später in den Sinn. – kolosy

2

Dies ist ein klassisches Zeit/Raum-Kompromiss.

Durch das Ausgeben von Dokumentendaten in den Index wird die Größe der Indexdatei auf der Festplatte erhöht, da CouchDB die ausgegebenen Daten direkt in die Indexdatei einfügt. Dies bedeutet jedoch, dass CouchDB beim Abfragen Ihrer Daten den Inhalt direkt aus der Indexdatei auf dem Datenträger streamen kann. Das ist offensichtlich ziemlich schnell.

Wenn Sie stattdessen auf include_docs=true vertrauen, verringert sich die Größe Ihres Indexes auf der Festplatte. Bei der Abfrage muss CouchDB jedoch für jede zurückgegebene Zeile ein Dokument lesen. Dies beinhaltet im Wesentlichen zufällige Dokumenten-Lookups aus der Hauptdatendatei, was bedeutet, dass die Kosten und die Zeit der Rücksendung von Daten signifikant ansteigen.

Während der Zeitunterschied bei kleinen Dokumentenmengen langsam ist, summiert er sich bei jedem Aufruf der Anwendung. Für mich ist daher das Ausgeben von benötigten Feldern aus einem Dokument in den Index normalerweise der richtige Aufruf - die Platte ist billig, die Aufmerksamkeit des Benutzers ist weniger groß. Dies ist im Großen und Ganzen vergleichbar mit der Verwendung von Indizes in einer relationalen Datenbank, ein weiterer weithin geäußerter Ratschlag.

Ich tat eine völlig unwissenschaftliche test on this, um ein Gefühl dafür zu bekommen, was der Unterschied ist. Ich fand eine 8-fache Erhöhung der Antwortzeit und 50% Erhöhung der CPU bei Verwendung von include_docs=true zum Lesen von 100.000 Dokumenten aus einer Ansicht im Vergleich zu einer Ansicht, in der die Dokumente direkt in den Index selbst ausgegeben wurden.