Repository: apache/shardingsphere
Issue: Proxy will load all schema from registry when startup

## Bug Report

**For English only**, other languages will not accept.

Before report a bug, make sure you have:

- Searched open and closed [GitHub issues](https://github.com/sharding-sphere/sharding-sphere/issues).
- Read documentation: [ShardingSphere Doc](http://shardingsphere.io/document/current/en/overview/).

Please pay attention on issues you submitted, because we maybe need more details. 
If no response **more than 7 days** and we cannot reproduce it on current information, we will **close it**.

Please answer these questions before submitting your issue. Thanks!

### Which version of ShardingSphere did you use?
4.0.0.M1-SNAPSHOT
### Which project did you use? Sharding-JDBC or Sharding-Proxy?
Sharding-Proxy
### Expected behavior
Only load some configurations user want from regsitry when startup.
### Actual behavior
Load all the configs from registry when startup.
### Reason analyze (If you can)

### Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.

### Example codes for reproduce this issue (such as a github link).


Changed files:
sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/SQLExecuteCallbackFactoryTest.java
sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutorTest.java
sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutor.java
sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
sharding-core/src/main/java/org/apache/shardingsphere/core/routing/BatchRouteUnit.java
sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHook.java
sharding-opentracing/src/test/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHookTest.java
sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/LogicSchemas.java
sharding-core/src/main/java/org/apache/shardingsphere/core/routing/SQLUnit.java
sharding-core/src/main/java/org/apache/shardingsphere/core/routing/router/sharding/DatabaseHintSQLRouter.java
sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
sharding-core/src/main/java/org/apache/shardingsphere/core/rewrite/SQLBuilder.java
sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/StatementExecutorTest.java
sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutorTest.java
sharding-proxy/sharding-proxy-bootstrap/src/main/java/org/apache/shardingsphere/shardingproxy/Bootstrap.java
sharding-core/src/main/java/org/apache/shardingsphere/core/util/SQLLogger.java
sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/ShardingPreparedStatementTest.java
sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java

diff --git a/sharding-core/src/main/java/org/apache/shardingsphere/core/rewrite/SQLBuilder.java b/sharding-core/src/main/java/org/apache/shardingsphere/core/rewrite/SQLBuilder.java
index e46267be97d..59c9e8c2d9f 100644
--- a/sharding-core/src/main/java/org/apache/shardingsphere/core/rewrite/SQLBuilder.java
+++ b/sharding-core/src/main/java/org/apache/shardingsphere/core/rewrite/SQLBuilder.java
@@ -114,8 +114,7 @@ public final class SQLBuilder {
                 result.append(each);
             }
         }
-        List<List<Object>> parameterSets = insertParameters.isEmpty() ? new ArrayList<>(Collections.singleton(parameters)) : new ArrayList<>(Collections.singleton(insertParameters));
-        return new SQLUnit(result.toString(), parameterSets);
+        return insertParameters.isEmpty() ? new SQLUnit(result.toString(), new ArrayList<>(parameters)) : new SQLUnit(result.toString(), insertParameters);
     }
     
     /**
@@ -156,8 +155,7 @@ public final class SQLBuilder {
                 result.append(each);
             }
         }
-        List<List<Object>> parameterSets = insertParameters.isEmpty() ? new ArrayList<>(Collections.singleton(parameters)) : new ArrayList<>(Collections.singleton(insertParameters));
-        return new SQLUnit(result.toString(), parameterSets);
+        return insertParameters.isEmpty() ? new SQLUnit(result.toString(), parameters) : new SQLUnit(result.toString(), insertParameters);
     }
     
     private void appendTablePlaceholder(final TablePlaceholder tablePlaceholder, final String actualTableName, final StringBuilder stringBuilder) {
diff --git a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/BatchRouteUnit.java b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/BatchRouteUnit.java
index 186c3c40520..a66bb1c1d89 100644
--- a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/BatchRouteUnit.java
+++ b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/BatchRouteUnit.java
@@ -17,12 +17,16 @@
 
 package org.apache.shardingsphere.core.routing;
 
+import com.google.common.collect.Lists;
 import lombok.AccessLevel;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.ToString;
 
+import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -54,4 +58,19 @@ public final class BatchRouteUnit {
     public void mapAddBatchCount(final int jdbcAddBatchTimes) {
         jdbcAndActualAddBatchCallTimesMap.put(jdbcAddBatchTimes, actualCallAddBatchTimes++);
     }
+    
+    /**
+     * Get parameter sets.
+     * 
+     * @return parameter sets
+     */
+    public List<List<Object>> getParameterSets() {
+        List<List<Object>> result = new LinkedList<>();
+        if (routeUnit.getSqlUnit().getParameters().isEmpty() || 0 == actualCallAddBatchTimes) {
+            result.add(Collections.emptyList());
+        } else {
+            result.addAll(Lists.partition(routeUnit.getSqlUnit().getParameters(), routeUnit.getSqlUnit().getParameters().size() / actualCallAddBatchTimes));
+        }
+        return result;
+    }
 }
