You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/07/01 07:25:10 UTC

[25/25] incubator-ignite git commit: ignite-950: added benchmarks temporaly

ignite-950: added benchmarks temporaly


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/cc19b086
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/cc19b086
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/cc19b086

Branch: refs/heads/ignite-950
Commit: cc19b0862df3461024f43786ea61b6321d678966
Parents: 76309bb
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Jul 1 08:24:31 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Jul 1 08:24:31 2015 +0300

----------------------------------------------------------------------
 .../ignite/jmh/CliendServerNodeBenchmark.java   | 204 +++++++++
 .../ignite/jmh/MarshallerContextJMHImpl.java    |  57 +++
 .../ignite/jmh/MarshallerMethodsBenchmark.java  |  95 ++++
 .../ignite/jmh/QueryMarshallerBenchmark.java    | 412 ++++++++++++++++++
 .../apache/ignite/jmh/ReadFieldBenchmark.java   |  91 ++++
 .../SeveralNodesQueryMarshallerBenchmark.java   | 432 +++++++++++++++++++
 .../ignite/jmh/SimpleMarshallerBenchmark.java   | 208 +++++++++
 .../java/org/apache/ignite/jmh/model/City.java  |  72 ++++
 .../org/apache/ignite/jmh/model/Department.java |  75 ++++
 .../apache/ignite/jmh/model/Organization.java   |  39 ++
 .../org/apache/ignite/jmh/model/Person.java     |  97 +++++
 .../ignite/jmh/model/PersonExternalizable.java  | 190 ++++++++
 .../ignite/jmh/model/PersonMarshalAware.java    | 199 +++++++++
 .../apache/ignite/jmh/model/PersonSimple.java   | 172 ++++++++
 14 files changed, 2343 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/CliendServerNodeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/CliendServerNodeBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/CliendServerNodeBenchmark.java
new file mode 100644
index 0000000..6018ae9
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/CliendServerNodeBenchmark.java
@@ -0,0 +1,204 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.query.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import javax.cache.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * Created by GridAdmin1234 on 6/29/2015.
+ */
+@State (value = Scope.Benchmark)
+public class CliendServerNodeBenchmark {
+    private TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    private Ignite node;
+
+    private IgniteCache<Integer, PersonSimple> cache;
+
+    private static final int ROWS_COUNT = 50000;
+
+    private int putCounter = ROWS_COUNT + 1;
+
+    private IgniteConfiguration createConfiguration(String gridName, boolean newMarshaller) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        OptimizedMarshaller marsh = new OptimizedMarshaller(false);
+        marsh.setProtocolVersion(newMarshaller ? OptimizedMarshallerProtocolVersion.VER_1_1 :
+                                     OptimizedMarshallerProtocolVersion.VER_1);
+        cfg.setMarshaller(marsh);
+
+        CacheConfiguration cCfg = new CacheConfiguration();
+        cCfg.setName("query");
+        cCfg.setCacheMode(CacheMode.PARTITIONED);
+        cCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+        cCfg.setSwapEnabled(false);
+//        cCfg.setCopyOnRead(false);
+
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(Integer.class);
+        meta.setValueType(PersonSimple.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", Integer.class);
+        indexes.put("orgId", Integer.class);
+        indexes.put("salary", Double.class);
+
+        meta.setAscendingFields(indexes);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("firstName", String.class);
+        queryFields.put("lastName", String.class);
+
+        meta.setQueryFields(queryFields);
+
+        cCfg.setTypeMetadata(Arrays.asList(meta));
+
+        cfg.setCacheConfiguration(cCfg);
+
+        return cfg;
+    }
+
+    @TearDown
+    public void stopNodes() {
+        Ignition.stopAll(true);
+    }
+
+    //@Setup
+    public void startOldNodes() {
+        System.out.println();
+        System.out.println("STARTED OLD NODE");
+
+        Ignition.start(createConfiguration("node", false));
+
+        IgniteConfiguration clientCfg = createConfiguration("client", false);
+        clientCfg.setClientMode(true);
+
+        node = Ignition.start(clientCfg);
+
+        cache = node.cache("query");
+
+        for (int i = 0; i < ROWS_COUNT; i++) {
+            PersonSimple person = new PersonSimple(i, "Name ", "Surname ", (i + 1) * 100);
+            cache.put(i, person);
+        }
+    }
+
+    @Setup
+    public void startNewNodes() {
+        System.out.println();
+        System.out.println("STARTED NEW NODE");
+
+        Ignite server = Ignition.start(createConfiguration("node", true));
+
+        IgniteConfiguration clientCfg = createConfiguration("client", true);
+        clientCfg.setClientMode(true);
+
+        node = Ignition.start(clientCfg);
+
+        cache = node.cache("query");
+
+        for (int i = 0; i < ROWS_COUNT; i++) {
+            PersonSimple person = new PersonSimple(i, "Name ", "Surname ", (i + 1) * 100);
+            cache.put(i, person);
+        }
+    }
+
+
+    @GenerateMicroBenchmark
+    public void testGet() throws Exception {
+        int key  = ThreadLocalRandom.current().nextInt(0, ROWS_COUNT);
+
+        PersonSimple personSimple = cache.get(key);
+
+        if (personSimple == null)
+            throw new IgniteException("Person is null");
+    }
+
+    //@GenerateMicroBenchmark
+    public void testPut() throws Exception {
+        cache.put(putCounter, new PersonSimple(putCounter, "Name ", "Surname ", (putCounter + 1) * 100));
+        putCounter++;
+   }
+
+    //@GenerateMicroBenchmark
+    public void testFieldsQuery() throws Exception {
+        double salary = ThreadLocalRandom.current().nextInt(0, ROWS_COUNT);
+
+        double maxSalary = salary + 100;
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("SELECT PersonSimple.firstName, PersonSimple.lastName FROM " +
+                                                    "PersonSimple WHERE salary >= ? and salary <= ?");
+
+        qry.setArgs(salary, maxSalary);
+
+        List<List<?>> result = cache.query(qry).getAll();
+
+        for (List<?> row : result) {
+            if (row.get(0) == null || row.get(1) == null)
+                throw new Exception("Invalid person retrieved [min=" + salary + ", max=" + maxSalary +
+                                        ", person=" + row + ']');
+        }
+    }
+
+//    public static void main(String args[]) throws Exception {
+//        CliendServerNodeBenchmark benchmark = new CliendServerNodeBenchmark();
+//
+//        benchmark.startNewNodes();
+//
+//        for (int i = ROWS_COUNT + 1; i < 1000000; i++) {
+//            benchmark.cache.put(i, new PersonSimple(i, "Name  DSda hdasjhdkas ajksdhasjkd " + i, "Surname dasdsad " + i,
+//                                                    (i + 1) * 100));
+//
+//            if (i % 10000 == 0)
+//                System.out.println("Put :" + i);
+//        }
+//
+//        System.out.println("Put all the data!");
+//    }
+
+
+    public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*" + CliendServerNodeBenchmark.class.getSimpleName() + ".*")
+            .warmupIterations(15)
+            .measurementIterations(65)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+                //.shouldDoGC(true)
+            .build();
+
+        new Runner(opts).run();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerContextJMHImpl.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerContextJMHImpl.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerContextJMHImpl.java
new file mode 100644
index 0000000..5504851
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerContextJMHImpl.java
@@ -0,0 +1,57 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.*;
+import org.apache.ignite.internal.*;
+import org.apache.ignite.plugin.*;
+import org.jsr166.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * Test marshaller context.
+ */
+public class MarshallerContextJMHImpl extends MarshallerContextAdapter {
+    /** */
+    private final static ConcurrentMap<Integer, String> map = new ConcurrentHashMap8<>();
+
+    /**
+     * Initializes context.
+     *
+     * @param plugins Plugins.
+     */
+    public MarshallerContextJMHImpl(List<PluginProvider> plugins) {
+        super(plugins);
+    }
+
+    /**
+     * Initializes context.
+     */
+    public MarshallerContextJMHImpl() {
+        super(null);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean registerClassName(int id, String clsName) throws IgniteCheckedException {
+        String oldClsName = map.putIfAbsent(id, clsName);
+
+        if (oldClsName != null && !oldClsName.equals(clsName))
+            throw new IgniteCheckedException("Duplicate ID [id=" + id + ", oldClsName=" + oldClsName + ", clsName=" +
+                clsName + ']');
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected String className(int id) {
+        return map.get(id);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerMethodsBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerMethodsBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerMethodsBenchmark.java
new file mode 100644
index 0000000..728637c
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/MarshallerMethodsBenchmark.java
@@ -0,0 +1,95 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import java.util.concurrent.*;
+
+/**
+ * Created by GridAdmin1234 on 6/30/2015.
+ */
+@State(value = Scope.Benchmark)
+public class MarshallerMethodsBenchmark {
+    private OptimizedMarshaller marsh;
+
+    private PersonSimple personSimple;
+
+    @Setup
+    public void initNewMarshaller() {
+        marsh = new OptimizedMarshaller(false);
+        marsh.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1_1);
+
+        marsh.setContext(new MarshallerContextJMHImpl());
+
+        OptimizedMarshallerIndexingHandler idxHandler = new OptimizedMarshallerIndexingHandler();
+
+        idxHandler.setMetaHandler(new OptimizedMarshallerMetaHandler() {
+
+            private ConcurrentHashMap<Integer, OptimizedObjectMetadata> map = new ConcurrentHashMap<Integer,
+                OptimizedObjectMetadata>();
+
+            @Override public void addMeta(int typeId, OptimizedObjectMetadata meta) {
+                map.put(typeId, meta);
+            }
+
+            @Override public OptimizedObjectMetadata metadata(int typeId) {
+                return map.get(typeId);
+            }
+        });
+
+        marsh.setIndexingHandler(idxHandler);
+
+        personSimple = new PersonSimple(100, 200, "asdjkas aksjdhkajsd ajd", "asjdlaskd askdjsalkd", 900);
+    }
+
+    //@Setup
+    public void initOldMarshaller() {
+        marsh = new OptimizedMarshaller(false);
+
+        marsh.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1);
+        marsh.setContext(new MarshallerContextJMHImpl());
+
+        personSimple = new PersonSimple(100, 200, "asdjkas aksjdhkajsd ajd", "asjdlaskd askdjsalkd", 900);
+    }
+
+    @GenerateMicroBenchmark
+    public void testMarshal() throws Exception {
+        marsh.marshal(personSimple);
+    }
+
+    public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*" + MarshallerMethodsBenchmark.class.getSimpleName() + ".*")
+            .warmupIterations(15)
+            .measurementIterations(65)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+                //.shouldDoGC(true)
+            .build();
+
+        new Runner(opts).run();
+    }
+
+//    public static void main(String[] args) throws Exception {
+//        MarshallerMethodsBenchmark benchmark = new MarshallerMethodsBenchmark();
+//
+//        benchmark.initNewMarshaller();
+//
+//        for (int i = 0; i < 40; i++)
+//            benchmark.testMarshal();
+//    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/QueryMarshallerBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/QueryMarshallerBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/QueryMarshallerBenchmark.java
new file mode 100644
index 0000000..76aee7f
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/QueryMarshallerBenchmark.java
@@ -0,0 +1,412 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.query.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import javax.cache.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+@State (value = Scope.Benchmark)
+public class QueryMarshallerBenchmark {
+
+    private final static String PERSON_CACHE = "person";
+
+    private final static String CITY_CACHE = "city";
+
+    private final static String DEPARTMENT_CACHE = "dep";
+
+    private final static String ORGANIZATION_CACHE = "org";
+
+    private static final int PERSON_ROWS_COUNT = 400000;
+
+    private static final int CITY_ROWS_COUNT = 500;
+
+    private static final int DEPARTMENT_ROWS_COUNT = CITY_ROWS_COUNT * 10;
+
+    private static final int ORGANIZATION_ROWS_COUNT = 30;
+
+    private static final int SALARY_LIMIT = 100000;
+
+
+    private TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    private Ignite node1;
+
+    private Ignite node2;
+
+    private IgniteCache<AffinityKey<UUID>, Person> personCache;
+
+    private IgniteConfiguration createOldConfiguration(String gridName) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        OptimizedMarshaller marshaller = new OptimizedMarshaller();
+        marshaller.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1);
+
+        cfg.setMarshaller(marshaller);
+
+        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+        cityCacheCfg.setTypeMetadata(Arrays.asList(createCityMetadata()));
+
+        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+        orgCacheCfg.setTypeMetadata(Arrays.asList(createOrgMetadata()));
+
+        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+        depCacheCfg.setTypeMetadata(Arrays.asList(createDepartmentMeta()));
+
+        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+        personCacheCfg.setTypeMetadata(Arrays.asList(createPersonMeta()));
+
+        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+//        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+//        cityCacheCfg.setIndexedTypes(UUID.class, City.class);
+//
+//        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+//        orgCacheCfg.setIndexedTypes(UUID.class, Organization.class);
+//
+//        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+//        depCacheCfg.setIndexedTypes(AffinityKey.class, Department.class);
+//
+//        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+//        personCacheCfg.setIndexedTypes(AffinityKey.class, Person.class);
+//
+//        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+        return cfg;
+    }
+
+    private IgniteConfiguration createNewConfiguration(String gridName) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        OptimizedMarshaller marshaller = new OptimizedMarshaller();
+        marshaller.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1_1);
+        cfg.setMarshaller(marshaller);
+
+        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+        cityCacheCfg.setTypeMetadata(Arrays.asList(createCityMetadata()));
+
+        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+        orgCacheCfg.setTypeMetadata(Arrays.asList(createOrgMetadata()));
+
+        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+        depCacheCfg.setTypeMetadata(Arrays.asList(createDepartmentMeta()));
+
+        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+        personCacheCfg.setTypeMetadata(Arrays.asList(createPersonMeta()));
+
+        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+        return cfg;
+    }
+
+    private CacheConfiguration createCacheCfg(String name) {
+        CacheConfiguration cCfg = new CacheConfiguration();
+        cCfg.setName(name);
+        cCfg.setCacheMode(CacheMode.PARTITIONED);
+        cCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+        cCfg.setSwapEnabled(false);
+
+//        cCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
+//        cCfg.setOffHeapMaxMemory(0);
+//        cCfg.setSqlOnheapRowCacheSize(1);
+
+        return cCfg;
+    }
+
+    private CacheTypeMetadata createCityMetadata() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(UUID.class);
+        meta.setValueType(City.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+        queryFields.put("population", Integer.class);
+        queryFields.put("age", Integer.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createOrgMetadata() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(UUID.class);
+        meta.setValueType(Organization.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createDepartmentMeta() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(AffinityKey.class);
+        meta.setValueType(Department.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+        indexes.put("cityId", UUID.class);
+        indexes.put("orgId", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createPersonMeta() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(AffinityKey.class);
+        meta.setValueType(Person.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+        indexes.put("depId", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("firstName", String.class);
+        queryFields.put("lastName", String.class);
+        queryFields.put("rank", Integer.class);
+        queryFields.put("title", String.class);
+        queryFields.put("age", Integer.class);
+        queryFields.put("salary", Integer.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private void populateCaches() {
+        Random rand = new Random();
+
+        System.out.println();
+
+        IgniteCache<UUID, City> cityCache = node1.cache(CITY_CACHE);
+
+        City[] cities = new City[CITY_ROWS_COUNT];
+
+        for (int i = 0; i < CITY_ROWS_COUNT; i++) {
+            City city = new City("City Name " + i, rand.nextInt(10000000), rand.nextInt(2000), "Country" + i);
+
+            cities[i] = city;
+
+            cityCache.put(city.getId(), city);
+        }
+
+        System.out.println("Populated cities: " + CITY_ROWS_COUNT);
+
+        IgniteCache<UUID, Organization> orgCache = node1.cache(ORGANIZATION_CACHE);
+
+        Organization[] organizations = new Organization[ORGANIZATION_ROWS_COUNT];
+
+        for (int i = 0; i < ORGANIZATION_ROWS_COUNT; i++) {
+            Organization org = new Organization("Org Name " + i);
+
+            organizations[i] = org;
+
+            orgCache.put(org.getId(), org);
+        }
+
+        System.out.println("Populated organizations: " + ORGANIZATION_ROWS_COUNT);
+
+        IgniteCache<AffinityKey<UUID>, Department> depCache = node1.cache(DEPARTMENT_CACHE);
+
+        Department[] departments = new Department[DEPARTMENT_ROWS_COUNT];
+
+        for (int i = 0; i < DEPARTMENT_ROWS_COUNT; i++) {
+            Department dep = new Department("Dep Name " + i, cities[rand.nextInt(CITY_ROWS_COUNT)],
+                organizations[rand.nextInt(ORGANIZATION_ROWS_COUNT)]);
+
+            departments[i] = dep;
+
+            try {
+                depCache.put(dep.getKey(), dep);
+            }
+            catch (Exception e) {
+                System.out.println("ROW: " + i);
+                e.printStackTrace();
+            }
+        }
+
+        System.out.println("Populated departments: " + DEPARTMENT_ROWS_COUNT);
+
+        cities = null;
+        organizations = null;
+
+        personCache = node1.cache(PERSON_CACHE);
+
+        for (int i = 0; i < PERSON_ROWS_COUNT; i++) {
+            Person person = new Person(departments[rand.nextInt(DEPARTMENT_ROWS_COUNT)], "First Name " + i,
+                "Last Name " + i, rand.nextInt(21), "Title " + i, rand.nextInt(90), rand.nextInt(SALARY_LIMIT));
+
+            personCache.put(person.getKey(), person);
+        }
+
+        System.out.println("Populated persons: " + PERSON_ROWS_COUNT);
+
+        System.out.printf("");
+    }
+
+    @Setup (Level.Trial)
+    public void startOldNodes() {
+        System.out.println();
+
+        System.out.println("Using OLD marshaller");
+
+        node1 = Ignition.start(createOldConfiguration("node1"));
+        //node2 = Ignition.start(createOldConfiguration("node2"));
+
+        populateCaches();
+    }
+
+    //@Setup (Level.Trial)
+    public void startNewNodes() {
+        System.out.println();
+
+        System.out.println("Using New marshaller");
+
+        node1 = Ignition.start(createNewConfiguration("node1"));
+        //node2 = Ignition.start(createNewConfiguration("node2"));
+
+        populateCaches();
+    }
+
+    @TearDown (Level.Trial)
+    public void stopNodes() {
+        Ignition.stopAll(true);
+    }
+
+    //@GenerateMicroBenchmark
+    public void sqlQuerySimple() {
+        String sql = "salary > ? and salary <= ?";
+
+        List<Cache.Entry<AffinityKey<UUID>, Person>> result =
+            personCache.query(new SqlQuery<AffinityKey<UUID>, Person>(Person.class, sql).
+            setArgs(0, 200000)).getAll();
+
+        if (result.size() == 0)
+            throw new RuntimeException("Invalid result size");
+    }
+
+    //@GenerateMicroBenchmark
+    public void sqlQueryWithJoin() {
+        // SQL clause query which joins on 2 types to select people for a specific organization.
+        String joinSql =
+            "from Person, \"" + DEPARTMENT_CACHE + "\".Department as dep " +
+                "where Person.depId = dep.id " +
+                "and lower(dep.name) = lower(?)";
+
+        // Execute queries for find employees for different organizations.
+        List<Cache.Entry<AffinityKey<UUID>, Person>> result =
+            personCache.query(new SqlQuery<AffinityKey<UUID>, Person>(Person.class, joinSql).
+                setArgs("Dep Name 1")).getAll();
+
+        if (result.size() == 0)
+            throw new RuntimeException("Invalid result size");
+    }
+
+    @GenerateMicroBenchmark
+    public void sqlQueryWithAggregation() {
+        // Calculate average of salary of all persons in ApacheIgnite.
+        // Note that we also join on Organization cache as well.
+        Random rand = new Random();
+
+        String sql =
+//            "select Person.firstName, Person.lastName, Person.salary " +
+            "select Person.firstName, city.name " +
+                "from Person, \"" + DEPARTMENT_CACHE + "\".Department as dep, " +
+                "\"" + CITY_CACHE + "\".City as city " +
+                "where Person.depId = dep.id and dep.cityId = city.id " +
+                "and city.population > ? and city.population <= ?";
+
+        QueryCursor<List<?>> cursor = personCache.query(new SqlFieldsQuery(sql).setArgs(rand.nextInt(1000),
+                                                                                        rand.nextInt(10000000)));
+
+        if (cursor.getAll().size() == 0)
+            System.err.println("Invalid result size");
+    }
+
+
+    /*public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*" + QueryMarshallerBenchmark.class.getSimpleName() + ".*")
+            .warmupIterations(15)
+            .measurementIterations(35)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+            .build();
+
+        new Runner(opts).run();
+    }*/
+
+    public static void main(String... args) throws Exception {
+        QueryMarshallerBenchmark benchmark = new QueryMarshallerBenchmark();
+
+        benchmark.startOldNodes();
+
+        for (int i = 0; i < 20000; i++) {
+            benchmark.sqlQuerySimple();
+
+            if (i % 1000 == 0)
+                System.out.println("Iteration: " + i);
+        }
+
+        benchmark.stopNodes();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/ReadFieldBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/ReadFieldBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/ReadFieldBenchmark.java
new file mode 100644
index 0000000..a118ca5
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/ReadFieldBenchmark.java
@@ -0,0 +1,91 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.logic.results.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * 
+ */
+@State
+public class ReadFieldBenchmark {
+
+    private OptimizedMarshaller marshaller;
+
+    private byte[] arr;
+
+    @Setup
+    public void init() throws Exception {
+        marshaller = new OptimizedMarshaller();
+
+        marshaller.setContext(new MarshallerContextJMHImpl());
+
+        /*marshaller.setMetadataHandler(new OptimizedMarshallerMetaHandler() {
+
+            private ConcurrentHashMap<Integer, OptimizedObjectMetadata> map = new ConcurrentHashMap<Integer,
+                OptimizedObjectMetadata>();
+
+            @Override public void addMeta(int typeId, OptimizedObjectMetadata meta) {
+                map.put(typeId, meta);
+            }
+
+            @Override public OptimizedObjectMetadata metadata(int typeId) {
+                return map.get(typeId);
+            }
+        });
+
+        marshaller.enableFieldsIndexing(PersonSimple.class);
+*/
+        PersonSimple person = new PersonSimple(100, "Denis A", "Magda", 200);
+
+        arr = marshaller.marshal(person);
+    }
+
+    @GenerateMicroBenchmark
+    public void testReadField() throws Exception {
+        //boolean res = marshaller.hasField("firstName", arr, 0, arr.length);
+
+        //if (!res)
+        //    throw new RuntimeException("Fuck");
+
+        Object name = marshaller.readField("id", arr, 0, arr.length, null);
+
+        if (name == null)
+            throw new RuntimeException("Fuck");
+    }
+
+    public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*")
+            .warmupIterations(15)
+            .measurementIterations(15)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+            .build();
+
+        Map<BenchmarkRecord,RunResult> records = new Runner(opts).run();
+        /*for (Map.Entry<BenchmarkRecord, RunResult> result : records.entrySet()) {
+            Result r = result.getValue().getPrimaryResult();
+            System.out.println("API replied benchmark score: "
+                                   + r.getScore() + " "
+                                   + r.getScoreUnit() + " over "
+                                   + r.getStatistics().getN() + " iterations");
+        }*/
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/SeveralNodesQueryMarshallerBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/SeveralNodesQueryMarshallerBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/SeveralNodesQueryMarshallerBenchmark.java
new file mode 100644
index 0000000..54b00aa
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/SeveralNodesQueryMarshallerBenchmark.java
@@ -0,0 +1,432 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.query.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import javax.cache.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+@State (value = Scope.Benchmark)
+public class SeveralNodesQueryMarshallerBenchmark {
+
+    private final static String PERSON_CACHE = "person";
+
+    private final static String CITY_CACHE = "city";
+
+    private final static String DEPARTMENT_CACHE = "dep";
+
+    private final static String ORGANIZATION_CACHE = "org";
+
+    private static final int PERSON_ROWS_COUNT = 50000;
+
+    private static final int CITY_ROWS_COUNT = 500;
+
+    private static final int DEPARTMENT_ROWS_COUNT = CITY_ROWS_COUNT * 10;
+
+    private static final int ORGANIZATION_ROWS_COUNT = 30;
+
+    private static final int SALARY_LIMIT = 100000;
+
+
+    private TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    private Ignite clientNode;
+
+    private IgniteCache<AffinityKey<UUID>, Person> personCache;
+
+    private IgniteConfiguration createOldConfiguration(String gridName) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        OptimizedMarshaller marshaller = new OptimizedMarshaller();
+        marshaller.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1);
+
+        cfg.setMarshaller(marshaller);
+
+        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+        cityCacheCfg.setTypeMetadata(Arrays.asList(createCityMetadata()));
+
+        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+        orgCacheCfg.setTypeMetadata(Arrays.asList(createOrgMetadata()));
+
+        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+        depCacheCfg.setTypeMetadata(Arrays.asList(createDepartmentMeta()));
+
+        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+        personCacheCfg.setTypeMetadata(Arrays.asList(createPersonMeta()));
+
+        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+//        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+//        cityCacheCfg.setIndexedTypes(UUID.class, City.class);
+//
+//        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+//        orgCacheCfg.setIndexedTypes(UUID.class, Organization.class);
+//
+//        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+//        depCacheCfg.setIndexedTypes(AffinityKey.class, Department.class);
+//
+//        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+//        personCacheCfg.setIndexedTypes(AffinityKey.class, Person.class);
+//
+//        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+        return cfg;
+    }
+
+    private IgniteConfiguration createNewConfiguration(String gridName) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        OptimizedMarshaller marshaller = new OptimizedMarshaller();
+        marshaller.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1_1);
+        cfg.setMarshaller(marshaller);
+
+        CacheConfiguration cityCacheCfg = createCacheCfg(CITY_CACHE);
+        cityCacheCfg.setTypeMetadata(Arrays.asList(createCityMetadata()));
+
+        CacheConfiguration orgCacheCfg = createCacheCfg(ORGANIZATION_CACHE);
+        orgCacheCfg.setTypeMetadata(Arrays.asList(createOrgMetadata()));
+
+        CacheConfiguration depCacheCfg = createCacheCfg(DEPARTMENT_CACHE);
+        depCacheCfg.setTypeMetadata(Arrays.asList(createDepartmentMeta()));
+
+        CacheConfiguration personCacheCfg = createCacheCfg(PERSON_CACHE);
+        personCacheCfg.setTypeMetadata(Arrays.asList(createPersonMeta()));
+
+        cfg.setCacheConfiguration(cityCacheCfg, orgCacheCfg, depCacheCfg, personCacheCfg);
+
+        return cfg;
+    }
+
+    private CacheConfiguration createCacheCfg(String name) {
+        CacheConfiguration cCfg = new CacheConfiguration();
+        cCfg.setName(name);
+        cCfg.setCacheMode(CacheMode.PARTITIONED);
+        cCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+        cCfg.setSwapEnabled(false);
+
+//        cCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
+//        cCfg.setOffHeapMaxMemory(0);
+//        cCfg.setSqlOnheapRowCacheSize(1);
+
+        return cCfg;
+    }
+
+    private CacheTypeMetadata createCityMetadata() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(UUID.class);
+        meta.setValueType(City.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+        queryFields.put("population", Integer.class);
+        queryFields.put("age", Integer.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createOrgMetadata() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(UUID.class);
+        meta.setValueType(Organization.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createDepartmentMeta() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(AffinityKey.class);
+        meta.setValueType(Department.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+        indexes.put("cityId", UUID.class);
+        indexes.put("orgId", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("name", String.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private CacheTypeMetadata createPersonMeta() {
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(AffinityKey.class);
+        meta.setValueType(Person.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", UUID.class);
+        indexes.put("depId", UUID.class);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("firstName", String.class);
+        queryFields.put("lastName", String.class);
+        queryFields.put("rank", Integer.class);
+        queryFields.put("title", String.class);
+        queryFields.put("age", Integer.class);
+        queryFields.put("salary", Integer.class);
+
+        meta.setAscendingFields(indexes);
+        meta.setQueryFields(queryFields);
+
+        return meta;
+    }
+
+    private void populateCaches() {
+        Random rand = new Random();
+
+        System.out.println();
+
+        IgniteCache<UUID, City> cityCache = clientNode.cache(CITY_CACHE);
+
+        City[] cities = new City[CITY_ROWS_COUNT];
+
+        for (int i = 0; i < CITY_ROWS_COUNT; i++) {
+            City city = new City("City Name " + i, rand.nextInt(10000000), rand.nextInt(2000), "Country" + i);
+
+            cities[i] = city;
+
+            cityCache.put(city.getId(), city);
+        }
+
+        System.out.println("Populated cities: " + CITY_ROWS_COUNT);
+
+        IgniteCache<UUID, Organization> orgCache = clientNode.cache(ORGANIZATION_CACHE);
+
+        Organization[] organizations = new Organization[ORGANIZATION_ROWS_COUNT];
+
+        for (int i = 0; i < ORGANIZATION_ROWS_COUNT; i++) {
+            Organization org = new Organization("Org Name " + i);
+
+            organizations[i] = org;
+
+            orgCache.put(org.getId(), org);
+        }
+
+        System.out.println("Populated organizations: " + ORGANIZATION_ROWS_COUNT);
+
+        IgniteCache<AffinityKey<UUID>, Department> depCache = clientNode.cache(DEPARTMENT_CACHE);
+
+        Department[] departments = new Department[DEPARTMENT_ROWS_COUNT];
+
+        for (int i = 0; i < DEPARTMENT_ROWS_COUNT; i++) {
+            Department dep = new Department("Dep Name " + i, cities[rand.nextInt(CITY_ROWS_COUNT)],
+                organizations[rand.nextInt(ORGANIZATION_ROWS_COUNT)]);
+
+            departments[i] = dep;
+
+            try {
+                depCache.put(dep.getKey(), dep);
+            }
+            catch (Exception e) {
+                System.out.println("ROW: " + i);
+                e.printStackTrace();
+            }
+        }
+
+        System.out.println("Populated departments: " + DEPARTMENT_ROWS_COUNT);
+
+        cities = null;
+        organizations = null;
+
+        personCache = clientNode.cache(PERSON_CACHE);
+
+        for (int i = 0; i < PERSON_ROWS_COUNT; i++) {
+            Person person = new Person(departments[rand.nextInt(DEPARTMENT_ROWS_COUNT)], "First Name " + i,
+                "Last Name " + i, rand.nextInt(21), "Title " + i, rand.nextInt(90), rand.nextInt(SALARY_LIMIT));
+
+            personCache.put(person.getKey(), person);
+        }
+
+        System.out.println("Populated persons: " + PERSON_ROWS_COUNT);
+
+        System.out.printf("");
+    }
+
+    //@Setup (Level.Trial)
+    public void startOldNodes() {
+        System.out.println();
+
+        System.out.println("Using OLD marshaller");
+
+        Ignition.start(createOldConfiguration("server1"));
+        Ignition.start(createOldConfiguration("server2"));
+        Ignition.start(createOldConfiguration("server3"));
+
+        IgniteConfiguration clientCfg = createOldConfiguration("client");
+        clientCfg.setClientMode(true);
+
+        clientNode = Ignition.start(clientCfg);
+
+        populateCaches();
+    }
+
+    @Setup (Level.Trial)
+    public void startNewNodes() {
+        System.out.println();
+
+        System.out.println("Using NEW marshaller");
+
+        Ignition.start(createNewConfiguration("server1"));
+        Ignition.start(createNewConfiguration("server2"));
+        Ignition.start(createNewConfiguration("server3"));
+
+        IgniteConfiguration clientCfg = createNewConfiguration("client");
+        clientCfg.setClientMode(true);
+
+        clientNode = Ignition.start(clientCfg);
+
+        populateCaches();
+    }
+
+    @TearDown (Level.Trial)
+    public void stopNodes() {
+        Ignition.stopAll(true);
+    }
+
+    //@GenerateMicroBenchmark
+    public void sqlQuerySimple() {
+        String sql = "salary > ? and salary <= ?";
+
+        List<Cache.Entry<AffinityKey<UUID>, Person>> result =
+            personCache.query(new SqlQuery<AffinityKey<UUID>, Person>(Person.class, sql).
+            setArgs(0, 200000)).getAll();
+
+        if (result.size() == 0)
+            throw new RuntimeException("Invalid result size");
+    }
+
+    //@GenerateMicroBenchmark
+    public void sqlQueryWithJoin() {
+        // SQL clause query which joins on 2 types to select people for a specific organization.
+        String joinSql =
+            "from Person, \"" + DEPARTMENT_CACHE + "\".Department as dep " +
+                "where Person.depId = dep.id " +
+                "and lower(dep.name) = lower(?)";
+
+        // Execute queries for find employees for different organizations.
+        List<Cache.Entry<AffinityKey<UUID>, Person>> result =
+            personCache.query(new SqlQuery<AffinityKey<UUID>, Person>(Person.class, joinSql).
+                setArgs("Dep Name 1")).getAll();
+
+        if (result.size() == 0)
+            throw new RuntimeException("Invalid result size");
+    }
+
+    @GenerateMicroBenchmark
+    public void sqlQueryWithAggregation() {
+        // Calculate average of salary of all persons in ApacheIgnite.
+        // Note that we also join on Organization cache as well.
+        Random rand = new Random();
+
+        String sql =
+//            "select Person.firstName, Person.lastName, Person.salary " +
+            "select Person.firstName, city.name " +
+                "from Person, \"" + DEPARTMENT_CACHE + "\".Department as dep, " +
+                "\"" + CITY_CACHE + "\".City as city " +
+                "where Person.depId = dep.id and dep.cityId = city.id " +
+                "and city.population > ? and city.population <= ?";
+
+        QueryCursor<List<?>> cursor = personCache.query(new SqlFieldsQuery(sql).setArgs(rand.nextInt(1000),
+                                                                                        rand.nextInt(10000000)));
+
+        if (cursor.getAll().size() == 0)
+            System.err.println("Invalid result size");
+    }
+
+
+    public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*" + SeveralNodesQueryMarshallerBenchmark.class.getSimpleName() + ".*")
+            .warmupIterations(15)
+            .measurementIterations(35)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+            .build();
+
+        new Runner(opts).run();
+    }
+
+//    public static void main(String... args) throws Exception {
+//        SeveralNodesQueryMarshallerBenchmark benchmark = new SeveralNodesQueryMarshallerBenchmark();
+//
+//        benchmark.startNewNodes();
+//
+//        for (int i = 0; i < 20000; i++) {
+//            benchmark.sqlQueryWithAggregation();
+//
+//            if (i != 0 && i % 2000  == 0) {
+//                System.out.println("Iteration: " + i);
+//                break;
+//            }
+//        }
+//
+//        //benchmark.stopNodes();
+//    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/SimpleMarshallerBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/SimpleMarshallerBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/SimpleMarshallerBenchmark.java
new file mode 100644
index 0000000..2fb6f8f
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/SimpleMarshallerBenchmark.java
@@ -0,0 +1,208 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.query.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.jmh.model.*;
+import org.apache.ignite.marshaller.*;
+import org.apache.ignite.marshaller.optimized.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.logic.results.*;
+import org.openjdk.jmh.output.*;
+import org.openjdk.jmh.runner.*;
+import org.openjdk.jmh.runner.options.*;
+
+import javax.cache.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ *
+ */
+@State
+public class SimpleMarshallerBenchmark {
+
+    private TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    private Ignite node;
+
+    private IgniteCache<Integer, PersonSimple> cache;
+
+    private static final int ROWS_COUNT = 50000;
+
+    private IgniteConfiguration createConfiguration(String gridName, Marshaller marshaller) {
+        IgniteConfiguration cfg = new IgniteConfiguration();
+
+        cfg.setGridName(gridName);
+
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        spi.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(spi);
+
+        cfg.setMarshaller(marshaller);
+
+        CacheConfiguration cCfg = new CacheConfiguration();
+        cCfg.setName("query");
+        cCfg.setCacheMode(CacheMode.PARTITIONED);
+        cCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+        cCfg.setSwapEnabled(false);
+
+        /*cCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
+        cCfg.setOffHeapMaxMemory(0);
+        cCfg.setSqlOnheapRowCacheSize(1);*/
+
+        CacheTypeMetadata meta = new CacheTypeMetadata();
+
+        meta.setKeyType(Integer.class);
+        meta.setValueType(PersonSimple.class);
+
+        HashMap<String, Class<?>> indexes = new HashMap<>();
+        indexes.put("id", Integer.class);
+        indexes.put("orgId", Integer.class);
+        indexes.put("salary", Double.class);
+
+        meta.setAscendingFields(indexes);
+
+        HashMap<String, Class<?>> queryFields = new HashMap<>();
+        queryFields.put("firstName", String.class);
+        queryFields.put("lastName", String.class);
+
+        meta.setQueryFields(queryFields);
+
+        cCfg.setTypeMetadata(Arrays.asList(meta));
+
+        cfg.setCacheConfiguration(cCfg);
+
+        return cfg;
+    }
+
+    @TearDown
+    public void stopNodes() {
+        Ignition.stopAll(true);
+    }
+
+    //@Setup
+    public void startOldNodes() {
+        System.out.println();
+        System.out.println("STARTED OLD NODE");
+
+        OptimizedMarshaller marsh = new OptimizedMarshaller();
+        marsh.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1);
+
+        node = Ignition.start(createConfiguration("node", marsh));
+
+        cache = node.cache("query");
+
+        for (int i = 0; i < ROWS_COUNT; i++) {
+            PersonSimple person = new PersonSimple(i, "Name ", "Surname ", (i + 1) * 100);
+            cache.put(i, person);
+        }
+    }
+
+    @Setup
+    public void startNewNodes() {
+        System.out.println();
+        System.out.println("STARTED NEW NODE");
+
+        OptimizedMarshaller marsh = new OptimizedMarshaller();
+        marsh.setProtocolVersion(OptimizedMarshallerProtocolVersion.VER_1_1);
+
+        node = Ignition.start(createConfiguration("node", marsh));
+
+        cache = node.cache("query");
+
+        for (int i = 0; i < ROWS_COUNT; i++) {
+            PersonSimple person = new PersonSimple(i, "Name ", "Surname ", (i + 1) * 100);
+            cache.put(i, person);
+        }
+    }
+
+
+    //@GenerateMicroBenchmark
+    public void testQuery() throws Exception {
+        double salary = ThreadLocalRandom.current().nextInt(0, ROWS_COUNT);
+
+        double maxSalary = salary + 100;
+
+        SqlQuery qry = new SqlQuery(PersonSimple.class, "salary >= ? and salary <= ?");
+
+        qry.setArgs(salary, maxSalary);
+
+        Collection<Cache.Entry<Integer, Object>> entries = cache.query(qry).getAll();
+
+        entries.size();
+
+//        Collection<Cache.Entry<Integer, PersonSimple>> entries = cache.query(qry).getAll();
+//
+//        for (Cache.Entry<Integer, PersonSimple> entry : entries) {
+//            PersonSimple p = entry.getValue();
+//
+//            if (p.getSalary() < salary || p.getSalary() > maxSalary)
+//                throw new Exception("Invalid person retrieved [min=" + salary + ", max=" + maxSalary +
+//                                        ", person=" + p + ']');
+//        }
+    }
+
+    @GenerateMicroBenchmark
+    public void testFieldsQuery() throws Exception {
+        double salary = ThreadLocalRandom.current().nextInt(0, ROWS_COUNT);
+
+        double maxSalary = salary + 100;
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("SELECT PersonSimple.firstName, PersonSimple.lastName FROM " +
+            "PersonSimple WHERE salary >= ? and salary <= ?");
+
+        qry.setArgs(salary, maxSalary);
+
+        List<List<?>> result = cache.query(qry).getAll();
+
+        for (List<?> row : result) {
+            if (row.get(0) == null || row.get(1) == null)
+                throw new Exception("Invalid person retrieved [min=" + salary + ", max=" + maxSalary +
+                                        ", person=" + row + ']');
+        }
+    }
+
+//    public static void main(String args[]) throws Exception {
+//        SimpleMarshallerBenchmark benchmark = new SimpleMarshallerBenchmark();
+//
+//        benchmark.startOldNodes();
+//
+//        for (int i = 0; i < 500000000; i++) {
+//            benchmark.testFieldsQuery();
+//
+//            if (i % 10000 == 0)
+//                System.out.println("Iteration: " + i);
+//        }
+//
+//        benchmark.stopNodes();
+//    }
+
+
+    public static void main(String... args) throws Exception {
+        Options opts = new OptionsBuilder()
+            .include(".*" + SimpleMarshallerBenchmark.class.getSimpleName() + ".*")
+            .warmupIterations(15)
+            .measurementIterations(35)
+            .jvmArgs("-server")
+            .forks(1)
+            .outputFormat(OutputFormatType.TextReport)
+            //.shouldDoGC(true)
+            .build();
+
+        new Runner(opts).run();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/City.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/City.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/City.java
new file mode 100644
index 0000000..f2ca065
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/City.java
@@ -0,0 +1,72 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+public class City implements Serializable {
+    @QuerySqlField(index = true)
+    private UUID id;
+
+    @QuerySqlField
+    private String name;
+
+    @QuerySqlField
+    private int population;
+
+    @QuerySqlField
+    private int age;
+
+    private String country;
+
+    public City(String name, int population, int age, String country) {
+        id = UUID.randomUUID();
+
+        this.name = name;
+        this.population = population;
+        this.age = age;
+        this.country = country;
+    }
+
+    public UUID getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getPopulation() {
+        return population;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public String getCountry() {
+        return country;
+    }
+
+    @Override public String toString() {
+        return "City{" +
+            "id=" + id +
+            ", name='" + name + '\'' +
+            ", population=" + population +
+            ", age=" + age +
+            ", country='" + country + '\'' +
+            '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Department.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Department.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Department.java
new file mode 100644
index 0000000..a1a6633
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Department.java
@@ -0,0 +1,75 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+public class Department implements Serializable {
+    @QuerySqlField(index = true)
+    private UUID id;
+
+    @QuerySqlField (index = true)
+    private UUID cityId;
+
+    @QuerySqlField (index = true)
+    private UUID orgId;
+
+    @QuerySqlField
+    private String name;
+
+    private transient AffinityKey<UUID> key;
+
+    public Department(String name, City city, Organization org) {
+        id = UUID.randomUUID();
+
+        cityId = city.getId();
+        orgId = org.getId();
+
+        this.name = name;
+    }
+
+    public UUID getId() {
+        return id;
+    }
+
+    public UUID getCityId() {
+        return cityId;
+    }
+
+    public UUID getOrgId() {
+        return orgId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public AffinityKey<UUID> getKey() {
+        if (key == null)
+            key = new AffinityKey<>(id, cityId);
+
+        return key;
+    }
+
+    @Override public String toString() {
+        return "Department{" +
+            "id=" + id +
+            ", cityId=" + cityId +
+            ", orgId=" + orgId +
+            ", name='" + name + '\'' +
+            '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Organization.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Organization.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Organization.java
new file mode 100644
index 0000000..a0882ef
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Organization.java
@@ -0,0 +1,39 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+public class Organization implements Serializable {
+    @QuerySqlField (index = true)
+    private UUID id;
+
+    @QuerySqlField
+    private String name;
+
+    public Organization(String name) {
+        id = UUID.randomUUID();
+
+        this.name = name;
+    }
+
+    public UUID getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Person.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Person.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Person.java
new file mode 100644
index 0000000..e9d7331
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/Person.java
@@ -0,0 +1,97 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Created by GridAdmin1234 on 6/25/2015.
+ */
+public class Person implements Serializable {
+    @QuerySqlField (index = true)
+    private UUID id;
+
+    @QuerySqlField (index = true)
+    private UUID depId;
+
+    @QuerySqlField
+    private String firstName;
+
+    @QuerySqlField
+    private String lastName;
+
+    @QuerySqlField
+    private int rank;
+
+    @QuerySqlField
+    private String title;
+
+    @QuerySqlField
+    private int age;
+
+    @QuerySqlField
+    private int salary;
+
+    private transient AffinityKey<UUID> key;
+
+    public Person(Department dep, String firstName, String lastName, int rank, String title, int age, int salary) {
+        id = UUID.randomUUID();
+        depId = dep.getId();
+
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.rank = rank;
+        this.title = title;
+        this.age = age;
+        this.salary = salary;
+    }
+
+    public UUID getId() {
+        return id;
+    }
+
+    public UUID getDepId() {
+        return depId;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public int getRank() {
+        return rank;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public int getSalary() {
+        return salary;
+    }
+
+    public AffinityKey<UUID> getKey() {
+        if (key == null)
+            key = new AffinityKey<>(id, depId);
+
+        return key;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonExternalizable.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonExternalizable.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonExternalizable.java
new file mode 100644
index 0000000..854f95e
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonExternalizable.java
@@ -0,0 +1,190 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+
+/**
+ * Person record used for query test.
+ */
+public class PersonExternalizable implements Externalizable {
+    /** Person ID. */
+    @QuerySqlField(index = true)
+    private int id;
+
+    /** Organization ID. */
+    @QuerySqlField(index = true)
+    private int orgId;
+
+    /** First name (not-indexed). */
+    @QuerySqlField
+    private String firstName;
+
+    /** Last name (not indexed). */
+    @QuerySqlField
+    private String lastName;
+
+    /** Salary. */
+    @QuerySqlField(index = true)
+    private double salary;
+
+    /**
+     * Constructs empty person.
+     */
+    public PersonExternalizable() {
+        // No-op.
+    }
+
+    /**
+     * Constructs person record that is not linked to any organization.
+     *
+     * @param id Person ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonExternalizable(int id, String firstName, String lastName, double salary) {
+        this(id, 0, firstName, lastName, salary);
+    }
+
+    /**
+     * Constructs person record.
+     *
+     * @param id Person ID.
+     * @param orgId Organization ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonExternalizable(int id, int orgId, String firstName, String lastName, double salary) {
+        this.id = id;
+        this.orgId = orgId;
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.salary = salary;
+    }
+
+    /**
+     * @return Person id.
+     */
+    public int getId() {
+        return id;
+    }
+
+    /**
+     * @param id Person id.
+     */
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    /**
+     * @return Organization id.
+     */
+    public int getOrganizationId() {
+        return orgId;
+    }
+
+    /**
+     * @param orgId Organization id.
+     */
+    public void setOrganizationId(int orgId) {
+        this.orgId = orgId;
+    }
+
+    /**
+     * @return Person first name.
+     */
+    public String getFirstName() {
+        return firstName;
+    }
+
+    /**
+     * @param firstName Person first name.
+     */
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    /**
+     * @return Person last name.
+     */
+    public String getLastName() {
+        return lastName;
+    }
+
+    /**
+     * @param lastName Person last name.
+     */
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    /**
+     * @return Salary.
+     */
+    public double getSalary() {
+        return salary;
+    }
+
+    /**
+     * @param salary Salary.
+     */
+    public void setSalary(double salary) {
+        this.salary = salary;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt(id);
+        out.writeInt(orgId);
+        out.writeUTF(firstName);
+        out.writeUTF(lastName);
+        out.writeDouble(salary);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        id = in.readInt();
+        orgId = in.readInt();
+        firstName = in.readUTF();
+        lastName = in.readUTF();
+        salary = in.readDouble();
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        return this == o || (o instanceof PersonExternalizable) && id == ((PersonExternalizable)o).id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return "Person [firstName=" + firstName +
+            ", id=" + id +
+            ", orgId=" + orgId +
+            ", lastName=" + lastName +
+            ", salary=" + salary +
+            ']';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonMarshalAware.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonMarshalAware.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonMarshalAware.java
new file mode 100644
index 0000000..8e80db6
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonMarshalAware.java
@@ -0,0 +1,199 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.query.annotations.*;
+import org.apache.ignite.marshaller.optimized.*;
+
+import java.io.*;
+
+/**
+ * Person record used for query test.
+ */
+public class PersonMarshalAware implements OptimizedMarshalAware {
+    /** Person ID. */
+    @QuerySqlField(index = true)
+    private int id;
+
+    /** Organization ID. */
+    @QuerySqlField(index = true)
+    private int orgId;
+
+    /** First name (not-indexed). */
+    @QuerySqlField
+    private String firstName;
+
+    /** Last name (not indexed). */
+    @QuerySqlField
+    private String lastName;
+
+    /** Salary. */
+    @QuerySqlField(index = true)
+    private double salary;
+
+    /**
+     * Constructs empty person.
+     */
+    public PersonMarshalAware() {
+        // No-op.
+    }
+
+    /**
+     * Constructs person record that is not linked to any organization.
+     *
+     * @param id Person ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonMarshalAware(int id, String firstName, String lastName, double salary) {
+        this(id, 0, firstName, lastName, salary);
+    }
+
+    /**
+     * Constructs person record.
+     *
+     * @param id Person ID.
+     * @param orgId Organization ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonMarshalAware(int id, int orgId, String firstName, String lastName, double salary) {
+        this.id = id;
+        this.orgId = orgId;
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.salary = salary;
+    }
+
+    /**
+     * @return Person id.
+     */
+    public int getId() {
+        return id;
+    }
+
+    /**
+     * @param id Person id.
+     */
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    /**
+     * @return Organization id.
+     */
+    public int getOrganizationId() {
+        return orgId;
+    }
+
+    /**
+     * @param orgId Organization id.
+     */
+    public void setOrganizationId(int orgId) {
+        this.orgId = orgId;
+    }
+
+    /**
+     * @return Person first name.
+     */
+    public String getFirstName() {
+        return firstName;
+    }
+
+    /**
+     * @param firstName Person first name.
+     */
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    /**
+     * @return Person last name.
+     */
+    public String getLastName() {
+        return lastName;
+    }
+
+    /**
+     * @param lastName Person last name.
+     */
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    /**
+     * @return Salary.
+     */
+    public double getSalary() {
+        return salary;
+    }
+
+    /**
+     * @param salary Salary.
+     */
+    public void setSalary(double salary) {
+        this.salary = salary;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeFields(OptimizedFieldsWriter writer) throws IOException {
+        writer.writeInt("id", id);
+        writer.writeInt("orgId", orgId);
+        writer.writeString("firstName", firstName);
+        writer.writeString("lastName", lastName);
+        writer.writeDouble("salary", salary);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readFields(OptimizedFieldsReader reader) throws IOException {
+        id = reader.readInt("id");
+        orgId = reader.readInt("orgId");
+        firstName = reader.readString("firstName");
+        lastName = reader.readString("lastName");
+        salary = reader.readDouble("salary");
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        return this == o || (o instanceof PersonMarshalAware) && id == ((PersonMarshalAware)o).id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return "Person [firstName=" + firstName +
+            ", id=" + id +
+            ", orgId=" + orgId +
+            ", lastName=" + lastName +
+            ", salary=" + salary +
+            ']';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/cc19b086/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonSimple.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonSimple.java b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonSimple.java
new file mode 100644
index 0000000..b749de1
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/jmh/model/PersonSimple.java
@@ -0,0 +1,172 @@
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+/*
+ *  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.jmh.model;
+
+import org.apache.ignite.cache.query.annotations.*;
+
+import java.io.*;
+
+/**
+ * Person record used for query test.
+ */
+public class PersonSimple implements Serializable {
+    /** Person ID. */
+    @QuerySqlField(index = true)
+    private int id;
+
+    /** Organization ID. */
+    @QuerySqlField(index = true)
+    private int orgId;
+
+    /** First name (not-indexed). */
+    @QuerySqlField
+    private String firstName;
+
+    /** Last name (not indexed). */
+    @QuerySqlField
+    private String lastName;
+
+    /** Salary. */
+    @QuerySqlField(index = true)
+    private double salary;
+
+    /**
+     * Constructs empty person.
+     */
+    public PersonSimple() {
+        // No-op.
+    }
+
+    /**
+     * Constructs person record that is not linked to any organization.
+     *
+     * @param id Person ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonSimple(int id, String firstName, String lastName, double salary) {
+        this(id, 0, firstName, lastName, salary);
+    }
+
+    /**
+     * Constructs person record.
+     *
+     * @param id Person ID.
+     * @param orgId Organization ID.
+     * @param firstName First name.
+     * @param lastName Last name.
+     * @param salary Salary.
+     */
+    public PersonSimple(int id, int orgId, String firstName, String lastName, double salary) {
+        this.id = id;
+        this.orgId = orgId;
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.salary = salary;
+    }
+
+    /**
+     * @return Person id.
+     */
+    public int getId() {
+        return id;
+    }
+
+    /**
+     * @param id Person id.
+     */
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    /**
+     * @return Organization id.
+     */
+    public int getOrganizationId() {
+        return orgId;
+    }
+
+    /**
+     * @param orgId Organization id.
+     */
+    public void setOrganizationId(int orgId) {
+        this.orgId = orgId;
+    }
+
+    /**
+     * @return Person first name.
+     */
+    public String getFirstName() {
+        return firstName;
+    }
+
+    /**
+     * @param firstName Person first name.
+     */
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    /**
+     * @return Person last name.
+     */
+    public String getLastName() {
+        return lastName;
+    }
+
+    /**
+     * @param lastName Person last name.
+     */
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    /**
+     * @return Salary.
+     */
+    public double getSalary() {
+        return salary;
+    }
+
+    /**
+     * @param salary Salary.
+     */
+    public void setSalary(double salary) {
+        this.salary = salary;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        return this == o || (o instanceof PersonSimple) && id == ((PersonSimple)o).id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return id;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return "Person [firstName=" + firstName +
+            ", id=" + id +
+            ", orgId=" + orgId +
+            ", lastName=" + lastName +
+            ", salary=" + salary +
+            ']';
+    }
+}