mirror of https://gitee.com/bigwinds/arangodb
Minor documentation changes, part 1 (from devel, squashed): (#3957)
* Add WITH to graph traversal syntax * State clearer what where whitespace is ignored in conf files * Add cross-references between POSITION() and CONTAINS() * Mention GeoJSON in the description of the useLonLat option * Troubleshooting: unexpected long running queries Add remark that collection literals are inferior to FOR constructs and should not be used accidentally instead of variable names * Add storage engine comparison table, replace hint to note that users might want to pick RocksDB for an installation * CSS: No margin extra margin after last paragraph in callouts / hint boxes
This commit is contained in:
parent
673ab08142
commit
7d39cf6caa
|
@ -29,6 +29,69 @@ RETURN CONCAT("foo", 123) // [ "foo123" ]
|
||||||
RETURN CONCAT("123", 200) // [ "123200" ]
|
RETURN CONCAT("123", 200) // [ "123200" ]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Unexpected long running queries
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Slow queries can have various reasons and be legitimate for queries with a high
|
||||||
|
computational complexity or if they touch a lot of data. Use the *Explain*
|
||||||
|
feature to inspect execution plans and verify that appropriate indexes are
|
||||||
|
utilized. Also check for mistakes such as references to the wrong variables.
|
||||||
|
|
||||||
|
A literal collection name, which is not part of constructs like `FOR`,
|
||||||
|
`UPDATE ... IN` etc., stands for an array of all documents of that collection
|
||||||
|
and can cause an entire collection to be materialized before further
|
||||||
|
processing. It should thus be avoided.
|
||||||
|
|
||||||
|
Check the execution plan for `/* all collection documents */` and verify that
|
||||||
|
it is intended. You should also see a warning if you execute such a query:
|
||||||
|
|
||||||
|
> collection 'coll' used as expression operand
|
||||||
|
|
||||||
|
For example, instead of:
|
||||||
|
|
||||||
|
```js
|
||||||
|
RETURN coll[* LIMIT 1]
|
||||||
|
```
|
||||||
|
|
||||||
|
... with the execution plan ...
|
||||||
|
|
||||||
|
```
|
||||||
|
Execution plan:
|
||||||
|
Id NodeType Est. Comment
|
||||||
|
1 SingletonNode 1 * ROOT
|
||||||
|
2 CalculationNode 1 - LET #2 = coll /* all collection documents */[* LIMIT 0, 1] /* v8 expression */
|
||||||
|
3 ReturnNode 1 - RETURN #2
|
||||||
|
```
|
||||||
|
|
||||||
|
... you can use the following equivalent query:
|
||||||
|
|
||||||
|
```js
|
||||||
|
FOR doc IN coll
|
||||||
|
LIMIT 1
|
||||||
|
RETURN doc
|
||||||
|
```
|
||||||
|
|
||||||
|
... with the (better) execution plan:
|
||||||
|
|
||||||
|
```
|
||||||
|
Execution plan:
|
||||||
|
Id NodeType Est. Comment
|
||||||
|
1 SingletonNode 1 * ROOT
|
||||||
|
2 EnumerateCollectionNode 44 - FOR doc IN Characters /* full collection scan */
|
||||||
|
3 LimitNode 1 - LIMIT 0, 1
|
||||||
|
4 ReturnNode 1 - RETURN doc
|
||||||
|
```
|
||||||
|
|
||||||
|
Similarly, make sure you have not confused any variable names with collection
|
||||||
|
names by accident:
|
||||||
|
|
||||||
|
```js
|
||||||
|
LET names = ["John", "Mary", ...]
|
||||||
|
// supposed to refer to variable "names", not collection "Names"
|
||||||
|
FOR name IN Names
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
Rename to Error Sources?
|
Rename to Error Sources?
|
||||||
|
|
|
@ -199,6 +199,9 @@ Return whether *search* is contained in *array*. Optionally return the position.
|
||||||
*false* otherwise. If *returnIndex* is enabled, the position of the match is
|
*false* otherwise. If *returnIndex* is enabled, the position of the match is
|
||||||
returned (positions start at 0), or *-1* if it's not found.
|
returned (positions start at 0), or *-1* if it's not found.
|
||||||
|
|
||||||
|
To determine if or at which position a string occurs in another string, see the
|
||||||
|
[CONTAINS() string function](String.md#contains).
|
||||||
|
|
||||||
### PUSH()
|
### PUSH()
|
||||||
|
|
||||||
`PUSH(anyArray, value, unique) → newArray`
|
`PUSH(anyArray, value, unique) → newArray`
|
||||||
|
|
|
@ -134,8 +134,8 @@ This can be changed by setting the 3rd parameter to *true* to interpret the poin
|
||||||
points of the polygon
|
points of the polygon
|
||||||
- **coord** (array): the search coordinate as a number array with two elements
|
- **coord** (array): the search coordinate as a number array with two elements
|
||||||
- **useLonLat** (bool, *optional*): if set to *true*, the coordinates in *polygon* and
|
- **useLonLat** (bool, *optional*): if set to *true*, the coordinates in *polygon* and
|
||||||
the search coordinate *coord* will be interpreted as *[lon, lat]*. The default is
|
the search coordinate *coord* will be interpreted as *[lon, lat]* (GeoJSON).
|
||||||
*false* and the format *[lat, lon]* is expected.
|
The default is *false* and the format *[lat, lon]* is expected.
|
||||||
- returns **bool** (bool): *true* if the point *coord* is inside the *polygon* or
|
- returns **bool** (bool): *true* if the point *coord* is inside the *polygon* or
|
||||||
*false* if it's not. The result is undefined (can be *true* or *false*) if the
|
*false* if it's not. The result is undefined (can be *true* or *false*) if the
|
||||||
specified point is exactly on a boundary of the polygon.
|
specified point is exactly on a boundary of the polygon.
|
||||||
|
|
|
@ -101,6 +101,9 @@ CONTAINS("foobarbaz", "ba", true) // 3
|
||||||
CONTAINS("foobarbaz", "horse", true) // -1
|
CONTAINS("foobarbaz", "horse", true) // -1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To determine if or at which position a value is included in an array, see the
|
||||||
|
[POSITION() array function](Array.md#position).
|
||||||
|
|
||||||
### COUNT()
|
### COUNT()
|
||||||
|
|
||||||
This is an alias for [LENGTH()](#length).
|
This is an alias for [LENGTH()](#length).
|
||||||
|
|
|
@ -12,13 +12,17 @@ There are two slightly different syntaxes for traversals in AQL, one for
|
||||||
### Working with named graphs
|
### Working with named graphs
|
||||||
|
|
||||||
```
|
```
|
||||||
|
[WITH collection1[, collection2[, ...collectionN]]]
|
||||||
FOR vertex[, edge[, path]]
|
FOR vertex[, edge[, path]]
|
||||||
IN [min[..max]]
|
IN [min[..max]]
|
||||||
OUTBOUND|INBOUND|ANY startVertex
|
OUTBOUND|INBOUND|ANY startVertex
|
||||||
GRAPH graphName
|
GRAPH graphName
|
||||||
[OPTIONS options]
|
[OPTIONS options]
|
||||||
```
|
```
|
||||||
|
- `WITH`: optional for single server instances, but required for
|
||||||
|
[graph traversals in a cluster](#graph-traversals-in-a-cluster).
|
||||||
|
- **collections** (collection, *repeatable*): list of collections that will
|
||||||
|
be involved in the traversal
|
||||||
- `FOR`: emits up to three variables:
|
- `FOR`: emits up to three variables:
|
||||||
- **vertex** (object): the current vertex in a traversal
|
- **vertex** (object): the current vertex in a traversal
|
||||||
- **edge** (object, *optional*): the current edge in a traversal
|
- **edge** (object, *optional*): the current edge in a traversal
|
||||||
|
@ -76,6 +80,7 @@ FOR vertex[, edge[, path]]
|
||||||
### Working with collection sets
|
### Working with collection sets
|
||||||
|
|
||||||
```
|
```
|
||||||
|
[WITH collection1[, collection2[, ...collectionN]]]
|
||||||
FOR vertex[, edge[, path]]
|
FOR vertex[, edge[, path]]
|
||||||
IN [min[..max]]
|
IN [min[..max]]
|
||||||
OUTBOUND|INBOUND|ANY startVertex
|
OUTBOUND|INBOUND|ANY startVertex
|
||||||
|
@ -113,13 +118,13 @@ collection in your traversal.
|
||||||
### Graph traversals in a cluster
|
### Graph traversals in a cluster
|
||||||
|
|
||||||
Due to the nature of graphs, edges may reference vertices from arbitrary
|
Due to the nature of graphs, edges may reference vertices from arbitrary
|
||||||
collections. Following the path can thus involve documents from various
|
collections. Following the paths can thus involve documents from various
|
||||||
collections and it's not possible to predict which will be visited in a
|
collections and it's not possible to predict which will be visited in a
|
||||||
traversal. Hence, which collections need to be locked can only be determined
|
traversal. Hence, which collections need to be locked can only be determined
|
||||||
at run time. Deadlocks may occur under certain circumstances.
|
at run time. Deadlocks may occur under certain circumstances.
|
||||||
|
|
||||||
Please consider to use the [`WITH` statement](../Operations/With.md) to
|
Please consider to use the [`WITH` statement](../Operations/With.md) to
|
||||||
specify the collections you expect to be involved.
|
specify the collections you expect to be involved.
|
||||||
|
|
||||||
Using filters and the explainer to extrapolate the costs
|
Using filters and the explainer to extrapolate the costs
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
|
|
|
@ -23,6 +23,10 @@ div.example_show_button {
|
||||||
margin-bottom: 0.85em;
|
margin-bottom: 0.85em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.book .book-body .alert p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.columns-3 {
|
.columns-3 {
|
||||||
-webkit-column-count: 3;
|
-webkit-column-count: 3;
|
||||||
-moz-column-count: 3;
|
-moz-column-count: 3;
|
||||||
|
|
|
@ -23,6 +23,10 @@ div.example_show_button {
|
||||||
margin-bottom: 0.85em;
|
margin-bottom: 0.85em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.book .book-body .alert p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.columns-3 {
|
.columns-3 {
|
||||||
-webkit-column-count: 3;
|
-webkit-column-count: 3;
|
||||||
-moz-column-count: 3;
|
-moz-column-count: 3;
|
||||||
|
|
|
@ -23,6 +23,10 @@ div.example_show_button {
|
||||||
margin-bottom: 0.85em;
|
margin-bottom: 0.85em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.book .book-body .alert p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.columns-3 {
|
.columns-3 {
|
||||||
-webkit-column-count: 3;
|
-webkit-column-count: 3;
|
||||||
-moz-column-count: 3;
|
-moz-column-count: 3;
|
||||||
|
|
|
@ -51,8 +51,7 @@ Only command line options with a value should be set within the configuration
|
||||||
file. Command line options which act as flags should be entered on the command
|
file. Command line options which act as flags should be entered on the command
|
||||||
line when starting the server.
|
line when starting the server.
|
||||||
|
|
||||||
Whitespace in the configuration file is ignored. Each option is specified on a
|
Each option is specified on a separate line in the form:
|
||||||
separate line in the form
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
key = value
|
key = value
|
||||||
|
@ -79,6 +78,19 @@ So you see in general `--section.param value` translates to
|
||||||
param=value
|
param=value
|
||||||
```
|
```
|
||||||
|
|
||||||
|
{% hint 'warning' %}
|
||||||
|
Whitespace around `=` is ignored in the configuration file. Do not put spaces
|
||||||
|
around additional `=` in the parameter value however. The following example
|
||||||
|
shows the correct way to specify a log level of `trace` for the topic `startup`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
log.level = startup=trace
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that there is no whitespace between `startup` and `=`, and also not `=`
|
||||||
|
and `trace`.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
Where one section may occur multiple times, and the last occurance of `param`
|
Where one section may occur multiple times, and the last occurance of `param`
|
||||||
will become the final value. In case of parameters being vectors, multiple
|
will become the final value. In case of parameters being vectors, multiple
|
||||||
occurance adds another item to the vector. Vectors can be identified by the
|
occurance adds another item to the vector. Vectors can be identified by the
|
||||||
|
@ -104,4 +116,4 @@ or
|
||||||
--configuration none
|
--configuration none
|
||||||
```
|
```
|
||||||
|
|
||||||
When starting up the server. Note that, the word *none* is case-insensitive.
|
when starting up the server. Note that, the word *none* is case-insensitive.
|
||||||
|
|
|
@ -5,21 +5,32 @@ engine. The storage engine is responsible for persisting the documents
|
||||||
on disk, holding copies in memory, providing indexes and caches to
|
on disk, holding copies in memory, providing indexes and caches to
|
||||||
speed up queries.
|
speed up queries.
|
||||||
|
|
||||||
Up to version 3.1 ArangoDB only supported memory mapped files (MMFILES)
|
Up to version 3.1 ArangoDB only supported memory mapped files (MMFiles)
|
||||||
as sole storage engine. Beginning with 3.2 ArangoDB has support for
|
as sole storage engine. Beginning with 3.2 ArangoDB has support for
|
||||||
pluggable storage engines. The second supported engine is RocksDB from
|
pluggable storage engines. The second supported engine is RocksDB from
|
||||||
Facebook.
|
Facebook.
|
||||||
|
|
||||||
|
| MMFiles | RocksDB |
|
||||||
|
|---|---|
|
||||||
|
| default | optional |
|
||||||
|
| dataset needs to fit into memory | work with as much data as fits on disk |
|
||||||
|
| indexes in memory | hot set in memory, data and indexes on disk |
|
||||||
|
| slow restart due to index rebuilding | fast startup (no rebuilding of indexes) |
|
||||||
|
| volatile collections (only in memory, optional) | collection data always persisted |
|
||||||
|
| collection level locking (writes block reads) | concurrent reads and writes |
|
||||||
|
|
||||||
|
*Blog article: [Comparing new RocksDB and MMFiles storage engines](https://www.arangodb.com/why-arangodb/comparing-rocksdb-mmfiles-storage-engines/)*
|
||||||
|
|
||||||
RocksDB is an embeddable persistent key-value store. It is a log
|
RocksDB is an embeddable persistent key-value store. It is a log
|
||||||
structure database and is optimized for fast storage.
|
structure database and is optimized for fast storage.
|
||||||
|
|
||||||
The MMFILES engine is optimized for the use-case where the data fits
|
The MMFiles engine is optimized for the use-case where the data fits
|
||||||
into the main memory. It allows for very fast concurrent
|
into the main memory. It allows for very fast concurrent
|
||||||
reads. However, writes block reads and locking is on collection
|
reads. However, writes block reads and locking is on collection
|
||||||
level. Indexes are always in memory and are rebuilt on startup. This
|
level. Indexes are always in memory and are rebuilt on startup. This
|
||||||
gives better performance but imposes a longer startup time.
|
gives better performance but imposes a longer startup time.
|
||||||
|
|
||||||
The ROCKSDB engine is optimized for large data-sets and allows for a
|
The RocksDB engine is optimized for large data-sets and allows for a
|
||||||
steady insert performance even if the data-set is much larger than the
|
steady insert performance even if the data-set is much larger than the
|
||||||
main memory. Indexes are always stored on disk but caches are used to
|
main memory. Indexes are always stored on disk but caches are used to
|
||||||
speed up performance. RocksDB uses document-level locks allowing for
|
speed up performance. RocksDB uses document-level locks allowing for
|
||||||
|
@ -45,7 +56,7 @@ The main advantages of RocksDB are
|
||||||
### Caveats
|
### Caveats
|
||||||
|
|
||||||
RocksDB allows concurrent writes. However, when touching the same document a
|
RocksDB allows concurrent writes. However, when touching the same document a
|
||||||
write conflict is raised. This cannot happen with the MMFILES engine, therefore
|
write conflict is raised. This cannot happen with the MMFiles engine, therefore
|
||||||
applications that switch to RocksDB need to be prepared that such exception can
|
applications that switch to RocksDB need to be prepared that such exception can
|
||||||
arise. It is possible to exclusively lock collections when executing AQL. This
|
arise. It is possible to exclusively lock collections when executing AQL. This
|
||||||
will avoid write conflicts but also inhibits concurrent writes.
|
will avoid write conflicts but also inhibits concurrent writes.
|
||||||
|
|
|
@ -35,7 +35,9 @@ startup parameters, installation in a cluster and so on, see
|
||||||
[Installing](Installing/README.md).
|
[Installing](Installing/README.md).
|
||||||
|
|
||||||
{% hint 'info' %}
|
{% hint 'info' %}
|
||||||
Want help? Read more about [**consulting, training and developer support**](https://www.arangodb.com/subscriptions/)
|
ArangoDB offers two [**storage engines**](../Architecture/StorageEngines.md):
|
||||||
|
MMFiles and RocksDB. Choose the one which suits your needs best in the
|
||||||
|
installation process or on first startup.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Securing the installation
|
### Securing the installation
|
||||||
|
|
|
@ -23,6 +23,10 @@ div.example_show_button {
|
||||||
margin-bottom: 0.85em;
|
margin-bottom: 0.85em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.book .book-body .alert p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.columns-3 {
|
.columns-3 {
|
||||||
-webkit-column-count: 3;
|
-webkit-column-count: 3;
|
||||||
-moz-column-count: 3;
|
-moz-column-count: 3;
|
||||||
|
|
Loading…
Reference in New Issue