diff --git a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/SQLUnit.java b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/SQLUnit.java
index 6eb16a79b1b..9df2bd749c5 100644
--- a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/SQLUnit.java
+++ b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/SQLUnit.java
@@ -28,6 +28,7 @@ import java.util.List;
  * SQL unit.
  *
  * @author maxiaoguang
+ * @author panjuan
  */
 @RequiredArgsConstructor
 @Getter
@@ -37,5 +38,5 @@ public final class SQLUnit {
     
     private final String sql;
     
-    private final List<List<Object>> parameterSets;
+    private final List<Object> parameters;
 }
diff --git a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/router/sharding/DatabaseHintSQLRouter.java b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/router/sharding/DatabaseHintSQLRouter.java
index c536137cabc..3bffd17c887 100644
--- a/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/router/sharding/DatabaseHintSQLRouter.java
+++ b/sharding-core/src/main/java/org/apache/shardingsphere/core/routing/router/sharding/DatabaseHintSQLRouter.java
@@ -31,7 +31,6 @@ import org.apache.shardingsphere.core.rule.ShardingRule;
 import org.apache.shardingsphere.core.util.SQLLogger;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -60,7 +59,7 @@ public final class DatabaseHintSQLRouter implements ShardingRouter {
         RoutingResult routingResult = new DatabaseHintRoutingEngine(
                 shardingRule.getShardingDataSourceNames().getDataSourceNames(), (HintShardingStrategy) shardingRule.getDefaultDatabaseShardingStrategy()).route();
         for (TableUnit each : routingResult.getTableUnits().getTableUnits()) {
-            result.getRouteUnits().add(new RouteUnit(each.getDataSourceName(), new SQLUnit(logicSQL, new ArrayList<>(Collections.singleton(parameters)))));
+            result.getRouteUnits().add(new RouteUnit(each.getDataSourceName(), new SQLUnit(logicSQL, new ArrayList<>(parameters))));
         }
         if (showSQL) {
             SQLLogger.logSQL(logicSQL, sqlStatement, result.getRouteUnits());
diff --git a/sharding-core/src/main/java/org/apache/shardingsphere/core/util/SQLLogger.java b/sharding-core/src/main/java/org/apache/shardingsphere/core/util/SQLLogger.java
index c1741d0a001..4535e40d016 100644
--- a/sharding-core/src/main/java/org/apache/shardingsphere/core/util/SQLLogger.java
+++ b/sharding-core/src/main/java/org/apache/shardingsphere/core/util/SQLLogger.java
@@ -48,10 +48,10 @@ public final class SQLLogger {
         log("Logic SQL: {}", logicSQL);
         log("SQLStatement: {}", sqlStatement);
         for (RouteUnit each : routeUnits) {
-            if (each.getSqlUnit().getParameterSets().get(0).isEmpty()) {
+            if (each.getSqlUnit().getParameters().isEmpty()) {
                 log("Actual SQL: {} ::: {}", each.getDataSourceName(), each.getSqlUnit().getSql());
             } else {
-                log("Actual SQL: {} ::: {} ::: {}", each.getDataSourceName(), each.getSqlUnit().getSql(), each.getSqlUnit().getParameterSets());
+                log("Actual SQL: {} ::: {} ::: {}", each.getDataSourceName(), each.getSqlUnit().getSql(), each.getSqlUnit().getParameters());
             }
         }
     }
diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
index 2f06298ed96..469b900ab9a 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/AbstractStatementExecutor.java
@@ -117,7 +117,7 @@ public class AbstractStatementExecutor {
                 
                 @Override
                 public List<Object> apply(final StatementExecuteUnit input) {
-                    return input.getRouteUnit().getSqlUnit().getParameterSets().get(0);
+                    return input.getRouteUnit().getSqlUnit().getParameters();
                 }
             }));
         }
diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutor.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutor.java
index 1c4b60bfd13..b2dd6a05b16 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutor.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutor.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.shardingjdbc.executor;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import lombok.Getter;
@@ -139,7 +140,7 @@ public final class BatchPreparedStatementExecutor extends AbstractStatementExecu
     }
     
     private void reviseBatchRouteUnit(final BatchRouteUnit oldBatchRouteUnit, final BatchRouteUnit newBatchRouteUnit) {
-        oldBatchRouteUnit.getRouteUnit().getSqlUnit().getParameterSets().add(newBatchRouteUnit.getRouteUnit().getSqlUnit().getParameterSets().get(0));
+        oldBatchRouteUnit.getRouteUnit().getSqlUnit().getParameters().addAll(newBatchRouteUnit.getRouteUnit().getSqlUnit().getParameters());
         oldBatchRouteUnit.mapAddBatchCount(batchCount);
     }
     
@@ -214,24 +215,39 @@ public final class BatchPreparedStatementExecutor extends AbstractStatementExecu
      * @return parameter sets
      */
     public List<List<Object>> getParameterSet(final Statement statement) {
-        Optional<StatementExecuteUnit> target;
         List<List<Object>> result = new LinkedList<>();
         for (ShardingExecuteGroup<StatementExecuteUnit> each : getExecuteGroups()) {
-            target = Iterators.tryFind(each.getInputs().iterator(), new Predicate<StatementExecuteUnit>() {
-                
-                @Override
-                public boolean apply(final StatementExecuteUnit input) {
-                    return input.getStatement().equals(statement);
-                }
-            });
+            Optional<StatementExecuteUnit> target = getStatementExecuteUnit(statement, each);
             if (target.isPresent()) {
-                result.addAll(target.get().getRouteUnit().getSqlUnit().getParameterSets());
+                result = getParameterSets(target.get());
                 break;
             }
         }
         return result;
     }
     
