performance - MongoDB Slow query by ID -


i migrated mongodb database windows server centos. version 2.4.9. noticed have slow retrieval of records _id field! ran repair database on weekend bu did not solve problem. have method retrieves records ids (with in operator) (using spring data mongodb 1.4.1.release):

@override public map<string, record> findasmapids(     final string[] ids,     final componenttype... comps ) {     if( null == ids || 0 == ids.length ) {         return null;     }     map<string,record> result = new hashmap<string,record>();     final criteria cr =  where("_id").in( idarrfunction.apply(ids) );     final query qry = new query( cr );     setfieldstoreturn( qry, comps );     long start = system.currenttimemillis();     list<record> ritems = gettemplate().find(qry, record.class);     long end = system.currenttimemillis();     system.out.println( "findasmapids()::" + (end-start) );     for( record r: ritems ) {         result.put( r.getid(), r );     }     return result; }  public mongooperations gettemplate() {     return template; } 

the function idarrfunction returns array of objectid[]

you notice i'm timing data retrieval call. i'm not passing more 10 ids @ time. here timing output i'm getting in logs when call method several times:

findasmapids()::2092 findasmapids()::6666 findasmapids()::10007 findasmapids()::15132 findasmapids()::18341 findasmapids()::24709 findasmapids()::28731 findasmapids()::33888 findasmapids()::36862 findasmapids()::40206 

you notice time grows each call made method.

here collection stats:

> db.record.stats(); {     "ns" : "mydb.record",     "count" : 1491427,     "size" : 18292198304,     "avgobjsize" : 12264.896843090544,     "storagesize" : 18899890096,     "numextents" : 30,     "nindexes" : 13,     "lastextentsize" : 2146426864,     "paddingfactor" : 1,     "systemflags" : 1,     "userflags" : 0,     "totalindexsize" : 734401024,     "indexsizes" : {         "_id_" : 43561728,         "orgid" : 63192304,         "type" : 51018240,         "orghierarchy" : 63274064,         "orghierarchy_mrn" : 75603472,         "dos" : 25525472,         "org_pdt" : 77189616,         "orghierarchy_processeddttm" : 77287728,         "processeddttm_-1" : 37536016,         "orgid_states" : 68367712,         "states" : 27553120,         "states_1_processeddttm_-1" : 41624016,         "orgid_1_states_1_processeddttm_-1" : 82667536     },     "ok" : 1 } 

if printout query object java this:

query: { "_id" : { "$in" : [ { "$oid" : "51cbe96dcb81c43374ca9516"} , { "$oid" : "51cbe892cb81c43374ca5e48"} , { "$oid" : "51cbe910cb81c43374ca7aba"} , { "$oid" : "51c00739cb81e6b83ad29d14"} , { "$oid" : "51c06ff4cb81e6b83ad4f69a"} , { "$oid" : "51c07010cb81e6b83ad4f74e"} , { "$oid" : "51c06da5cb81e6b83ad4e775"} , { "$oid" : "51c081bbcb81e6b83ad56437"} , { "$oid" : "51c07fe2cb81e6b83ad557d2"} , { "$oid" : "51c081bbcb81e6b83ad56433"}]}}, fields: { "text" : 1 , "type" : 1 , "header" : 1 , "orgid" : 1 , "vitals" : 1 , "_id" : 1 , "processeddttm" : 1 , "orghierarchy" : 1 }, sort: null 

also if run explain:

