Skip to content

Instantly share code, notes, and snippets.

@kanonji
Last active December 24, 2015 11:29
Show Gist options
  • Save kanonji/6791695 to your computer and use it in GitHub Desktop.
Save kanonji/6791695 to your computer and use it in GitHub Desktop.
mongo mongodb aggregate aggregation

Aggregation Frameworkのクエリーログをなんとかして得る方法

方法1(多分無理)

db.system.profile.find();

Profiling Levelsの設定次第ですが、スロークエリーがdb.system.profileに格納されているので、ここから探す。 ただ、明らかにスロークエリーなはずのaggregate()で発行したクエリーが、何故かここから見つけられなかったので、もしかしたらAggregation Frameworkのクエリーはここには入らないのかもしれない。

Profiling Levelsについて詳しく

http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

方法2(多分無理)

db.currentOp();

mongo shellでdb.currentOp()を使うと、発行時点で実行中のクエリーが見られる。 同時に複数のクエリーが走っているので、1個じゃなく全部(じゃ無いかもだけど複数)のクエリーが表示される。 重たいaggregate()クエリーを実行させて、終わる前にdb.currentOp()を使うと見られるはず。

db.currentOp()
"opid" : -2016542264,
"active" : false,
"lockType" : "write",
"waitingForLock" : true,
"op" : "update",
"ns" : "",
"query" :
{ "$msg" : "query not recording (too large)" },
"client" : "X.X.X.X:42135",
"desc" : "conn",
"threadId" : "0x7f10f7cf8700",
"connectionId" : 754951,
"numYields" : 0

https://jira.mongodb.org/browse/SERVER-5605

query not recording (too large)となって、肝心のクエリーが見られない事がありました。 db.system.profileに入ってなかったのも、もしかしたらこれに該当したクエリーだからだったのかもしれない。

方法3

$ less /var/log/mongo/mongod.log

Profiling Levelsやログ関係の設定次第だと思うけど、スロークエリーがログファイルに出力される。 上記2つの方法でだめだった場合でも、ログファイルには記録されていたので、これなら確認出来る可能性高いと思う。

補足

スロークエリーの閾値

スロークエリーが記録されてそれを見るという方法なので、スロークエリーになってないと見られない。 環境次第だけど、一時的にスロークエリーに該当する閾値を極端に厳しくして、記録させれば見られると思う。

Aggregation Frameworkはexplainがまだ使えない。

https://jira.mongodb.org/browse/SERVER-4504

Aggregation Frameworkの実行にかかった時間を調べる

前述の通りexplainが使えない。

var pipeline = [/*ここにaggregate()に渡す引数を書く*/]

var before = new Date();
db.things.aggregate(pipeline);
var after = new Date();
execution_mills = after - before;

かなりとりあえずの方法だけど、pipelineを色々と書き換えて、速度改善するか調べる。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment