WIP
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
index a450521..6f0ad43 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
@@ -554,6 +554,8 @@
         }
     }
 
+    public static volatile boolean print = false;
+
     /** {@inheritDoc} */
     @SuppressWarnings("TooBroadScope")
     @Override public WALPointer log(WALRecord record) throws IgniteCheckedException, StorageException {
@@ -567,7 +569,12 @@
             return null;
 
         // Need to calculate record size first.
-        record.size(serializer.size(record));
+        int size = serializer.size(record);
+
+        if (print)
+            System.out.println("RECORD " + size + ": " + record.getClass().getSimpleName());
+
+        record.size(size);
 
         for (; ; currWrHandle = rollOver(currWrHandle)) {
             WALPointer ptr = currWrHandle.addRecord(record);
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/IndexBenchmarkRunner2.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/IndexBenchmarkRunner2.java
new file mode 100644
index 0000000..efdffae
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/IndexBenchmarkRunner2.java
@@ -0,0 +1,128 @@
+package org.apache.ignite.internal.processors.query.h2.opt;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.WALMode;
+import org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAheadLogManager;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.LongAdder;
+
+public class IndexBenchmarkRunner2 {
+    private static final String CACHE_NAME = "cache";
+
+    private static final int IDX_CNT = 1;
+
+    private static final long KEY_CNT = 1_000_000;
+
+    private static final int THREAD_CNT = 4;
+
+    private static final AtomicInteger READY_CNT = new AtomicInteger();
+
+    private static final LongAdder OPS = new LongAdder();
+
+    public static void main(String[] args) throws Exception {
+        U.delete(new File("C:\\Personal\\code\\incubator-ignite\\work"));
+
+        IgniteConfiguration cfg = new IgniteConfiguration().setLocalHost("127.0.0.1");
+
+        DataStorageConfiguration dsCfg = new DataStorageConfiguration().setWalMode(WALMode.LOG_ONLY);
+
+        dsCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);
+        dsCfg.getDefaultDataRegionConfiguration().setMaxSize(4 * 1024 * 1024 * 1024L);
+
+        dsCfg.setCheckpointFrequency(Long.MAX_VALUE);
+
+        cfg.setDataStorageConfiguration(dsCfg);
+
+        try (Ignite node = Ignition.start(cfg)) {
+            node.active(true);
+
+            IgniteCache<Integer, ValueObject> cache = node.createCache(cacheConfig(IDX_CNT));
+
+            String extra = genExtra(ThreadLocalRandom.current());
+
+            cache.put(1, new ValueObject(1, extra));
+            cache.remove(1);
+
+            FileWriteAheadLogManager.print = true;
+
+            System.out.println("PUT");
+            cache.put(1, new ValueObject(1, extra));
+            System.out.println();
+
+            System.out.println("UPDATE I");
+            cache.put(1, new ValueObject(2, extra));
+            System.out.println();
+
+            System.out.println("UPDATE S");
+            cache.put(1, new ValueObject(2, genExtra(ThreadLocalRandom.current())));
+            System.out.println();
+
+            System.out.println("DONE");
+        }
+    }
+
+    private static final int EXTRA_SIZE = 128;
+
+    private static String genExtra(ThreadLocalRandom rand) {
+        StringBuilder builder = new StringBuilder(EXTRA_SIZE);
+        for (int i = 0; i < EXTRA_SIZE; ++i)
+            builder.append((char) ('a' + rand.nextInt('z' - 'a' + 1)));
+        return builder.toString();
+    }
+
+    private static CacheConfiguration<Integer, ValueObject> cacheConfig(int idxCnt) {
+        CacheConfiguration<Integer, ValueObject> ccfg = new CacheConfiguration<>();
+
+        ccfg.setName(CACHE_NAME);
+        ccfg.setQueryEntities(Collections.singleton(queryEntity(idxCnt)));
+
+        return ccfg;
+    }
+
+    private static QueryEntity queryEntity(int idxCnt) {
+        QueryEntity entity = new QueryEntity(Integer.class, ValueObject.class);
+
+//        Collection<QueryIndex> idxs = new ArrayList<>();
+//
+//        for (int i = 0; i < idxCnt; i++) {
+//            String fieldName = "f" + i;
+//
+//            QueryIndex idx = new QueryIndex().setFieldNames(Collections.singleton(fieldName), true);
+//
+//            idxs.add(idx);
+//        }
+//
+//        entity.setIndexes(idxs);
+
+        return entity;
+    }
+
+    private static class ValueObject {
+        @QuerySqlField(index = true)
+        private int i;
+
+        @QuerySqlField
+        private String s;
+
+        public ValueObject(int i, String s) {
+            this.i = i;
+            this.s = s;
+        }
+    }
+}