> db.record.find({ "_id" : { "$in" : [ objectid("51ba0b43cb81e6b83acd9e6b") , objectid("51a8feb5cb8168350e373428") , objectid("51a90053cb8168350e373948") , objectid("51a901fecb8168350e373e82") , objectid("51a8f3e9cb8168350e3711d1") , objectid("51a8f3eacb8168350e3711d2") , objectid("51a8ff3ecb8168350e3735df") , objectid("51a8f59ecb8168350e37172b") , objectid("51a8f9aacb8168350e372418") , objectid("51a8f786cb8168350e371d42")]}}).explain(); {     "cursor" : "btreecursor _id_ multi",     "ismultikey" : false,     "n" : 10,     "nscannedobjects" : 10,     "nscanned" : 18,     "nscannedobjectsallplans" : 10,     "nscannedallplans" : 18,     "scanandorder" : false,     "indexonly" : false,     "nyields" : 0,     "nchunkskips" : 0,     "millis" : 0,     "indexbounds" : {         "_id" : [             [                 objectid("51a8f3e9cb8168350e3711d1"),                 objectid("51a8f3e9cb8168350e3711d1")             ],             [                 objectid("51a8f3eacb8168350e3711d2"),                 objectid("51a8f3eacb8168350e3711d2")             ],             [                 objectid("51a8f59ecb8168350e37172b"),                 objectid("51a8f59ecb8168350e37172b")             ],             [                 objectid("51a8f786cb8168350e371d42"),                 objectid("51a8f786cb8168350e371d42")             ],             [                 objectid("51a8f9aacb8168350e372418"),                 objectid("51a8f9aacb8168350e372418")             ],             [                 objectid("51a8feb5cb8168350e373428"),                 objectid("51a8feb5cb8168350e373428")             ],             [                 objectid("51a8ff3ecb8168350e3735df"),                 objectid("51a8ff3ecb8168350e3735df")             ],             [                 objectid("51a90053cb8168350e373948"),                 objectid("51a90053cb8168350e373948")             ],             [                 objectid("51a901fecb8168350e373e82"),                 objectid("51a901fecb8168350e373e82")             ],             [                 objectid("51ba0b43cb81e6b83acd9e6b"),                 objectid("51ba0b43cb81e6b83acd9e6b")             ]         ]     },     "server" : "ip-10-0-0-41:27017" } 

i turned on profiler , get:

{    "op":"query",    "ns":"sytrue.record",    "query":{       "_id":{      "$in":[         objectid("51b1c98dcb81e4c1566b7436"),         objectid("51b1cb3ccb81e4c1566b79ab"),         objectid("51b1d741cb81e4c1566ba219"),         objectid("51b1caa8cb81e4c1566b77d4"),         objectid("51b1c98ccb81e4c1566b7433"),         objectid("51b1c691cb81e4c1566b6a8c"),         objectid("51b1cc21cb81e4c1566b7c9f"),         objectid("51b1c390cb81e4c1566b60c9"),         objectid("51b1d578cb81e4c1566b9c1d"),         objectid("51b1e13dcb81e4c1566bc30e")      ]       }    },    "ntoreturn":0,    "ntoskip":0,    "nscanned":19,    "keyupdates":0,    "numyield":0,    "lockstats":{       "timelockedmicros":{      "r":numberlong(380),      "w":numberlong(0)       },       "timeacquiringmicros":{      "r":numberlong(2),      "w":numberlong(4)       }    },    "nreturned":10,    "responselength":36745,    "millis":0,    "ts":   isodate("2014-03-24t09:55:20.988   z"),    "client":"127.0.0.1",    "allusers":[       {      "user":"sytrue-user",      "usersource":"sytrue"       }    ],    "user":"sytrue-user@sytrue" } 
  • i notice when retrieve individual record id slow (findone method of pagingandsortingrepository).
  • i have mention did not have problem on windows server.
  • please explain what's going on.

update: noticed while results returned cpu consumed java code , not mongo server process. problem either in mongodb-java driver or spring-data-mongodb

found problem chatting mongodb developer: running spring framework 4.0.0 , slowness related issue:

https://jira.spring.io/browse/spr-11335

updating spring version 4.0.1 (or above) solves problem.

