Leveraging yourKnowledge of ORMTowards Performance-based N SQL T h lb   d NoSQL TechnologyBy Robert Greene Versant Corpora...
Overview   NoSQL at it’s Core             SQ          C           Pole-Position – Overview           About the Code       ...
NoSQLat its core              #NoSQLVersant
Traditional DBMS Scale Architecture  INEFFICIENT CPU destroying    Mapping                                      EXPENSIVE ...
NoSQL at its CoreA Shift In Application Architecture                                             UNIFED                   ...
A Shift is Needed► How Often do Relations Change?                             g  Blog : BlogEntry , Order : OrderItem , Yo...
Measured V lM      d ValueHow NoSQL performance stacks up to Relational                    #NoSQLVersant
PolePosition           Performance Benchmark► Established in 2003   NoSQL   N SQL -vs- ORM► Code Complexity Circuits   Fla...
Contenders | Methodology► Contenders  ORM  NoSQL► Methodology  External RDB Experts, Internal NoSQL Experts  Open Source B...
About the Code► ORM  Common Code Base► Tested Database Engines  Hibernate – MySQL / Postgres  OpenJPA – MySQL / Postgres  ...
Circuit Structure► Simulate CRUD on embedded graph of different Classes.► Cl  Class model - C           d l Complex Ci it ...
Hibernate JPA Code► Write – Generates Holder’s to user spec depth  ComplexHolder cp = new ComplexHolder( );    em.makePers...
ORM JPA Mapping            XML Mapping File for each Persistent Class ( 11ea Files )- <hibernate-mapping package="org.pole...
MongoDB Codeprivate void storeData(Mongo mongo) {       collection(mongo).insert(new BasicDBObject("test", "object"));   }...
MongoDB Mappingprivate static void writeSubTypeAttributes(ComplexHolder0 holder,   BasicDBObject dataStorage) {       if (...
g        _Holder0.class.getPackage().getName();nal String NAME_ATTRIBUTE = "name";nal String CHILDREN = "children";nal Str...
Versant JPA Code► Write – Generates Holder’s to user spec depth                                      p     p  ComplexHolde...
Versant JPA MappingSingle XML File with primitive declaration entries <class name="ComplexHolder0">        <field name nam...
Sh@t’s and Grins► JDBC CodeJDBC StringBuilder sb = new StringBuilder(); sb.append("select " +    HOLDER_TABLE0 + ".id from...
PolePositionBenchmark Summary Results                   #NoSQLVersant
FlatObject - Single Thread                     #NoSQLVersant
Results – ComplexConcurrency        @mongo - no safe mode                                #NoSQLVersant
Results – QueryConcurrency       @mongo – no safe mode                               #NoSQLVersant
Results – InsertConcurrent      @mongo – no safe mode                              #NoSQLVersant
Results – ComplexConcurrency         @mongo – safe mode                              #NoSQLVersant
Results – QueryConcurrency       @mongo – safe mode                            #NoSQLVersant
Results – InsertConcurrent       @mongo – safe mode                            #NoSQLVersant
Conclusions► Wake-up, smell the coffee        p,  JOINs are not needed - unless adhoc analytics► Take care of business, du...
Q&A      #NoSQLVersant
Contact      Robert GreeneVice President, Technology   rgreene@versant.com          @      t  NoSQL Now! – Booth #    SQ  ...
Upcoming SlideShare
Loading in...5
×

Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

430

Published on

The popular open source benchmark Poleposition was introduced back in 2005 to demonstrate the performance advantages of using a NoSQL, pure object-based solution as compared to traditional relational mapping solutions (ORM) over RDBMS like MySQL, Postgres, etc. Recently, Poleposition has been expanded to introduce the elements of concurrency of execution and model complexity into Poleposition's core foundation circuits. The new circuits incorporate a number of NoSQL technologies which avoid the mapping overhead of breaking down the benchmark object model into relational tables and demonstrate substantial differences in performance and resource consumption. For the right kind of data models, the NoSQL technologies demonstrate order(s) of magnitude improvements in performance with demonstrateable reductions in CPU utilization and storage footprint for the RAW data.

This presentation will review those findings and draw a point of reference for when model complexity and system concurrency should impact your technology selection process in favor of NoSQL solutions capable of dealing specifically with complex information models.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
430
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

  1. 1. Leveraging yourKnowledge of ORMTowards Performance-based N SQL T h lb d NoSQL TechnologyBy Robert Greene Versant Corporation U.S. Headquarters 255 Shoreline Dr Suite 450 Redwood City CA 94065 Dr. 450, City, www.versant.com | 650-232-2400 #NoSQLVersant
  2. 2. Overview NoSQL at it’s Core SQ C Pole-Position – Overview About the Code Circuits Description RDB JPA Code MongoDB Code Versant JPA Code V t C d Results – Winners of the Race Developer Challenge #NoSQLVersant
  3. 3. NoSQLat its core #NoSQLVersant
  4. 4. Traditional DBMS Scale Architecture INEFFICIENT CPU destroying Mapping EXPENSIVE Repetitive data movement and JOIN calculation #NoSQLVersant
  5. 5. NoSQL at its CoreA Shift In Application Architecture UNIFED Application  A li ti driven schema COMMODITY HW COMMODITY HW Horizontal scale out,  distribution and  partitioning • Google – Soft-Schema • IBM – Schema-Less #NoSQLVersant
  6. 6. A Shift is Needed► How Often do Relations Change? g Blog : BlogEntry , Order : OrderItem , You : Friend► R l ti Relations R l Ch Rarely Change, St R Stop Recalculating Th l l ti Them ► Do you need ALL o you da a in o e p ace o eed of your data one place. ► You don’t. You can distribute it. #NoSQLVersant
  7. 7. Measured V lM d ValueHow NoSQL performance stacks up to Relational #NoSQLVersant
  8. 8. PolePosition Performance Benchmark► Established in 2003 NoSQL N SQL -vs- ORM► Code Complexity Circuits Flat Obj t Fl t Objects Graphs Inherited Objects Collections► Data Operations CRUD Concurrency► Scalability #NoSQLVersant
  9. 9. Contenders | Methodology► Contenders ORM NoSQL► Methodology External RDB Experts, Internal NoSQL Experts Open Source Benchmark Code for all contenders #NoSQLVersant
  10. 10. About the Code► ORM Common Code Base► Tested Database Engines Hibernate – MySQL / Postgres OpenJPA – MySQL / Postgres MongoDB Versant Object Database #NoSQLVersant
  11. 11. Circuit Structure► Simulate CRUD on embedded graph of different Classes.► Cl Class model - C d l Complex Ci it l Circuit: class Holder0 {  String _name;  String name; List <Holder0> _children; Holder0[] _array; }  class Holder1 extends Holder0 {  { int _i1; }  class Holder2 extends Holder1 {  int _i2 <indexed>; }     ...class HolderNextends….. #NoSQLVersant
  12. 12. Hibernate JPA Code► Write – Generates Holder’s to user spec depth ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp);► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id ); cp.getChildren().touch();► Query String query  String query = "from from  org.polepos.teams.hibernate.data.Holder2 where i2=" +  currentInt;    Iterator it =  em.iterate(query); ► Delete – Deletes Graph - cascading operation #NoSQLVersant
  13. 13. ORM JPA Mapping XML Mapping File for each Persistent Class ( 11ea Files )- <hibernate-mapping package="org.polepos.teams.hibernate.data" default-cascade="none" default-access="property" default-lazy="true" auto-import="true">- <class name="ComplexHolder0" table="tComplexHolderNew0" polymorphism="implicit" mutable="true" dynamic-update="false" dynamic-insert="false" select-before-update="false"optimistic-lock="version"> ti i ti l k " i "> <id name="id" column="fid" type="long" />- <discriminator type="string" not-null="true" force="false" insert="true"> <column name="DISCRIMINATOR" /> </discriminator> <property name="name" column="fname" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never" />- <list name="children" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index l <i d column="elementIndex" /> " l tI d " <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </list>- <array name="array" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index column="elementIndex" /> <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </array>- <subclass name="ComplexHolder1" discriminator-value="D" dynamic-update="false" dynamic insert="false" select before update="false"> discriminator value="D" dynamic update="false" dynamic-insert="false" select-before-update="false"> <property name="i1" column="i1" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />- <subclass name="ComplexHolder2" discriminator-value="E" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i2" column="i2" type="int" index="i2_idx" unique="false" optimistic-lock="true" lazy="false" generated="never" />- <subclass name="ComplexHolder3" discriminator-value="F" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i3" column="i3" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />- <subclass name="ComplexHolder4" discriminator-value="G" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i4" column="i4" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> </subclass> </subclass> </subclass> </subclass> </class> </hibernate-mapping> #NoSQLVersant
  14. 14. MongoDB Codeprivate void storeData(Mongo mongo) { collection(mongo).insert(new BasicDBObject("test", "object")); }public ComplexHolder0 convertFromDocument(DBObject data, DeserializationOptions deserializationOption) { ComplexHolder0 instance = createInstance(getAsString(data, TYPE_ATTRIBUTE)); instance.setName(getAsString(data, NAME_ATTRIBUTE)); if ( ll ! d t (null != data.get(CHILDREN)) { t(CHILDREN)) { instance.setChildren(fromMongoObjectToList(getAsList(data, CHILDREN),  deserializationOption)); } if (null != data.get(ARRAY)) { final List<ComplexHolder0> arrayContent = fromMongoObjectToList(getAsList(data,  p y g j (g ( , ARRAY), deserializationOption); instance.setArray(arrayContent.toArray(new ComplexHolder0[arrayContent.size()])); } readAttributes(data, instance); return instance; }  #NoSQLVersant
  15. 15. MongoDB Mappingprivate static void writeSubTypeAttributes(ComplexHolder0 holder,  BasicDBObject dataStorage) { if (h ld (holder instanceof ComplexHolder1) { i t f l ld ) { dataStorage.put(FIELD_I1, ((ComplexHolder1) holder)._i1); } if (holder instanceof ComplexHolder2) { dataStorage.put(FIELD_I2, ((ComplexHolder2) holder)._i2); d t St t(FIELD I2 ((C l H ld 2) h ld ) i2) }private static void readAttributes(DBObject dataStorage, ComplexHolder0  holder) { holder) { if (holder instanceof ComplexHolder1) { ((ComplexHolder1) holder)._i1 = (Integer)  dataStorage.get(FIELD_I1); } if (holder instanceof ComplexHolder2) { ((ComplexHolder2) holder)._i2 = (Integer)  dataStorage.get(FIELD_I2); } #NoSQLVersant
  16. 16. g _Holder0.class.getPackage().getName();nal String NAME_ATTRIBUTE = "name";nal String CHILDREN = "children";nal String ARRAY = "array";nal String REFERENCE_TO_ORIGINAL_DOCUMENT = "_refToOriginal";nal String FIELD_I1 = "_i1";nal String FIELD_I2 = "_i2";nal String FIELD_I3 = "_i3";nal String FIELD_I4 = "_i4"; MongoDB Mappinginal OneArgFunction<BasicDBObject, DBRef> refCreator;tion(OneArgFunction<BasicDBObject, DBRef> refCreator) {refCreator = refCreator;atic Serialisation create(OneArgFunction<BasicDBObject, DBRef> tor) {ull == refCreator) {hrow new ArgumentNullException("requires a reference creator");n new Serialisation(refCreator);atic OneArgFunction<BasicDBObject, DBRef> eferenceCreator(final DBCollection collection) {ull == collection) {hrow new ArgumentNullException("requires a collection");n new OneArgFunction<BasicDBObject, DBRef>() {Overrideublic DBRef invoke(BasicDBObject basicDBObject) { final DB db = collection.getDB(); final Object id = basicDBObject.get("_id"); if (null == id) { throw new IllegalStateException("Expected an _id on the ); } return new DBRef(db, collection.getName(), id); ( , g (), ); #NoSQLVersant
  17. 17. Versant JPA Code► Write – Generates Holder’s to user spec depth p p ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp);► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id );    cp.getChildren().touch();► Q Query String query = "from org.polepos.teams.versant.data.Holder2  where i2=" + currentInt;    Iterator it =  session.iterate(query);  i i ( )► Delete – Deletes Graph – Cascading Operation #NoSQLVersant
  18. 18. Versant JPA MappingSingle XML File with primitive declaration entries <class name="ComplexHolder0"> <field name name /> <field name="name" /> <field name="array" /> <field name="children"> <collection element‐type="ComplexHolder0"/> </field> </class> #NoSQLVersant
  19. 19. Sh@t’s and Grins► JDBC CodeJDBC StringBuilder sb = new StringBuilder(); sb.append("select " +  HOLDER_TABLE0 + ".id from " + HOLDER_TABLE0); sb.append(" INNER  JOIN " + HOLDER_TABLES[0]); sb.append(" on " + HOLDER_TABLE0 +  ".id =   "  + HOLDER_TABLES[0] +  ".id "); sb.append("  INNER JOIN  "   .id  + HOLDER TABLES[0] + .id  ); sb.append( INNER JOIN + HOLDER_TABLES[1]); sb.append(" on " + HOLDER_TABLE0 + ".id = "  + HOLDER_TABLES[1] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[2]); sb.append(" on " + HOLDER_TABLE0 + ".id = " +  HOLDER_TABLES[2] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[3]); sb.append( on HOLDER TABLES[3]); sb.append("  on  "  + HOLDER_TABLE0 +  ".id =   "  +  + HOLDER TABLE0 + .id  + HOLDER_TABLES[3] + ".id "); sb.append(" where " +  HOLDER_TABLES[1] + ".i2 = ?"); PreparedStatement stat =  prepareStatement(sb.toString()); ResultSet resultSet stat.executeQuery();  #NoSQLVersant
  20. 20. PolePositionBenchmark Summary Results #NoSQLVersant
  21. 21. FlatObject - Single Thread #NoSQLVersant
  22. 22. Results – ComplexConcurrency @mongo - no safe mode #NoSQLVersant
  23. 23. Results – QueryConcurrency @mongo – no safe mode #NoSQLVersant
  24. 24. Results – InsertConcurrent @mongo – no safe mode #NoSQLVersant
  25. 25. Results – ComplexConcurrency @mongo – safe mode #NoSQLVersant
  26. 26. Results – QueryConcurrency @mongo – safe mode #NoSQLVersant
  27. 27. Results – InsertConcurrent @mongo – safe mode #NoSQLVersant
  28. 28. Conclusions► Wake-up, smell the coffee p, JOINs are not needed - unless adhoc analytics► Take care of business, dump a load of code Serialization is bad, data useful once structured Mapping is Mapping, even when it’s not an ORM► Get on your Bad Motor Scooter and Ride NoSQL without Mapping rules the road Get the Code: http://www.polepos.org #NoSQLVersant
  29. 29. Q&A #NoSQLVersant
  30. 30. Contact Robert GreeneVice President, Technology rgreene@versant.com @ t NoSQL Now! – Booth # SQ #14 #NoSQLVersant
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×