+    private Optional<StatementExecuteUnit> getStatementExecuteUnit(final Statement statement, final ShardingExecuteGroup<StatementExecuteUnit> executeGroup) {
+        return Iterators.tryFind(executeGroup.getInputs().iterator(), new Predicate<StatementExecuteUnit>() {
+            
+            @Override
+            public boolean apply(final StatementExecuteUnit input) {
+                return input.getStatement().equals(statement);
+                }
+        });
+    }
+    
+    private List<List<Object>> getParameterSets(final StatementExecuteUnit executeUnit) {
+        List<List<Object>> result;
+        result = Collections2.filter(routeUnits, new Predicate<BatchRouteUnit>() {
+
+            @Override
+            public boolean apply(final BatchRouteUnit input) {
+                return input.getRouteUnit().equals(executeUnit.getRouteUnit());
+            }
+        }).iterator().next().getParameterSets();
+        return result;
+    }
+    
     @Override
     public void clear() throws SQLException {
         super.clear();
diff --git a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java
index f8254ea0233..17e67bc27d3 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/main/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/EncryptPreparedStatement.java
@@ -95,7 +95,7 @@ public final class EncryptPreparedStatement extends AbstractShardingPreparedStat
         try {
             SQLUnit sqlUnit = getSQLUnit(sql);
             preparedStatement = preparedStatementGenerator.createPreparedStatement(sqlUnit.getSql());
-            replaySetParameter(preparedStatement, sqlUnit.getParameterSets().get(0));
+            replaySetParameter(preparedStatement, sqlUnit.getParameters());
             this.resultSet = new EncryptResultSet(this, preparedStatement.executeQuery(), preparedStatementGenerator.connection.getEncryptRule());
             return resultSet;
         } finally {
@@ -113,7 +113,7 @@ public final class EncryptPreparedStatement extends AbstractShardingPreparedStat
         try {
             SQLUnit sqlUnit = getSQLUnit(sql);
             preparedStatement = preparedStatementGenerator.createPreparedStatement(sqlUnit.getSql());
-            replaySetParameter(preparedStatement, sqlUnit.getParameterSets().get(0));
+            replaySetParameter(preparedStatement, sqlUnit.getParameters());
             return preparedStatement.executeUpdate();
         } finally {
             clearParameters();
@@ -125,7 +125,7 @@ public final class EncryptPreparedStatement extends AbstractShardingPreparedStat
         try {
             SQLUnit sqlUnit = getSQLUnit(sql);
             preparedStatement = preparedStatementGenerator.createPreparedStatement(sqlUnit.getSql());
-            replaySetParameter(preparedStatement, sqlUnit.getParameterSets().get(0));
+            replaySetParameter(preparedStatement, sqlUnit.getParameters());
             boolean result = preparedStatement.execute();
             this.resultSet = new EncryptResultSet(this, preparedStatement.getResultSet(), preparedStatementGenerator.connection.getEncryptRule());
             return result;
@@ -161,7 +161,7 @@ public final class EncryptPreparedStatement extends AbstractShardingPreparedStat
     
     private void replayBatchPreparedStatement() throws SQLException {
         for (SQLUnit each : sqlUnits) {
-            replaySetParameter(preparedStatement, each.getParameterSets().get(0));
+            replaySetParameter(preparedStatement, each.getParameters());
             preparedStatement.addBatch();
         }
     }
diff --git a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutorTest.java b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutorTest.java
index 8ed4154b571..3a091e3e353 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutorTest.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/BatchPreparedStatementExecutorTest.java
@@ -127,9 +127,7 @@ public final class BatchPreparedStatementExecutorTest extends AbstractBaseExecut
         executeGroups.add(new ShardingExecuteGroup<>(preparedStatementExecuteUnits));
         Collection<BatchRouteUnit> routeUnits = new LinkedList<>();
         for (PreparedStatement each : preparedStatements) {
-            List<List<Object>> parameterSets = new LinkedList<>();
-            parameterSets.add(Collections.singletonList((Object) 1));
-            RouteUnit routeUnit = new RouteUnit("ds_0", new SQLUnit(SQL, parameterSets));
+            RouteUnit routeUnit = new RouteUnit("ds_0", new SQLUnit(SQL, Collections.singletonList((Object) 1)));
             BatchRouteUnit batchRouteUnit = new BatchRouteUnit(routeUnit);
             batchRouteUnit.mapAddBatchCount(0);
             batchRouteUnit.mapAddBatchCount(1);
diff --git a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutorTest.java b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutorTest.java
index b8defdadc8b..cecfa88b01f 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutorTest.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/PreparedStatementExecutorTest.java
@@ -263,8 +263,7 @@ public final class PreparedStatementExecutorTest extends AbstractBaseExecutorTes
         for (PreparedStatement each : preparedStatements) {
             List<List<Object>> parameterSets = new LinkedList<>();
             String sql = SQLType.DQL.equals(sqlType) ? DQL_SQL : DML_SQL;
-            parameterSets.add(Collections.singletonList((Object) 1));
-            preparedStatementExecuteUnits.add(new StatementExecuteUnit(new RouteUnit("ds_0", new SQLUnit(sql, parameterSets)), each, ConnectionMode.MEMORY_STRICTLY));
+            preparedStatementExecuteUnits.add(new StatementExecuteUnit(new RouteUnit("ds_0", new SQLUnit(sql, Collections.singletonList((Object) 1))), each, ConnectionMode.MEMORY_STRICTLY));
         }
         Field field = PreparedStatementExecutor.class.getSuperclass().getDeclaredField("executeGroups");
         field.setAccessible(true);
diff --git a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/SQLExecuteCallbackFactoryTest.java b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/SQLExecuteCallbackFactoryTest.java
index c9c1710fed7..4871c70a4e8 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/SQLExecuteCallbackFactoryTest.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/SQLExecuteCallbackFactoryTest.java
@@ -36,7 +36,6 @@ import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -61,7 +60,7 @@ public class SQLExecuteCallbackFactoryTest {
         when(connection.getMetaData()).thenReturn(metaData);
         when(metaData.getURL()).thenReturn("jdbc:mysql://localhost:3306/test");
         units = Lists.newArrayList(
-            new StatementExecuteUnit(new RouteUnit("ds", new SQLUnit("SELECT now()", Collections.<List<Object>>emptyList())), preparedStatement, ConnectionMode.CONNECTION_STRICTLY)
+            new StatementExecuteUnit(new RouteUnit("ds", new SQLUnit("SELECT now()", Collections.emptyList())), preparedStatement, ConnectionMode.CONNECTION_STRICTLY)
         );
     }
     
diff --git a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/StatementExecutorTest.java b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/StatementExecutorTest.java
index fd97de4b019..00188208a1c 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/StatementExecutorTest.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/executor/StatementExecutorTest.java
@@ -331,10 +331,8 @@ public final class StatementExecutorTest extends AbstractBaseExecutorTest {
         List<StatementExecuteUnit> statementExecuteUnits = new LinkedList<>();
         executeGroups.add(new ShardingExecuteGroup<>(statementExecuteUnits));
         for (Statement each : statements) {
-            List<List<Object>> parameterSets = new LinkedList<>();
             String sql = SQLType.DQL.equals(sqlType) ? DQL_SQL : DML_SQL;
-            parameterSets.add(Collections.singletonList((Object) 1));
-            statementExecuteUnits.add(new StatementExecuteUnit(new RouteUnit("ds_0", new SQLUnit(sql, parameterSets)), each, ConnectionMode.MEMORY_STRICTLY));
+            statementExecuteUnits.add(new StatementExecuteUnit(new RouteUnit("ds_0", new SQLUnit(sql, Collections.singletonList((Object) 1))), each, ConnectionMode.MEMORY_STRICTLY));
         }
         Field field = StatementExecutor.class.getSuperclass().getDeclaredField("executeGroups");
         field.setAccessible(true);
diff --git a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/ShardingPreparedStatementTest.java b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/ShardingPreparedStatementTest.java
index a413d563845..c3ffeadb672 100644
--- a/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/ShardingPreparedStatementTest.java
+++ b/sharding-jdbc/sharding-jdbc-core/src/test/java/org/apache/shardingsphere/shardingjdbc/jdbc/core/statement/ShardingPreparedStatementTest.java
@@ -196,7 +196,6 @@ public final class ShardingPreparedStatementTest extends AbstractShardingJDBCDat
             preparedStatement.setString(1, "init");
             preparedStatement.setString(2, "batch");
             preparedStatement.addBatch();
-            
             int[] result = preparedStatement.executeBatch();
             assertThat(result.length, is(3));
             assertThat(result[0], is(4));
diff --git a/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHook.java b/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHook.java
index 24877811ac6..33d2d38c0d1 100644
--- a/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHook.java
+++ b/sharding-opentracing/src/main/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHook.java
@@ -27,7 +27,6 @@ import org.apache.shardingsphere.opentracing.ShardingTracer;
 import org.apache.shardingsphere.opentracing.constant.ShardingTags;
 import org.apache.shardingsphere.spi.hook.SQLExecutionHook;
 
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -57,20 +56,12 @@ public final class OpenTracingSQLExecutionHook implements SQLExecutionHook {
                 .withTag(Tags.DB_TYPE.getKey(), "sql")
                 .withTag(Tags.DB_INSTANCE.getKey(), routeUnit.getDataSourceName())
                 .withTag(Tags.DB_STATEMENT.getKey(), routeUnit.getSqlUnit().getSql())
-                .withTag(ShardingTags.DB_BIND_VARIABLES.getKey(), toString(routeUnit.getSqlUnit().getParameterSets())).startManual();
+                .withTag(ShardingTags.DB_BIND_VARIABLES.getKey(), toString(routeUnit.getSqlUnit().getParameters())).startManual();
         
     }
     
-    private String toString(final List<List<Object>> parameterSets) {
-        return parameterSets.isEmpty() ? "" : Joiner.on(", ").join(toStringList(parameterSets));
-    }
-    
-    private List<String> toStringList(final List<List<Object>> parameterSets) {
-        List<String> result = new LinkedList<>();
-        for (List<Object> each : parameterSets) {
-            result.add(String.format("[%s]", Joiner.on(", ").join(each)));
-        }
-        return result;
+    private String toString(final List<Object> parameterSets) {
+        return parameterSets.isEmpty() ? "" : String.format("[%s]", Joiner.on(", ").join(parameterSets));
     }
     
     @Override
diff --git a/sharding-opentracing/src/test/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHookTest.java b/sharding-opentracing/src/test/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHookTest.java
index fd604a5290e..fa2652853bc 100644
--- a/sharding-opentracing/src/test/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHookTest.java
+++ b/sharding-opentracing/src/test/java/org/apache/shardingsphere/opentracing/hook/OpenTracingSQLExecutionHookTest.java
@@ -81,7 +81,7 @@ public final class OpenTracingSQLExecutionHookTest extends BaseOpenTracingHookTe
         DataSourceMetaData dataSourceMetaData = mock(DataSourceMetaData.class);
         when(dataSourceMetaData.getHostName()).thenReturn("localhost");
         when(dataSourceMetaData.getPort()).thenReturn(8888);
-        sqlExecutionHook.start(createRouteUnit("success_ds", "SELECT * FROM success_tbl;", Collections.singletonList(Arrays.<Object>asList("1", 2))), dataSourceMetaData, true, null);
+        sqlExecutionHook.start(createRouteUnit("success_ds", "SELECT * FROM success_tbl;", Arrays.<Object>asList("1", 2)), dataSourceMetaData, true, null);
         sqlExecutionHook.finishSuccess();
         MockSpan actual = getActualSpan();
         assertThat(actual.operationName(), is("/Sharding-Sphere/executeSQL/"));
@@ -103,7 +103,7 @@ public final class OpenTracingSQLExecutionHookTest extends BaseOpenTracingHookTe
         when(dataSourceMetaData.getHostName()).thenReturn("localhost");
         when(dataSourceMetaData.getPort()).thenReturn(8888);
         sqlExecutionHook.start(
-                createRouteUnit("success_ds", "SELECT * FROM success_tbl;", Collections.singletonList(Arrays.<Object>asList("1", 2))), dataSourceMetaData, false, ShardingExecuteDataMap.getDataMap());
+                createRouteUnit("success_ds", "SELECT * FROM success_tbl;", Arrays.<Object>asList("1", 2)), dataSourceMetaData, false, ShardingExecuteDataMap.getDataMap());
         sqlExecutionHook.finishSuccess();
         MockSpan actual = getActualSpan();
         assertThat(actual.operationName(), is("/Sharding-Sphere/executeSQL/"));
@@ -124,7 +124,7 @@ public final class OpenTracingSQLExecutionHookTest extends BaseOpenTracingHookTe
         DataSourceMetaData dataSourceMetaData = mock(DataSourceMetaData.class);
         when(dataSourceMetaData.getHostName()).thenReturn("localhost");
         when(dataSourceMetaData.getPort()).thenReturn(8888);
-        sqlExecutionHook.start(createRouteUnit("failure_ds", "SELECT * FROM failure_tbl;", Collections.<List<Object>>emptyList()), dataSourceMetaData, true, null);
+        sqlExecutionHook.start(createRouteUnit("failure_ds", "SELECT * FROM failure_tbl;", Collections.emptyList()), dataSourceMetaData, true, null);
         sqlExecutionHook.finishFailure(new RuntimeException("SQL execution error"));
         MockSpan actual = getActualSpan();
         assertThat(actual.operationName(), is("/Sharding-Sphere/executeSQL/"));
@@ -141,8 +141,8 @@ public final class OpenTracingSQLExecutionHookTest extends BaseOpenTracingHookTe
         verify(activeSpan, times(0)).deactivate();
     }
     
-    private RouteUnit createRouteUnit(final String dataSourceName, final String sql, final List<List<Object>> parameterSets) {
-        SQLUnit sqlUnit = new SQLUnit(sql, parameterSets);
+    private RouteUnit createRouteUnit(final String dataSourceName, final String sql, final List<Object> parameters) {
+        SQLUnit sqlUnit = new SQLUnit(sql, parameters);
         return new RouteUnit(dataSourceName, sqlUnit);
     }
 }
diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
index eb9b88b5e38..13f93fdafee 100644
--- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
+++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
@@ -37,9 +37,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -68,7 +65,7 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp
         SQLRouteResult result = new SQLRouteResult(sqlStatement);
         for (String each : new MasterSlaveRouter(
                 ((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), GLOBAL_REGISTRY.getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.SQL_SHOW)).route(rewriteSQL)) {
-            result.getRouteUnits().add(new RouteUnit(each, new SQLUnit(rewriteSQL, new ArrayList<>(Collections.singleton(parameters)))));
+            result.getRouteUnits().add(new RouteUnit(each, new SQLUnit(rewriteSQL, parameters)));
         }
         return result;
     }
@@ -81,8 +78,7 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp
     @Override
     public Statement createStatement(final Connection connection, final SQLUnit sqlUnit, final boolean isReturnGeneratedKeys) throws SQLException {
         PreparedStatement result = isReturnGeneratedKeys ? connection.prepareStatement(sqlUnit.getSql(), Statement.RETURN_GENERATED_KEYS) : connection.prepareStatement(sqlUnit.getSql());
-        List<Object> parameters = getRoutedParameters(sqlUnit);
-        for (int i = 0; i < parameters.size(); i++) {
+        for (int i = 0; i < sqlUnit.getParameters().size(); i++) {
             result.setObject(i + 1, parameters.get(i));
         }
         return result;
@@ -92,12 +88,4 @@ public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapp
     public boolean executeSQL(final Statement statement, final String sql, final boolean isReturnGeneratedKeys) throws SQLException {
         return ((PreparedStatement) statement).execute();
     }
-    
-    private List<Object> getRoutedParameters(final SQLUnit sqlUnit) {
-        List<Object> result = new LinkedList<>();
-        for (List<Object> each : sqlUnit.getParameterSets()) {
-            result.addAll(each);
-        }
-        return result;
-    }
 }
diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
index 1d2148e922a..c690941b79a 100644
--- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
+++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
@@ -37,7 +37,6 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Collections;
-import java.util.List;
 
 /**
  * Executor wrapper for statement.
@@ -62,7 +61,7 @@ public final class StatementExecutorWrapper implements JDBCExecutorWrapper {
         SQLRouteResult result = new SQLRouteResult(sqlStatement);
         for (String each : new MasterSlaveRouter(
                 ((MasterSlaveSchema) logicSchema).getMasterSlaveRule(), GLOBAL_REGISTRY.getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.SQL_SHOW)).route(rewriteSQL)) {
-            result.getRouteUnits().add(new RouteUnit(each, new SQLUnit(rewriteSQL, Collections.<List<Object>>emptyList())));
+            result.getRouteUnits().add(new RouteUnit(each, new SQLUnit(rewriteSQL, Collections.emptyList())));
         }
         return result;
     }
diff --git a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/LogicSchemas.java b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/LogicSchemas.java
index f64d6e45e43..ab5fec3c0f9 100644
--- a/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/LogicSchemas.java
+++ b/sharding-proxy/sharding-proxy-backend/src/main/java/org/apache/shardingsphere/shardingproxy/backend/schema/LogicSchemas.java
@@ -33,6 +33,7 @@ import org.apache.shardingsphere.shardingproxy.config.yaml.YamlDataSourceParamet
 import org.apache.shardingsphere.shardingproxy.context.GlobalContext;
 import org.apache.shardingsphere.shardingproxy.util.DataSourceConverter;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -44,6 +45,7 @@ import java.util.concurrent.ConcurrentHashMap;
  * Logic schemas.
  *
  * @author zhangliang
+ * @author panjuan
  */
 @Getter
 public final class LogicSchemas {
@@ -74,25 +76,29 @@ public final class LogicSchemas {
      * @param schemaRules schema rule map
      */
     public void init(final Map<String, Map<String, YamlDataSourceParameter>> schemaDataSources, final Map<String, RuleConfiguration> schemaRules) {
-        init(schemaDataSources, schemaRules, false);
+        init(schemaRules.keySet(), schemaDataSources, schemaRules, false);
     }
     
     /**
      * Initialize proxy context.
      *
+     * @param localSchemaNames local schema names
      * @param schemaDataSources data source map
      * @param schemaRules schema rule map
      * @param isUsingRegistry is using registry or not
      */
-    public void init(final Map<String, Map<String, YamlDataSourceParameter>> schemaDataSources, 
+    public void init(final Collection<String> localSchemaNames, final Map<String, Map<String, YamlDataSourceParameter>> schemaDataSources,
                      final Map<String, RuleConfiguration> schemaRules, final boolean isUsingRegistry) {
         databaseType = JDBCDriverURLRecognizerEngine.getDatabaseType(schemaDataSources.values().iterator().next().values().iterator().next().getUrl());
-        initSchemas(schemaDataSources, schemaRules, isUsingRegistry);
+        initSchemas(localSchemaNames, schemaDataSources, schemaRules, isUsingRegistry);
     }
     
-    private void initSchemas(final Map<String, Map<String, YamlDataSourceParameter>> schemaDataSources, final Map<String, RuleConfiguration> schemaRules, final boolean isUsingRegistry) {
+    private void initSchemas(final Collection<String> localSchemaNames, 
+                             final Map<String, Map<String, YamlDataSourceParameter>> schemaDataSources, final Map<String, RuleConfiguration> schemaRules, final boolean isUsingRegistry) {
         for (Entry<String, RuleConfiguration> entry : schemaRules.entrySet()) {
-            logicSchemas.put(entry.getKey(), createLogicSchema(entry.getKey(), schemaDataSources, entry.getValue(), isUsingRegistry));
+            if (localSchemaNames.isEmpty() || localSchemaNames.contains(entry.getKey())) {
+                logicSchemas.put(entry.getKey(), createLogicSchema(entry.getKey(), schemaDataSources, entry.getValue(), isUsingRegistry));
+            }
         }
     }
     
diff --git a/sharding-proxy/sharding-proxy-bootstrap/src/main/java/org/apache/shardingsphere/shardingproxy/Bootstrap.java b/sharding-proxy/sharding-proxy-bootstrap/src/main/java/org/apache/shardingsphere/shardingproxy/Bootstrap.java
index 726be7d625a..4dfdcdfbebc 100644
--- a/sharding-proxy/sharding-proxy-bootstrap/src/main/java/org/apache/shardingsphere/shardingproxy/Bootstrap.java
+++ b/sharding-proxy/sharding-proxy-bootstrap/src/main/java/org/apache/shardingsphere/shardingproxy/Bootstrap.java
@@ -100,7 +100,7 @@ public final class Bootstrap {
                 new OrchestrationConfigurationYamlSwapper().swap(serverConfig.getOrchestration()), shardingSchemaNames)) {
             initShardingOrchestrationFacade(serverConfig, ruleConfigs, shardingOrchestrationFacade);
             GlobalContext.getInstance().init(shardingOrchestrationFacade.getConfigService().loadAuthentication(), shardingOrchestrationFacade.getConfigService().loadProperties());
-            LogicSchemas.getInstance().init(getSchemaDataSourceParameterMap(shardingOrchestrationFacade), getSchemaRules(shardingOrchestrationFacade), true);
+            LogicSchemas.getInstance().init(shardingSchemaNames, getSchemaDataSourceParameterMap(shardingOrchestrationFacade), getSchemaRules(shardingOrchestrationFacade), true);
             initOpenTracing();
             ShardingProxy.getInstance().start(port);
         }