5.5 मिलियन पंक्तियों / दस्तावेजों के साथ MongoDB प्रदर्शन बनाम PostgreSQL


10

क्या कोई मुझे इन प्रश्नों की तुलना करने में मदद कर सकता है और बता सकता है कि पोस्टग्रेज़क्यूएल क्वेरी सिर्फ 2000ms के भीतर क्यों चलती है और MongoDB समग्र क्वेरी लगभग 9000ms और कभी-कभी 130K एमएस जितनी अधिक होती है?

PostgreSQL 9.3.2 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit

PostgreSQL क्वेरी

SELECT locomotive_id,
   SUM(date_trunc('second', datetime) - date_trunc('second', prevDatetime)) AS utilization_time

FROM bpkdmp 
WHERE datetime >= '2013-7-26 00:00:00.0000' 
AND   datetime <= '2013-7-26 23:59:59.9999'
GROUP BY locomotive_id
order by locomotive_id

MongoDB क्वेरी

db.bpkdmp.aggregate([
   {
      $match : {
          datetime : { $gte : new Date(2013,6,26, 0, 0, 0, 0), $lt : new Date(2013,6,26, 23, 59, 59, 9999) }
   }
   },
   {
      $project: {
         locomotive_id : "$locomotive_id",
         loco_time : { $subtract : ["$datetime", "$prevdatetime"] }, 
      }
   },
   {
      $group : {
         _id : "$locomotive_id",
         utilization_time : { $sum : "$loco_time" }
      }
   },
   {
      $sort : {_id : 1}
   }
])

PostgreSQL तालिका और MongoDB संग्रह दोनों को डेटाइम: 1 और लोकोमोटिव_आईडी: 1 पर अनुक्रमित किया गया है

ये प्रश्न 2TB हाइब्रिड ड्राइव और 16GB मेमोरी के साथ iMac पर परीक्षण कर रहे हैं। मुझे विंडोज 7 मशीन पर 8GB मेमोरी और 256GB SSD के साथ तुलनीय परिणाम प्राप्त हुए हैं।

धन्यवाद!

** अद्यतन: मैं अपने प्रश्न पोस्ट किए जाने के बाद EXPLAIN (BUFFERS, ANALYZE) परिणाम पोस्ट कर रहा हूं

"Sort  (cost=146036.84..146036.88 rows=19 width=24) (actual time=2182.443..2182.457 rows=152 loops=1)"
"  Sort Key: locomotive_id"
"  Sort Method: quicksort  Memory: 36kB"
"  Buffers: shared hit=13095"
"  ->  HashAggregate  (cost=146036.24..146036.43 rows=19 width=24) (actual time=2182.144..2182.360 rows=152 loops=1)"
"        Buffers: shared hit=13095"
"        ->  Bitmap Heap Scan on bpkdmp  (cost=12393.84..138736.97 rows=583942 width=24) (actual time=130.409..241.087 rows=559529 loops=1)"
"              Recheck Cond: ((datetime >= '2013-07-26 00:00:00'::timestamp without time zone) AND (datetime <= '2013-07-26 23:59:59.9999'::timestamp without time zone))"
"              Buffers: shared hit=13095"
"              ->  Bitmap Index Scan on bpkdmp_datetime_ix  (cost=0.00..12247.85 rows=583942 width=0) (actual time=127.707..127.707 rows=559529 loops=1)"
"                    Index Cond: ((datetime >= '2013-07-26 00:00:00'::timestamp without time zone) AND (datetime <= '2013-07-26 23:59:59.9999'::timestamp without time zone))"
"                    Buffers: shared hit=1531"
"Total runtime: 2182.620 ms"

** अद्यतन: मानगो व्याख्या:

MongoDB से समझाएं

