3

私は単純なコレクションを持っています:

{
    "_id" : ObjectId("5033cc15f31e20b76ca842c8"),
    "_class" : "com.pandu.model.alarm.Alarm",
    "serverName" : "CDCAWR009 Integration Service",
    "serverAddress" : "cdcawr009.na.convergys.com",
    "triggered" : ISODate("2012-01-28T05:09:03Z"),
    "componentName" : "IntegrationService",
    "summary" : "A device which is configured to be recorded is not being recorded.",
    "details" : "Extension<153; 40049> on CDCAWR009 is currently not being recorded
    properly; recording requested for the following reasons: ",
    "priority" : "Major"
}

コレクションには、そのようなドキュメントが数百万件ほどあります。サーバー名でグループ化し、すべてのサーバー名の数を取得しようとしています。RDBMS クエリの観点からは単純に思えます。

The query that I have come up with is 
    db.alarm.group( {key: { serverName:true }, reduce: function(obj,prev) { prev.count++ }, initial: { count: 0 }});

また、serverName にインデックスを追加しました。

> db.alarm.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.alarm",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "serverName" : 1
                },
                "ns" : "test.alarm",
                "name" : "serverName_1"
        }
]

ただし、13 秒後に mongodb で応答が返されます。一方、SQLサーバーでは、同様のクエリが4秒以内に返され、インデックスもありません。

不足しているものはありますか?

ありがとうございます。

4

2 に答える 2

4

作成したクエリからわかるように、2.0 でこのタイプの集計を行うには、Map/Reduce を実行する必要があります。MongoDB での Map/Reduce には、以前に SO で取り上げられたいくつかのパフォーマンス ペナルティがあります。インデックスは、選択的ではないため、実際には役に立ちません。ドキュメント全体だけでなく、インデックス全体をスキャンする必要があるだけです。

差し迫った 2.2 のリリース (これを書いている時点では現在 rc1 にあります) では、いくつかのオプションがあります。2.2 で導入された集計フレームワーク(ネイティブで、JS ベースの Map/Reduce ではありません) にはグループ演算子が組み込まれており、MongoDB でのこの種の操作を高速化するために特別に作成されました。

2.2 を試してみて、グループ化のパフォーマンスが向上するかどうかを確認することをお勧めします。次のようになると思います(注:テストされていません):

db.alarm.aggregate(
    { $group : {
        _id : "$serverName",
        count : { $sum : 1 }
    }}
);
于 2012-08-21T21:23:37.800 に答える
2

別のオプションであり、おそらく現時点で最もパフォーマンスの高いソリューションは、distinct() コマンドを使用してクライアント側で結果をカウントすることです。 http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

于 2012-08-21T21:25:44.237 に答える