মঙ্গোডিবি পারফরম্যান্স বনাম পোস্টগ্র্রেএসকিউএল 5.5 মিলিয়ন সারি / ডকুমেন্ট সহ


10

কেউ কি আমাকে এই প্রশ্নের তুলনা করতে এবং ব্যাখ্যা করতে পারে যে পোস্টগ্র্রেএসকিউএল কোয়েরি কেবল 2000 মিমি এবং মঙ্গোডিবি সমষ্টিগত কোয়েরি প্রায় 9000 মিমি এবং কখনও কখনও ১৩০ কে এমএসের চেয়ে বেশি হিসাবে কেন কার্যকর হয়?

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

মঙ্গোডিবি ক্যোয়ারী

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}
   }
])

পোস্টগ্রাইএসকিউএল টেবিল এবং মঙ্গোডিবি সংগ্রহ উভয়ই তারিখের সময়কে অনুসৃত হয়: 1 এবং লোকোমোটিভ_আইডি: 1

এই প্রশ্নাগুলি একটি 2 টিবি হাইব্রিড ড্রাইভ এবং 16 গিগাবাইট মেমরির সাহায্যে একটি আইম্যাকটিতে পরীক্ষা করছে। আমি 8 গিগাবাইট মেমরি এবং একটি 256GB এসএসডি সহ একটি উইন্ডোজ 7 মেশিনে তুলনামূলক ফলাফল পেয়েছি।

ধন্যবাদ!

** আপডেট: আমার প্রশ্ন পোস্ট হওয়ার পরে আমি এক্সপ্লেইন (বুফার্স, আনালাইজ) ফলাফল পোস্ট করছি

"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"

** আপডেট: মঙ্গো ব্যাখ্যা:

মঙ্গোডিবি থেকে ব্যাখ্যা করুন

{
"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
PostgreSQL ক্যোয়ারী শো EXPLAIN (BUFFERS, ANALYZE)আউটপুট জন্য দয়া করে। এছাড়াও, PostgreSQL সংস্করণ। (আমি এটি dba.SE এ স্থানান্তরিত করার পক্ষে ভোট দিয়েছি)
ক্রেগ

... এবং মঙ্গোডিবি পরিকল্পনার তথ্য? docs.mongodb.org/manual/references/method/cursor.explain
ক্রেগ

2
যদিও নোএসকিউএল হাইপ থেকে বাঁচা শক্ত, তবুও traditionalতিহ্যবাহী আরডিবিএমএস যে কোনও দিন সমষ্টিগুলিতে আরও উন্নত এবং আরও বেশি পরিপক্ক। নোএসকিউএল ডাটাবেসগুলি কী দ্বারা প্রাথমিক কী সূচি এবং পুনরুদ্ধারের জন্য অনুকূলিত করা হয় এবং এ জাতীয় প্রশ্নের জন্য নয়।
আলেকজান্দ্রোস

আমি একটি সামান্য বিশদ বাদ দিতে পারে। প্রতিটি নথিতে 200 এরও বেশি ক্ষেত্র রয়েছে। এটি পোস্টগ্রিসএসকিউএল ডাটাবেস থেকে সরাসরি আমদানি হয়েছিল। ক্ষেত্রের মানগুলি শূন্য। আমি স্মরণ করিয়ে দিয়েছিলাম যে মঙ্গোডিবি বিশেষভাবে নাল মানকে পছন্দ করে না। প্রাসঙ্গিক ডেটা <20 টি ক্ষেত্রের সাথে আমি আরেকটি আমদানি করেছি এবং ক্যোরির পারফরম্যান্স আরও প্রশস্ততা। আমি 8GB মেমরি এবং একটি ধীর এইচডি সহ একটি মেশিনে <3000ms পাচ্ছি। আমি শীঘ্রই আরও অনেক শক্তিশালী মেশিনে একটি নতুন পরীক্ষা শুরু করতে যাচ্ছি।
মাইক এ

মংডোব সূচককে {datetime: 1, prevdatetime: 1}বর্তমান সূচকের চেয়ে আরও ভাল পারফরম্যান্স করা উচিত, যেহেতু ডেটটাইম এবং পূর্ববর্তী সময়ে মুংডব ফিল্টার করে। এটি স্ক্যান করা প্রয়োজন এমন নথিগুলির সংখ্যা হ্রাস পাবে।
ঘষুন

উত্তর:


8

সমস্ত পোস্টগ্রাইএসকিউএল এখানে যা করছে তা হ'ল বিটম্যাপ হ্যাপ স্ক্যান bpkdmp_datetime_ixযা ব্লকগুলিতে ম্যাচিং সারি থাকতে পারে, তারপরে মেলানো সারিগুলি খুঁজে পাওয়ার জন্য সেই ব্লকগুলির একটি হিপ স্ক্যান bpkdmp। এরপরে এটি গ্রুপিং কীটির হ্যাশগুলি ব্যবহার করে সারিগুলিকে হ্যাশ বালতিতে বিভক্ত করে, প্রতিটি বালতিটি যোগ করে এবং ফলাফলগুলি বাছাই করে। এটি একটি সাধারণ, বেসিক ক্যোয়ারী পরিকল্পনা - আপনি যদি work_memএটি প্রচুর পরিমাণে ফেলে দেন তবে এটি আরও ভাল পারফরম্যান্স করতে পারে তবে এটি সম্ভবত নাও পারে।

সেই প্রশ্নের মধ্যে কোথাও কোনও সমান্তরালতা নেই; এটি সব ঘটবে।

আমি কেবল ধরে নিতে পারি যে মঙ্গোডিবি কম দক্ষ পদ্ধতি ব্যবহার করছে, বা উপযুক্ত সূচক থেকে উপকৃত হচ্ছে না। আপনার explainসেখানে সম্ভাব্য হওয়ার জন্য দরকারী মন্তব্যের জন্য মঙ্গোডিবি ক্যোয়ারীটি দেখাতে হবে; দেখতে cursor.explain

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.