Your SlideShare is downloading. ×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

389

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 …

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
389
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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. 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. NoSQLat its core #NoSQLVersant
  • 4. Traditional DBMS Scale Architecture INEFFICIENT CPU destroying Mapping EXPENSIVE Repetitive data movement and JOIN calculation #NoSQLVersant
  • 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. 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. Measured V lM d ValueHow NoSQL performance stacks up to Relational #NoSQLVersant
  • 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. Contenders | Methodology► Contenders ORM NoSQL► Methodology External RDB Experts, Internal NoSQL Experts Open Source Benchmark Code for all contenders #NoSQLVersant
  • 10. About the Code► ORM Common Code Base► Tested Database Engines Hibernate – MySQL / Postgres OpenJPA – MySQL / Postgres MongoDB Versant Object Database #NoSQLVersant
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. PolePositionBenchmark Summary Results #NoSQLVersant
  • 21. FlatObject - Single Thread #NoSQLVersant
  • 22. Results – ComplexConcurrency @mongo - no safe mode #NoSQLVersant
  • 23. Results – QueryConcurrency @mongo – no safe mode #NoSQLVersant
  • 24. Results – InsertConcurrent @mongo – no safe mode #NoSQLVersant
  • 25. Results – ComplexConcurrency @mongo – safe mode #NoSQLVersant
  • 26. Results – QueryConcurrency @mongo – safe mode #NoSQLVersant
  • 27. Results – InsertConcurrent @mongo – safe mode #NoSQLVersant
  • 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. Q&A #NoSQLVersant
  • 30. Contact Robert GreeneVice President, Technology rgreene@versant.com @ t NoSQL Now! – Booth # SQ #14 #NoSQLVersant

×