{
"serverPipeline" : [
    {
        "query" : {
            "datetime" : {
                "$gte" : ISODate("2013-07-26T04:00:00Z"),
                "$lt" : ISODate("2013-07-27T04:00:08.999Z")
            }
        },
        "projection" : {
            "datetime" : 1,
            "locomotive_id" : 1,
            "prevdatetime" : 1,
            "_id" : 1
        },
        "cursor" : {
            "cursor" : "BtreeCursor datetime_1",
            "isMultiKey" : false,
            "n" : 559572,
            "nscannedObjects" : 559572,
            "nscanned" : 559572,
            "nscannedObjectsAllPlans" : 559572,
            "nscannedAllPlans" : 559572,
            "scanAndOrder" : false,
            "indexOnly" : false,
            "nYields" : 1,
            "nChunkSkips" : 0,
            "millis" : 988,
            "indexBounds" : {
                "datetime" : [
                    [
                        ISODate("2013-07-26T04:00:00Z"),
                        ISODate("2013-07-27T04:00:08.999Z")
                    ]
                ]
            },
            "allPlans" : [
                {
                    "cursor" : "BtreeCursor datetime_1",
                    "n" : 559572,
                    "nscannedObjects" : 559572,
                    "nscanned" : 559572,
                    "indexBounds" : {
                        "datetime" : [
                            [
                                ISODate("2013-07-26T04:00:00Z"),
                                ISODate("2013-07-27T04:00:08.999Z")
                            ]
                        ]
                    }
                }
            ],
            "oldPlan" : {
                "cursor" : "BtreeCursor datetime_1",
                "indexBounds" : {
                    "datetime" : [
                        [
                            ISODate("2013-07-26T04:00:00Z"),
                            ISODate("2013-07-27T04:00:08.999Z")
                        ]
                    ]
                }
            },
            "server" : "Michaels-iMac.local:27017"
        }
    },
    {
        "$project" : {
            "locomotive_id" : "$locomotive_id",
            "loco_time" : {
                "$subtract" : [
                    "$datetime",
                    "$prevdatetime"
                ]
            }
        }
    },
    {
        "$group" : {
            "_id" : "$locomotive_id",
            "utilization_time" : {
                "$sum" : "$loco_time"
            }
        }
    },
    {
        "$sort" : {
            "sortKey" : {
                "_id" : 1
            }
        }
    }
],
"ok" : 1
}

1
EXPLAIN (BUFFERS, ANALYZE)कृपया PostgreSQL क्वेरी शो आउटपुट के लिए। इसके अलावा, PostgreSQL संस्करण। (मैंने इसे dba.SE में स्थानांतरित करने के लिए मतदान किया है)
क्रेग रिंगर

... और MongoDB योजना पर जानकारी? docs.mongodb.org/manual/reference/method/cursor.explain
क्रेग रिंगर

2
हालांकि NoSQL प्रचार से बचना मुश्किल है, पारंपरिक RDBMS किसी भी दिन समुच्चय में बेहतर और अधिक परिपक्व हैं। NoSQL डेटाबेस प्राथमिक कुंजी अनुक्रमण और कुंजी द्वारा पुनर्प्राप्ति के लिए अनुकूलित होते हैं, न कि उन प्रकार के प्रश्नों के लिए।
अलेक्जेंड्रोस

हो सकता है मैंने थोड़ा विस्तार छोड़ दिया हो। प्रत्येक दस्तावेज़ में 200 से अधिक फ़ील्ड हैं। यह एक PostgreSQL डेटाबेस से एक सीधा आयात था। बहुत सारे क्षेत्र मूल्य शून्य हैं। मुझे याद आया कि MongoDB विशेष रूप से अशक्त मूल्यों का शौकीन नहीं है। मैंने प्रासंगिक डेटा के <20 क्षेत्रों के साथ एक और आयात किया और क्वेरी का प्रदर्शन बेहतर है। मैं 8GB मेमोरी और एक धीमी HD के साथ एक मशीन पर <3000ms प्राप्त कर रहा हूं। मैं जल्द ही एक और अधिक शक्तिशाली मशीन पर एक नया परीक्षण शुरू करने जा रहा हूं।
माइक ए

Mongodb इंडेक्स {datetime: 1, prevdatetime: 1}मौजूदा इंडेक्स की तुलना में बेहतर प्रदर्शन करना चाहिए, क्योंकि डोंगटाइम और प्राइमटाइम पर मोंगोडब फिल्टर होता है। यह उन दस्तावेजों की संख्या को कम कर देगा जिन्हें स्कैन करने की आवश्यकता है।
rubish

जवाबों:


8

सभी PostgreSQL यहाँ bpkdmp_datetime_ixब्लॉक करने के लिए बिटमैप ढेर स्कैन कर रहा है जिसमें मिलान पंक्तियाँ हो सकती हैं, फिर उन पंक्तियों के हीप स्कैन में मिलान पंक्तियाँ ढूँढने के लिए bpkdmp। यह तब समूह कुंजी के हैश का उपयोग करके हैश बकेट में पंक्तियों को समूहित करता है, प्रत्येक बकेट को सॉम करता है, और परिणामों को सॉर्ट करता है। यह एक सरल, बुनियादी क्वेरी योजना है - यदि आप work_memइसे बहुत सारे फेंकते हैं तो यह बेहतर प्रदर्शन कर सकता है, लेकिन यह भी नहीं हो सकता है।

उस क्वेरी में कहीं भी कोई समानता नहीं है; यह सब एक कोर पर होगा।

मैं केवल यह मान सकता हूं कि MongoDB एक कम कुशल विधि का उपयोग कर रहा है, या एक उपयुक्त सूचकांक से लाभ नहीं उठा रहा है। आपको explainसंभव होने के लिए एक उपयोगी टिप्पणी के लिए MongoDB क्वेरी के लिए दिखाने की आवश्यकता होगी ; देखते हैं cursor.explain

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.