this stack trace call problem:

    @ java.lang.class.getgenericsignature(native method)     @ java.lang.class.getgenericinterfaces(class.java:813)     @ org.springframework.core.serializabletypewrapper$2.gettype(serializabletypewrapper.java:106)     @ org.springframework.core.serializabletypewrapper$typeproxyinvocationhandler.invoke(serializabletypewrapper.java:220)     @ com.sun.proxy.$proxy5.equals(unknown source)     @ org.springframework.util.objectutils.nullsafeequals(objectutils.java:252)     @ org.springframework.core.resolvabletype.equals(resolvabletype.java:682)     @ org.springframework.util.objectutils.nullsafeequals(objectutils.java:252)     @ org.springframework.core.resolvabletype.variableresolversourceequals(resolvabletype.java:719)     @ org.springframework.core.resolvabletype.equals(resolvabletype.java:683)     @ org.springframework.util.concurrentreferencehashmap$segment.findinchain(concurrentreferencehashmap.java:571)     @ org.springframework.util.concurrentreferencehashmap$segment.getreference(concurrentreferencehashmap.java:439)     @ org.springframework.util.concurrentreferencehashmap.getreference(concurrentreferencehashmap.java:238)     @ org.springframework.util.concurrentreferencehashmap.get(concurrentreferencehashmap.java:217)     @ org.springframework.core.resolvabletype.fortype(resolvabletype.java:1018)     @ org.springframework.core.resolvabletype.fortype(resolvabletype.java:998)     @ org.springframework.core.resolvabletype.getgenerics(resolvabletype.java:489)     @ org.springframework.core.resolvabletype.getgeneric(resolvabletype.java:451)     @ org.springframework.core.convert.typedescriptor.getelementtypedescriptor(typedescriptor.java:305)     @ org.springframework.core.convert.typedescriptor.equals(typedescriptor.java:456)     @ org.springframework.util.objectutils.nullsafeequals(objectutils.java:252)     @ org.springframework.core.convert.support.genericconversionservice$convertercachekey.equals(genericconversionservice.java:436)     @ java.util.concurrent.concurrenthashmap.get(concurrenthashmap.java:996)     @ org.springframework.core.convert.support.genericconversionservice.getconverter(genericconversionservice.java:235)     @ org.springframework.core.convert.support.genericconversionservice.convert(genericconversionservice.java:176)     @ org.springframework.core.convert.support.genericconversionservice.convert(genericconversionservice.java:162)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.getpotentiallyconvertedsimpleread(mappingmongoconverter.java:715)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.readcollectionorarray(mappingmongoconverter.java:773)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.readvalue(mappingmongoconverter.java:1048)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.access$100(mappingmongoconverter.java:77)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter$mongodbpropertyvalueprovider.getpropertyvalue(mappingmongoconverter.java:999)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.getvalueinternal(mappingmongoconverter.java:755)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter$1.dowithpersistentproperty(mappingmongoconverter.java:256)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter$1.dowithpersistentproperty(mappingmongoconverter.java:249)     @ org.springframework.data.mapping.model.basicpersistententity.dowithproperties(basicpersistententity.java:261)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.read(mappingmongoconverter.java:249)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.read(mappingmongoconverter.java:223)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.read(mappingmongoconverter.java:187)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.read(mappingmongoconverter.java:183)     @ org.springframework.data.mongodb.core.convert.mappingmongoconverter.read(mappingmongoconverter.java:77)     @ org.springframework.data.mongodb.core.mongotemplate$readdbobjectcallback.dowith(mongotemplate.java:1966)     @ org.springframework.data.mongodb.core.mongotemplate.executefindmultiinternal(mongotemplate.java:1662)     @ org.springframework.data.mongodb.core.mongotemplate.dofind(mongotemplate.java:1487)     @ org.springframework.data.mongodb.core.mongotemplate.dofind(mongotemplate.java:1471)     @ org.springframework.data.mongodb.core.mongotemplate.find(mongotemplate.java:527)     @ org.springframework.data.mongodb.core.mongotemplate.find(mongotemplate.java:518)     @ com.sytrue.record.persistence.repo.impl.recordrepositoryimpl.findasmapids(recordrepositoryimpl.java:139) 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -