1
0
Fork 0

Merge branch 'devel' of https://github.com/arangodb/arangodb into devel

This commit is contained in:
Jan Steemann 2015-10-22 11:42:09 +02:00
commit adca9a029d
4 changed files with 212 additions and 7 deletions

View File

@ -12,29 +12,46 @@ meaning that an optimization should not modify the result of a query. A notable
to this is that the optimizer is allowed to change the order of results for queries that
do not explicitly specify how results should be sorted.
!SUBSECTION Execution plans
The `explain` command can be used to query the optimal executed plan or even all plans
the optimizer has generated. Additionally, `explain` can reveal some more information
about the optimizer's view of the query.
Here's an example that shows the execution plan for a simple query, using the `explain`
method of `ArangoStatement`:
!SUBSECTION Inspecting plans using the explain helper
@startDocuBlockInline AQLEXP_01_explainCreate
@EXAMPLE_ARANGOSH_OUTPUT{AQLEXP_01_explainCreate}
The `explain` method of `ArangoStatement` as shown in the next chapters creates very verbose output.
You can work on the output programaticaly, or use this handsome tool that we created
to generate a more human readable representation.
You may use it like this: (we disable syntax highlighting here)
@startDocuBlockInline AQLEXP_01_axplainer
@EXAMPLE_ARANGOSH_OUTPUT{AQLEXP_01_axplainer}
~addIgnoreCollection("test")
db._create("test");
for (i = 0; i < 100; ++i) { db.test.save({ value: i }); }
db.test.ensureIndex({ type: "skiplist", fields: [ "value" ] });
var explain = require("org/arangodb/aql/explainer").explain;
explain("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value", {colors:false});
@END_EXAMPLE_ARANGOSH_OUTPUT
@endDocuBlock AQLEXP_01_axplainer
!SUBSECTION Execution plans in detail
Lets have a look at the raw json output of the same execution plan
using the `explain` method of `ArangoStatement`:
@startDocuBlockInline AQLEXP_01_explainCreate
@EXAMPLE_ARANGOSH_OUTPUT{AQLEXP_01_explainCreate}
stmt = db._createStatement("FOR i IN test FILTER i.value > 97 SORT i.value RETURN i.value");
stmt.explain();
@END_EXAMPLE_ARANGOSH_OUTPUT
@endDocuBlock AQLEXP_01_explainCreate
The result details will be very verbose so they are not shown here in full. Instead,
let's take a closer look at the results step by step.
The as you can see, result details are very verbose so we will not shown them in full in the next
sections. Instead, lets take a closer look at the results step by step.
!SUBSUBSECTION Execution nodes

View File

@ -0,0 +1,44 @@
arangosh&gt; db._create(<span class="hljs-string">"test"</span>);
[ArangoCollection <span class="hljs-number">1092291992475</span>, <span class="hljs-string">"test"</span> (type <span class="hljs-built_in">document</span>, status loaded)]
arangosh&gt; <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">100</span>; ++i) { db.test.save({ value: i }); }
arangosh&gt; db.test.ensureSkiplist(<span class="hljs-string">"value"</span>);
{
<span class="hljs-string">"id"</span> : <span class="hljs-string">"test/1092311980955"</span>,
<span class="hljs-string">"type"</span> : <span class="hljs-string">"skiplist"</span>,
<span class="hljs-string">"fields"</span> : [
<span class="hljs-string">"value"</span>
],
<span class="hljs-string">"unique"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"sparse"</span> : <span class="hljs-literal">false</span>,
<span class="hljs-string">"isNewlyCreated"</span> : <span class="hljs-literal">true</span>,
<span class="hljs-string">"code"</span> : <span class="hljs-number">201</span>
}
arangosh&gt; <span class="hljs-keyword">var</span> explain = <span class="hljs-built_in">require</span>(<span class="hljs-string">"org/arangodb/aql/explainer"</span>).explain;
arangosh&gt; explain(<span class="hljs-string">"FOR i IN test FILTER i.value &gt; 97 SORT i.value RETURN i.value"</span>, {colors:<span class="hljs-literal">false</span>});
Query string:
FOR i IN test FILTER i.value &gt; <span class="hljs-number">97</span> SORT i.value RETURN i.value
Execution plan:
Id NodeType Est. Comment
<span class="hljs-number">1</span> SingletonNode <span class="hljs-number">1</span> * ROOT
<span class="hljs-number">9</span> IndexNode <span class="hljs-number">50</span> - FOR i IN test <span class="hljs-comment">/* skiplist index scan */</span>
<span class="hljs-number">5</span> CalculationNode <span class="hljs-number">50</span> - LET #<span class="hljs-number">3</span> = i.<span class="hljs-string">`value`</span> <span class="hljs-comment">/* attribute expression */</span> <span class="hljs-comment">/* collections used: i : test */</span>
<span class="hljs-number">8</span> ReturnNode <span class="hljs-number">50</span> - RETURN #<span class="hljs-number">3</span>
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
<span class="hljs-number">9</span> skiplist test <span class="hljs-literal">false</span> <span class="hljs-literal">false</span> n/a [ <span class="hljs-string">`value`</span> ] i.<span class="hljs-string">`value`</span> &gt; <span class="hljs-number">97</span>
Optimization rules applied:
Id RuleName
<span class="hljs-number">1</span> move-calculations-up
<span class="hljs-number">2</span> move-filters-up
<span class="hljs-number">3</span> remove-redundant-calculations
<span class="hljs-number">4</span> remove-unnecessary-calculations
<span class="hljs-number">5</span> move-calculations-up-<span class="hljs-number">2</span>
<span class="hljs-number">6</span> move-filters-up-<span class="hljs-number">2</span>
<span class="hljs-number">7</span> use-indexes
<span class="hljs-number">8</span> remove-filter-covered-by-index
<span class="hljs-number">9</span> use-index-<span class="hljs-keyword">for</span>-sort

View File

@ -0,0 +1,75 @@
arangosh&gt; <span class="hljs-keyword">var</span> examples = <span class="hljs-built_in">require</span>(<span class="hljs-string">"org/arangodb/graph-examples/example-graph.js"</span>);
arangosh&gt; <span class="hljs-keyword">var</span> g = examples.loadGraph(<span class="hljs-string">"knows_graph"</span>);
arangosh&gt; db.persons.toArray()
[
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Charlie"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"persons/charlie"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092164590491"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"charlie"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Bob"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"persons/bob"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092164328347"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"bob"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Eve"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"persons/eve"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092164983707"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"eve"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Dave"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"persons/dave"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092164787099"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"dave"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Alice"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"persons/alice"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092164131739"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"alice"</span>
}
]
arangosh&gt; db.knows.toArray();
[
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"knows/1092165835675"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092165835675"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"1092165835675"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"persons/eve"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"persons/alice"</span>
},
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"knows/1092165639067"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092165639067"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"1092165639067"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"persons/bob"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"persons/dave"</span>
},
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"knows/1092165245851"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092165245851"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"1092165245851"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"persons/alice"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"persons/bob"</span>
},
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"knows/1092165442459"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092165442459"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"1092165442459"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"persons/bob"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"persons/charlie"</span>
},
{
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"knows/1092166032283"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092166032283"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"1092166032283"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"persons/eve"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"persons/bob"</span>
}
]
arangosh&gt; examples.dropGraph(<span class="hljs-string">"knows_graph"</span>);
<span class="hljs-literal">true</span>

View File

@ -0,0 +1,69 @@
arangosh&gt; <span class="hljs-keyword">var</span> examples = <span class="hljs-built_in">require</span>(<span class="hljs-string">"org/arangodb/graph-examples/example-graph.js"</span>);
arangosh&gt; <span class="hljs-keyword">var</span> graph = examples.loadGraph(<span class="hljs-string">"social"</span>);
arangosh&gt; db.female.toArray()
[
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Diana"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"female/diana"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092171340699"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"diana"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Alice"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"female/alice"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092170619803"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"alice"</span>
}
]
arangosh&gt; db.male.toArray()
[
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Bob"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"male/bob"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092170947483"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"bob"</span>
},
{
<span class="hljs-string">"name"</span> : <span class="hljs-string">"Charly"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"male/charly"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092171144091"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"charly"</span>
}
]
arangosh&gt; db.relation.toArray()
[
{
<span class="hljs-string">"type"</span> : <span class="hljs-string">"friend"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"relation/bobAndDiana"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092172323739"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"bobAndDiana"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"male/bob"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"female/diana"</span>
},
{
<span class="hljs-string">"type"</span> : <span class="hljs-string">"married"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"relation/charlyAndDiana"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092172127131"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"charlyAndDiana"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"male/charly"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"female/diana"</span>
},
{
<span class="hljs-string">"type"</span> : <span class="hljs-string">"friend"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"relation/aliceAndCharly"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092171930523"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"aliceAndCharly"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"female/alice"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"male/charly"</span>
},
{
<span class="hljs-string">"type"</span> : <span class="hljs-string">"married"</span>,
<span class="hljs-string">"_id"</span> : <span class="hljs-string">"relation/aliceAndBob"</span>,
<span class="hljs-string">"_rev"</span> : <span class="hljs-string">"1092171668379"</span>,
<span class="hljs-string">"_key"</span> : <span class="hljs-string">"aliceAndBob"</span>,
<span class="hljs-string">"_from"</span> : <span class="hljs-string">"female/alice"</span>,
<span class="hljs-string">"_to"</span> : <span class="hljs-string">"male/bob"</span>
}
]
arangosh&gt; examples.dropGraph(<span class="hljs-string">"social"</span>);
<span class="hljs-literal">true</span>