You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2023/04/28 00:17:55 UTC

[shardingsphere] branch master updated: Add public getColumns, getIndexes, getConstraints to avoid call of inner map field in ShardingSphereTable (#25357)

This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 0ec2b770f59 Add public getColumns, getIndexes, getConstraints to avoid call of inner map field in ShardingSphereTable (#25357)
0ec2b770f59 is described below

commit 0ec2b770f593dd01ec607c0dad95825733f20d91
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Fri Apr 28 08:17:38 2023 +0800

    Add public getColumns, getIndexes, getConstraints to avoid call of inner map field in ShardingSphereTable (#25357)
---
 .../dal/show/ShowCreateTableMergedResult.java      |  18 ++--
 .../dql/groupby/GroupByMemoryMergedResult.java     |   6 +-
 .../sharding/merge/dql/orderby/OrderByValue.java   |  11 +--
 .../sharding/rewrite/token/pojo/IndexToken.java    |   2 +-
 .../ddl/ShardingDDLStatementValidator.java         |   2 +-
 .../impl/ShardingDropIndexStatementValidator.java  |   4 +-
 .../dql/groupby/GroupByMemoryMergedResultTest.java |   2 +-
 .../ShardingTableBroadcastRoutingEngineTest.java   |   4 +-
 .../ShardingAlterIndexStatementValidatorTest.java  |  19 +---
 .../ShardingDropIndexStatementValidatorTest.java   |  29 ++----
 .../keygen/engine/GeneratedKeyContextEngine.java   |   7 +-
 .../ShardingSphereTableDataCollectorUtils.java     |   2 +-
 .../schema/model/ShardingSphereSchema.java         |   4 +-
 .../database/schema/model/ShardingSphereTable.java | 102 +++++++++++++++++++--
 .../database/schema/util/IndexMetaDataUtils.java   |   2 +-
 .../yaml/schema/swapper/YamlTableSwapper.java      |  12 +--
 .../yaml/schema/swapper/YamlSchemaSwapperTest.java |   7 +-
 .../index/AlterIndexStatementSchemaRefresher.java  |  10 +-
 .../index/CreateIndexStatementSchemaRefresher.java |   6 +-
 .../index/DropIndexStatementSchemaRefresher.java   |   6 +-
 .../ShardingSphereDataScheduleCollector.java       |   2 +-
 .../execute/ShardingSphereDataCollectorTest.java   |  10 +-
 .../data/ShardingSphereDataPersistService.java     |   2 +-
 .../ShardingSphereTableRowDataPersistService.java  |   2 +-
 .../DatabaseMetaDataPersistServiceTest.java        |   6 +-
 .../schema/TableMetaDataPersistServiceTest.java    |   5 +-
 .../optimizer/util/SQLFederationDataTypeUtils.java |   2 +-
 .../mode/manager/ContextManager.java               |   6 +-
 .../mode/manager/ContextManagerTest.java           |   4 +-
 .../ral/queryable/ShowTableMetaDataExecutor.java   |   2 +-
 .../header/query/MySQLQueryHeaderBuilder.java      |   2 +-
 .../prepare/MySQLComStmtPrepareExecutor.java       |   2 +-
 ...ySQLComStmtPrepareParameterMarkerExtractor.java |  15 +--
 .../prepare/MySQLComStmtPrepareExecutorTest.java   |   6 +-
 ...ComStmtPrepareParameterMarkerExtractorTest.java |  14 +--
 .../describe/PostgreSQLComDescribeExecutor.java    |  24 ++---
 .../cases/alterresource/AddResourceTestCase.java   |   4 +-
 .../cases/alterresource/CloseResourceTestCase.java |   4 +-
 .../src/test/resources/env/common/command.xml      |   4 +-
 .../actual/init-sql/opengauss/01-actual-init.sql   |   8 +-
 .../data/actual/init-sql/mysql/01-actual-init.sql  |   8 +-
 .../data/actual/init-sql/mysql/01-actual-init.sql  |   6 +-
 .../rewrite/engine/scenario/MixSQLRewriterIT.java  |  16 ++--
 .../engine/scenario/ShardingSQLRewriterIT.java     |  15 +--
 44 files changed, 226 insertions(+), 198 deletions(-)

diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dal/show/ShowCreateTableMergedResult.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dal/show/ShowCreateTableMergedResult.java
index 4e554fab9f7..45a503e8481 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dal/show/ShowCreateTableMergedResult.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dal/show/ShowCreateTableMergedResult.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.result.impl.memory.MemoryQueryResultRow;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereConstraint;
+import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils;
@@ -30,7 +31,6 @@ import org.apache.shardingsphere.sharding.rule.TableRule;
 
 import java.sql.SQLException;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Optional;
 
 /**
@@ -47,19 +47,19 @@ public final class ShowCreateTableMergedResult extends LogicTablesMergedResult {
     protected void setCellValue(final MemoryQueryResultRow memoryResultSetRow, final String logicTableName, final String actualTableName,
                                 final ShardingSphereTable table, final ShardingRule shardingRule) {
         memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replaceFirst(actualTableName, logicTableName));
-        for (String each : table.getIndexes().keySet()) {
-            String actualIndexName = IndexMetaDataUtils.getActualIndexName(each, actualTableName);
-            memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(actualIndexName, each));
+        for (ShardingSphereIndex each : table.getIndexes()) {
+            String actualIndexName = IndexMetaDataUtils.getActualIndexName(each.getName(), actualTableName);
+            memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(actualIndexName, each.getName()));
         }
-        for (Entry<String, ShardingSphereConstraint> entry : table.getConstraints().entrySet()) {
-            String actualIndexName = IndexMetaDataUtils.getActualIndexName(entry.getKey(), actualTableName);
-            memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(actualIndexName, entry.getKey()));
-            Optional<TableRule> tableRule = shardingRule.findTableRule(entry.getValue().getReferencedTableName());
+        for (ShardingSphereConstraint each : table.getConstraints()) {
+            String actualIndexName = IndexMetaDataUtils.getActualIndexName(each.getName(), actualTableName);
+            memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(actualIndexName, each.getName()));
+            Optional<TableRule> tableRule = shardingRule.findTableRule(each.getReferencedTableName());
             if (!tableRule.isPresent()) {
                 continue;
             }
             for (DataNode dataNode : tableRule.get().getActualDataNodes()) {
-                memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(dataNode.getTableName(), entry.getValue().getReferencedTableName()));
+                memoryResultSetRow.setCell(2, memoryResultSetRow.getCell(2).toString().replace(dataNode.getTableName(), each.getReferencedTableName()));
             }
         }
     }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResult.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResult.java
index 9836c97e236..cc501691388 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResult.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResult.java
@@ -26,7 +26,6 @@ import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementConte
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.result.impl.memory.MemoryMergedResult;
 import org.apache.shardingsphere.infra.merge.result.impl.memory.MemoryQueryResultRow;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
@@ -133,10 +132,9 @@ public final class GroupByMemoryMergedResult extends MemoryMergedResult<Sharding
         for (SimpleTableSegment each : selectStatementContext.getAllTables()) {
             String tableName = each.getTableName().getIdentifier().getValue();
             ShardingSphereTable table = schema.getTable(tableName);
-            Map<String, ShardingSphereColumn> columns = table.getColumns();
             String columnName = queryResult.getMetaData().getColumnName(columnIndex);
-            if (columns.containsKey(columnName)) {
-                return columns.get(columnName).isCaseSensitive();
+            if (table.containsColumn(columnName)) {
+                return table.getColumn(columnName).isCaseSensitive();
             }
         }
         return false;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValue.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValue.java
index 550943f7966..7c1b5b1eed9 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValue.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValue.java
@@ -21,7 +21,6 @@ import lombok.Getter;
 import org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
@@ -36,7 +35,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Order by value.
@@ -74,18 +72,17 @@ public final class OrderByValue implements Comparable<OrderByValue> {
         for (SimpleTableSegment each : selectStatementContext.getAllTables()) {
             String tableName = each.getTableName().getIdentifier().getValue();
             ShardingSphereTable table = schema.getTable(tableName);
-            Map<String, ShardingSphereColumn> columns = table.getColumns();
             OrderByItemSegment orderByItemSegment = eachOrderByItem.getSegment();
             if (orderByItemSegment instanceof ColumnOrderByItemSegment) {
                 String columnName = ((ColumnOrderByItemSegment) orderByItemSegment).getColumn().getIdentifier().getValue();
-                if (columns.containsKey(columnName)) {
-                    return columns.get(columnName).isCaseSensitive();
+                if (table.containsColumn(columnName)) {
+                    return table.getColumn(columnName).isCaseSensitive();
                 }
             } else if (orderByItemSegment instanceof IndexOrderByItemSegment) {
                 int columnIndex = ((IndexOrderByItemSegment) orderByItemSegment).getColumnIndex();
                 String columnName = queryResult.getMetaData().getColumnName(columnIndex);
-                if (columns.containsKey(columnName)) {
-                    return columns.get(columnName).isCaseSensitive();
+                if (table.containsColumn(columnName)) {
+                    return table.getColumn(columnName).isCaseSensitive();
                 }
             } else {
                 return false;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexToken.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexToken.java
index e18880695a9..64088f713fc 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexToken.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/pojo/IndexToken.java
@@ -77,7 +77,7 @@ public final class IndexToken extends SQLToken implements Substitutable, RouteUn
     
     private Optional<String> findLogicTableNameFromMetaData(final String logicIndexName) {
         for (String each : schema.getAllTableNames()) {
-            if (schema.getTable(each).getIndexes().containsKey(logicIndexName)) {
+            if (schema.getTable(each).containsIndex(logicIndexName)) {
                 return Optional.of(each);
             }
         }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDDLStatementValidator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDDLStatementValidator.java
index 520330b7ba8..69c7541611f 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDDLStatementValidator.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDDLStatementValidator.java
@@ -107,6 +107,6 @@ public abstract class ShardingDDLStatementValidator<T extends DDLStatement> impl
      * @return whether schema contains index or not
      */
     protected boolean isSchemaContainsIndex(final ShardingSphereSchema schema, final IndexSegment index) {
-        return schema.getAllTableNames().stream().anyMatch(each -> schema.getTable(each).getIndexes().containsKey(index.getIndexName().getIdentifier().getValue()));
+        return schema.getAllTableNames().stream().anyMatch(each -> schema.getTable(each).containsIndex(index.getIndexName().getIdentifier().getValue()));
     }
 }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingDropIndexStatementValidator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingDropIndexStatementValidator.java
index 976d405afd5..213f425b4e9 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingDropIndexStatementValidator.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingDropIndexStatementValidator.java
@@ -24,8 +24,8 @@ import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException;
 import org.apache.shardingsphere.sharding.exception.connection.ShardingDDLRouteException;
+import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException;
 import org.apache.shardingsphere.sharding.route.engine.validator.ddl.ShardingDDLStatementValidator;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
@@ -71,7 +71,7 @@ public final class ShardingDropIndexStatementValidator extends ShardingDDLStatem
                 ShardingSphereSchema schema = each.getOwner().map(optional -> optional.getIdentifier().getValue())
                         .map(database::getSchema).orElseGet(() -> database.getSchema(defaultSchemaName));
                 logicTableName =
-                        schema.getAllTableNames().stream().filter(tableName -> schema.getTable(tableName).getIndexes().containsKey(each.getIndexName().getIdentifier().getValue())).findFirst();
+                        schema.getAllTableNames().stream().filter(tableName -> schema.getTable(tableName).containsIndex(each.getIndexName().getIdentifier().getValue())).findFirst();
                 logicTableName.ifPresent(optional -> validateDropIndexRouteUnit(shardingRule, routeContext, indexSegments, optional));
             }
         }
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResultTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResultTest.java
index 22ed9673b3d..733ac30e92a 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResultTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/groupby/GroupByMemoryMergedResultTest.java
@@ -205,7 +205,7 @@ class GroupByMemoryMergedResultTest {
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         ShardingSphereTable table = mock(ShardingSphereTable.class);
         when(schema.getTable("t_order")).thenReturn(table);
-        when(table.getColumns()).thenReturn(Collections.emptyMap());
+        when(table.getColumns()).thenReturn(Collections.emptyList());
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
         when(database.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
         when(database.getSchemas()).thenReturn(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, schema));
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
index 088dcdc10a2..8de6bcf31ca 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRoutingEngineTest.java
@@ -94,7 +94,7 @@ class ShardingTableBroadcastRoutingEngineTest {
     void assertRouteForDropIndexStatement() {
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class, RETURNS_DEEP_STUBS);
         when(schema.getAllTableNames()).thenReturn(Collections.singleton("t_order"));
-        when(schema.getTable(anyString()).getIndexes().containsKey(anyString())).thenReturn(true);
+        when(schema.getTable(anyString()).containsIndex(anyString())).thenReturn(true);
         IndexSegment segment = mock(IndexSegment.class, RETURNS_DEEP_STUBS);
         when(segment.getIndexName().getIdentifier().getValue()).thenReturn("t_order");
         when(segment.getOwner()).thenReturn(Optional.empty());
@@ -119,7 +119,7 @@ class ShardingTableBroadcastRoutingEngineTest {
     @Test
     void assertRouteForDropIndexStatementDoNotFoundTables() {
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class, RETURNS_DEEP_STUBS);
-        when(schema.getTable(anyString()).getIndexes().containsKey(anyString())).thenReturn(false);
+        when(schema.getTable(anyString()).containsIndex(anyString())).thenReturn(false);
         IndexSegment segment = mock(IndexSegment.class, RETURNS_DEEP_STUBS);
         when(segment.getIndexName().getIdentifier().getValue()).thenReturn("t_order");
         SQLStatementContext<DropIndexStatement> sqlStatementContext = mock(DropIndexStatementContext.class, RETURNS_DEEP_STUBS);
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingAlterIndexStatementValidatorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingAlterIndexStatementValidatorTest.java
index 7f6ccf29e7f..6a2283388b4 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingAlterIndexStatementValidatorTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingAlterIndexStatementValidatorTest.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.sharding.route.engine.validator.ddl;
 import org.apache.shardingsphere.infra.binder.statement.ddl.AlterIndexStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.sharding.exception.metadata.DuplicatedIndexException;
 import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException;
@@ -37,8 +36,6 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -59,12 +56,10 @@ class ShardingAlterIndexStatementValidatorTest {
         sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.setRenameIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(true);
-        when(indexes.containsKey("t_order_index_new")).thenReturn(false);
+        when(table.containsIndex("t_order_index")).thenReturn(true);
+        when(table.containsIndex("t_order_index_new")).thenReturn(false);
         new ShardingAlterIndexStatementValidator().preValidate(shardingRule, new AlterIndexStatementContext(sqlStatement), Collections.emptyList(), database, mock(ConfigurationProperties.class));
     }
     
@@ -74,11 +69,9 @@ class ShardingAlterIndexStatementValidatorTest {
         sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.setRenameIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(false);
+        when(table.containsIndex("t_order_index")).thenReturn(false);
         assertThrows(IndexNotExistedException.class,
                 () -> new ShardingAlterIndexStatementValidator().preValidate(
                         shardingRule, new AlterIndexStatementContext(sqlStatement), Collections.emptyList(), database, mock(ConfigurationProperties.class)));
@@ -90,12 +83,10 @@ class ShardingAlterIndexStatementValidatorTest {
         sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.setRenameIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(true);
-        when(indexes.containsKey("t_order_index_new")).thenReturn(true);
+        when(table.containsIndex("t_order_index")).thenReturn(true);
+        when(table.containsIndex("t_order_index_new")).thenReturn(true);
         assertThrows(DuplicatedIndexException.class,
                 () -> new ShardingAlterIndexStatementValidator().preValidate(
                         shardingRule, new AlterIndexStatementContext(sqlStatement), Collections.emptyList(), database, mock(ConfigurationProperties.class)));
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDropIndexStatementValidatorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDropIndexStatementValidatorTest.java
index d93a3d0b6bd..cce168bde59 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDropIndexStatementValidatorTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingDropIndexStatementValidatorTest.java
@@ -21,7 +21,6 @@ import org.apache.shardingsphere.infra.binder.statement.ddl.DropIndexStatementCo
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
@@ -44,9 +43,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -70,12 +67,10 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(true);
-        when(indexes.containsKey("t_order_index_new")).thenReturn(true);
+        when(table.containsIndex("t_order_index")).thenReturn(true);
+        when(table.containsIndex("t_order_index_new")).thenReturn(true);
         new ShardingDropIndexStatementValidator().preValidate(shardingRule, new DropIndexStatementContext(sqlStatement), Collections.emptyList(), database, mock(ConfigurationProperties.class));
     }
     
@@ -85,11 +80,9 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(false);
+        when(table.containsIndex("t_order_index")).thenReturn(false);
         assertThrows(IndexNotExistedException.class,
                 () -> new ShardingDropIndexStatementValidator().preValidate(
                         shardingRule, new DropIndexStatementContext(sqlStatement), Collections.emptyList(), database, mock(ConfigurationProperties.class)));
@@ -101,11 +94,9 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(true);
+        when(table.containsIndex("t_order_index")).thenReturn(true);
         when(shardingRule.isShardingTable("t_order")).thenReturn(true);
         when(shardingRule.getTableRule("t_order")).thenReturn(new TableRule(Arrays.asList("ds_0", "ds_1"), "t_order"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
@@ -122,11 +113,9 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_order"));
         when(database.getSchema("public").getTable("t_order")).thenReturn(table);
-        when(indexes.containsKey("t_order_index")).thenReturn(true);
+        when(table.containsIndex("t_order_index")).thenReturn(true);
         when(shardingRule.isShardingTable("t_order")).thenReturn(true);
         when(shardingRule.getTableRule("t_order")).thenReturn(new TableRule(Arrays.asList("ds_0", "ds_1"), "t_order"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
@@ -142,11 +131,9 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_config_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_config_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_config"));
         when(database.getSchema("public").getTable("t_config")).thenReturn(table);
-        when(indexes.containsKey("t_config_index")).thenReturn(true);
+        when(table.containsIndex("t_config_index")).thenReturn(true);
         when(shardingRule.isBroadcastTable("t_config")).thenReturn(true);
         when(shardingRule.getTableRule("t_config")).thenReturn(new TableRule(Arrays.asList("ds_0", "ds_1"), "t_config"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
@@ -163,11 +150,9 @@ class ShardingDropIndexStatementValidatorTest {
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_config_index"))));
         sqlStatement.getIndexes().add(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_config_index_new"))));
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        Map<String, ShardingSphereIndex> indexes = mock(HashMap.class);
-        when(table.getIndexes()).thenReturn(indexes);
         when(database.getSchema("public").getAllTableNames()).thenReturn(Collections.singletonList("t_config"));
         when(database.getSchema("public").getTable("t_config")).thenReturn(table);
-        when(indexes.containsKey("t_config_index")).thenReturn(true);
+        when(table.containsIndex("t_config_index")).thenReturn(true);
         when(shardingRule.isBroadcastTable("t_config")).thenReturn(true);
         when(shardingRule.getTableRule("t_config")).thenReturn(new TableRule(Arrays.asList("ds_0", "ds_1"), "t_config"));
         Collection<RouteUnit> routeUnits = new LinkedList<>();
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/keygen/engine/GeneratedKeyContextEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
index e76465c13ab..dcef13c9cdf 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/keygen/engine/GeneratedKeyContextEngine.java
@@ -31,7 +31,6 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.InsertStatem
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Optional;
 
 /**
@@ -63,9 +62,9 @@ public final class GeneratedKeyContextEngine {
         if (!schema.containsTable(tableName)) {
             return Optional.empty();
         }
-        for (Entry<String, ShardingSphereColumn> entry : schema.getTable(tableName).getColumns().entrySet()) {
-            if (entry.getValue().isGenerated()) {
-                return Optional.of(entry.getKey());
+        for (ShardingSphereColumn each : schema.getTable(tableName).getColumns()) {
+            if (each.isGenerated()) {
+                return Optional.of(each.getName());
             }
         }
         return Optional.empty();
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtils.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtils.java
index 409e38a5c36..fe8d9d476ac 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtils.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtils.java
@@ -82,7 +82,7 @@ public final class ShardingSphereTableDataCollectorUtils {
     
     private static List<Object> getRow(final ShardingSphereTable table, final ResultSet resultSet, final Collection<String> selectedColumnNames) throws SQLException {
         List<Object> result = new LinkedList<>();
-        for (ShardingSphereColumn each : table.getColumns().values()) {
+        for (ShardingSphereColumn each : table.getColumns()) {
             if (selectedColumnNames.contains(each.getName())) {
                 result.add(convertIfNecessary(resultSet.getObject(each.getName()), each.getDataType()));
             } else {
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
index d374ae108e2..69e4c416e4d 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
@@ -154,7 +154,7 @@ public final class ShardingSphereSchema {
      * @return contains column name or not
      */
     public boolean containsColumn(final String tableName, final String columnName) {
-        return containsTable(tableName) && getTable(tableName).getColumns().containsKey(columnName.toLowerCase());
+        return containsTable(tableName) && getTable(tableName).containsColumn(columnName);
     }
     
     /**
@@ -165,7 +165,7 @@ public final class ShardingSphereSchema {
      * @return whether contains index name or not
      */
     public boolean containsIndex(final String tableName, final String indexName) {
-        return containsTable(tableName) && getTable(tableName).getIndexes().containsKey(indexName.toLowerCase());
+        return containsTable(tableName) && getTable(tableName).containsIndex(indexName);
     }
     
     /**
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
index 23ea4235f5a..28dfd15c748 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.infra.metadata.database.schema.model;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import lombok.ToString;
 
 import java.util.ArrayList;
@@ -32,7 +31,6 @@ import java.util.Map;
 /**
  * ShardingSphere table.
  */
-@RequiredArgsConstructor
 @Getter
 @EqualsAndHashCode
 @ToString
@@ -59,12 +57,12 @@ public final class ShardingSphereTable {
     public ShardingSphereTable(final String name, final Collection<ShardingSphereColumn> columns,
                                final Collection<ShardingSphereIndex> indexes, final Collection<ShardingSphereConstraint> constraints) {
         this.name = name;
-        this.columns = getColumns(columns);
-        this.indexes = getIndexes(indexes);
-        this.constraints = getConstraints(constraints);
+        this.columns = createColumns(columns);
+        this.indexes = createIndexes(indexes);
+        this.constraints = createConstraints(constraints);
     }
     
-    private Map<String, ShardingSphereColumn> getColumns(final Collection<ShardingSphereColumn> columns) {
+    private Map<String, ShardingSphereColumn> createColumns(final Collection<ShardingSphereColumn> columns) {
         Map<String, ShardingSphereColumn> result = new LinkedHashMap<>(columns.size(), 1);
         for (ShardingSphereColumn each : columns) {
             String lowerColumnName = each.getName().toLowerCase();
@@ -80,7 +78,7 @@ public final class ShardingSphereTable {
         return result;
     }
     
-    private Map<String, ShardingSphereIndex> getIndexes(final Collection<ShardingSphereIndex> indexes) {
+    private Map<String, ShardingSphereIndex> createIndexes(final Collection<ShardingSphereIndex> indexes) {
         Map<String, ShardingSphereIndex> result = new LinkedHashMap<>(indexes.size(), 1);
         for (ShardingSphereIndex each : indexes) {
             result.put(each.getName().toLowerCase(), each);
@@ -88,7 +86,7 @@ public final class ShardingSphereTable {
         return result;
     }
     
-    private Map<String, ShardingSphereConstraint> getConstraints(final Collection<ShardingSphereConstraint> constraints) {
+    private Map<String, ShardingSphereConstraint> createConstraints(final Collection<ShardingSphereConstraint> constraints) {
         Map<String, ShardingSphereConstraint> result = new LinkedHashMap<>(constraints.size(), 1);
         for (ShardingSphereConstraint each : constraints) {
             result.put(each.getName().toLowerCase(), each);
@@ -97,12 +95,96 @@ public final class ShardingSphereTable {
     }
     
     /**
-     * Get table meta data via column name.
+     * Put column meta data.
+     * 
+     * @param column column meta data
+     */
+    public void putColumn(final ShardingSphereColumn column) {
+        columns.put(column.getName().toLowerCase(), column);
+    }
+    
+    /**
+     * Get column meta data via column name.
      *
      * @param columnName column name
-     * @return table meta data
+     * @return column meta data
      */
     public ShardingSphereColumn getColumn(final String columnName) {
         return columns.get(columnName.toLowerCase());
     }
+    
+    /**
+     * Get column meta data collection.
+     *
+     * @return column meta data collection
+     */
+    public Collection<ShardingSphereColumn> getColumns() {
+        return columns.values();
+    }
+    
+    /**
+     * Judge whether contains column or not.
+     *
+     * @param columnName column name
+     * @return whether contains column or not
+     */
+    public boolean containsColumn(final String columnName) {
+        return null != columnName && columns.containsKey(columnName.toLowerCase());
+    }
+    
+    /**
+     * Put index meta data.
+     * 
+     * @param index index meta data
+     */
+    public void putIndex(final ShardingSphereIndex index) {
+        indexes.put(index.getName().toLowerCase(), index);
+    }
+    
+    /**
+     * Remove index meta data via index name.
+     * 
+     * @param indexName index name
+     */
+    public void removeIndex(final String indexName) {
+        indexes.remove(indexName.toLowerCase());
+    }
+    
+    /**
+     * Get index meta data via index name.
+     *
+     * @param indexName index name
+     * @return index meta data
+     */
+    public ShardingSphereIndex getIndex(final String indexName) {
+        return indexes.get(indexName.toLowerCase());
+    }
+    
+    /**
+     * Get index meta data collection.
+     *
+     * @return index meta data collection
+     */
+    public Collection<ShardingSphereIndex> getIndexes() {
+        return indexes.values();
+    }
+    
+    /**
+     * Judge whether contains index or not.
+     *
+     * @param indexName index name
+     * @return whether contains index or not
+     */
+    public boolean containsIndex(final String indexName) {
+        return null != indexName && indexes.containsKey(indexName.toLowerCase());
+    }
+    
+    /**
+     * Get constraint meta data collection.
+     *
+     * @return constraint meta data collection
+     */
+    public Collection<ShardingSphereConstraint> getConstraints() {
+        return constraints.values();
+    }
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
index bd26197ceab..d91ba1177f0 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
@@ -100,7 +100,7 @@ public final class IndexMetaDataUtils {
     
     private static Optional<String> findLogicTableNameFromMetaData(final ShardingSphereSchema schema, final String logicIndexName) {
         for (String each : schema.getAllTableNames()) {
-            if (schema.getTable(each).getIndexes().containsKey(logicIndexName)) {
+            if (schema.getTable(each).containsIndex(logicIndexName)) {
                 return Optional.of(each);
             }
         }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlTableSwapper.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlTableSwapper.java
index 530bdcd316b..29f975b1696 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlTableSwapper.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlTableSwapper.java
@@ -77,8 +77,8 @@ public final class YamlTableSwapper implements YamlConfigurationSwapper<YamlShar
         return new ShardingSphereColumn(column.getName(), column.getDataType(), column.isPrimaryKey(), column.isGenerated(), column.isCaseSensitive(), column.isVisible(), column.isUnsigned());
     }
     
-    private Map<String, YamlShardingSphereConstraint> swapYamlConstraints(final Map<String, ShardingSphereConstraint> constrains) {
-        return constrains.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> swapYamlConstraint(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+    private Map<String, YamlShardingSphereConstraint> swapYamlConstraints(final Collection<ShardingSphereConstraint> constrains) {
+        return constrains.stream().collect(Collectors.toMap(key -> key.getName().toLowerCase(), this::swapYamlConstraint, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
     }
     
     private YamlShardingSphereConstraint swapYamlConstraint(final ShardingSphereConstraint constraint) {
@@ -88,8 +88,8 @@ public final class YamlTableSwapper implements YamlConfigurationSwapper<YamlShar
         return result;
     }
     
-    private Map<String, YamlShardingSphereIndex> swapYamlIndexes(final Map<String, ShardingSphereIndex> indexes) {
-        return indexes.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> swapYamlIndex(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+    private Map<String, YamlShardingSphereIndex> swapYamlIndexes(final Collection<ShardingSphereIndex> indexes) {
+        return indexes.stream().collect(Collectors.toMap(key -> key.getName().toLowerCase(), this::swapYamlIndex, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
     }
     
     private YamlShardingSphereIndex swapYamlIndex(final ShardingSphereIndex index) {
@@ -98,8 +98,8 @@ public final class YamlTableSwapper implements YamlConfigurationSwapper<YamlShar
         return result;
     }
     
-    private Map<String, YamlShardingSphereColumn> swapYamlColumns(final Map<String, ShardingSphereColumn> columns) {
-        return columns.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> swapYamlColumn(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+    private Map<String, YamlShardingSphereColumn> swapYamlColumns(final Collection<ShardingSphereColumn> columns) {
+        return columns.stream().collect(Collectors.toMap(key -> key.getName().toLowerCase(), this::swapYamlColumn, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
     }
     
     private YamlShardingSphereColumn swapYamlColumn(final ShardingSphereColumn column) {
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlSchemaSwapperTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlSchemaSwapperTest.java
index ab301d05137..31d078a401a 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlSchemaSwapperTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/yaml/schema/swapper/YamlSchemaSwapperTest.java
@@ -83,7 +83,8 @@ class YamlSchemaSwapperTest {
         assertThat(actualSchema.getAllTableNames(), is(Collections.singleton("t_order")));
         ShardingSphereTable actualTable = actualSchema.getTable("t_order");
         assertColumn(actualTable);
-        assertThat(actualTable.getIndexes().keySet(), is(Collections.singleton("primary")));
+        assertThat(actualTable.getIndexes().size(), is(1));
+        assertThat(actualTable.getIndexes().iterator().next().getName(), is("PRIMARY"));
         assertThat(actualSchema.getAllColumnNames("t_order").size(), is(2));
         assertTrue(actualSchema.containsColumn("t_order", "id"));
         assertTrue(actualSchema.containsColumn("t_order", "name"));
@@ -91,8 +92,8 @@ class YamlSchemaSwapperTest {
     
     private void assertColumn(final ShardingSphereTable table) {
         assertThat(table.getColumns().size(), is(2));
-        assertThat(table.getColumns().get("id"), is(new ShardingSphereColumn("id", 0, true, false, false, true, false)));
-        assertThat(table.getColumns().get("name"), is(new ShardingSphereColumn("name", 10, false, true, true, false, true)));
+        assertThat(table.getColumn("id"), is(new ShardingSphereColumn("id", 0, true, false, false, true, false)));
+        assertThat(table.getColumn("name"), is(new ShardingSphereColumn("name", 10, false, true, true, false, true)));
     }
     
     @Test
diff --git a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/AlterIndexStatementSchemaRefresher.java b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/AlterIndexStatementSchemaRefresher.java
index 6e1d438678d..df662d43ab4 100644
--- a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/AlterIndexStatementSchemaRefresher.java
+++ b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/AlterIndexStatementSchemaRefresher.java
@@ -31,7 +31,6 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterIndexS
 import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterIndexStatementHandler;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
 import java.util.Optional;
 
 /**
@@ -53,9 +52,9 @@ public final class AlterIndexStatementSchemaRefresher implements MetaDataRefresh
             ShardingSphereTable table = database.getSchema(actualSchemaName).getTable(logicTableName.get());
             Preconditions.checkNotNull(table, "Can not get the table '%s' meta data!", logicTableName.get());
             ShardingSphereTable newTable = newShardingSphereTable(table);
-            newTable.getIndexes().remove(indexName);
+            newTable.removeIndex(indexName);
             String renameIndexName = renameIndex.get().getIndexName().getIdentifier().getValue();
-            newTable.getIndexes().put(renameIndexName, new ShardingSphereIndex(renameIndexName));
+            newTable.putIndex(new ShardingSphereIndex(renameIndexName));
             AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), actualSchemaName);
             alterSchemaMetaDataPOJO.getAlteredTables().add(newTable);
             modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
@@ -63,12 +62,11 @@ public final class AlterIndexStatementSchemaRefresher implements MetaDataRefresh
     }
     
     private Optional<String> findLogicTableName(final ShardingSphereSchema schema, final String indexName) {
-        return schema.getAllTableNames().stream().filter(each -> schema.getTable(each).getIndexes().containsKey(indexName)).findFirst();
+        return schema.getAllTableNames().stream().filter(each -> schema.getTable(each).containsIndex(indexName)).findFirst();
     }
     
     private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) {
-        ShardingSphereTable result = new ShardingSphereTable(table.getName(), new LinkedHashMap<>(table.getColumns()),
-                new LinkedHashMap<>(table.getIndexes()), new LinkedHashMap<>(table.getConstraints()));
+        ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getColumns(), table.getIndexes(), table.getConstraints());
         result.getColumnNames().addAll(table.getColumnNames());
         result.getVisibleColumns().addAll(table.getVisibleColumns());
         result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns());
diff --git a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/CreateIndexStatementSchemaRefresher.java b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/CreateIndexStatementSchemaRefresher.java
index 8cc59ffee52..04fd4f3dffa 100644
--- a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/CreateIndexStatementSchemaRefresher.java
+++ b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/CreateIndexStatementSchemaRefresher.java
@@ -29,7 +29,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDa
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateIndexStatement;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
 
 /**
  * Schema refresher for create index statement.
@@ -46,15 +45,14 @@ public final class CreateIndexStatementSchemaRefresher implements MetaDataRefres
         }
         String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
         ShardingSphereTable table = newShardingSphereTable(database.getSchema(schemaName).getTable(tableName));
-        table.getIndexes().put(indexName, new ShardingSphereIndex(indexName));
+        table.putIndex(new ShardingSphereIndex(indexName));
         AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName);
         alterSchemaMetaDataPOJO.getAlteredTables().add(table);
         modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
     }
     
     private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) {
-        ShardingSphereTable result = new ShardingSphereTable(table.getName(), new LinkedHashMap<>(table.getColumns()),
-                new LinkedHashMap<>(table.getIndexes()), new LinkedHashMap<>(table.getConstraints()));
+        ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getColumns(), table.getIndexes(), table.getConstraints());
         result.getColumnNames().addAll(table.getColumnNames());
         result.getVisibleColumns().addAll(table.getVisibleColumns());
         result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns());
diff --git a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/DropIndexStatementSchemaRefresher.java b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/DropIndexStatementSchemaRefresher.java
index 3d79bf43539..16da2baf801 100644
--- a/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/DropIndexStatementSchemaRefresher.java
+++ b/infra/context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/index/DropIndexStatementSchemaRefresher.java
@@ -32,7 +32,6 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.DropIndexSta
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.Optional;
 
 /**
@@ -51,7 +50,7 @@ public final class DropIndexStatementSchemaRefresher implements MetaDataRefreshe
             }
             AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), actualSchemaName);
             ShardingSphereTable table = newShardingSphereTable(database.getSchema(actualSchemaName).getTable(logicTableName.get()));
-            table.getIndexes().remove(each.getIndexName().getIdentifier().getValue());
+            table.removeIndex(each.getIndexName().getIdentifier().getValue());
             alterSchemaMetaDataPOJO.getAlteredTables().add(table);
             modeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
         }
@@ -67,8 +66,7 @@ public final class DropIndexStatementSchemaRefresher implements MetaDataRefreshe
     }
     
     private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) {
-        ShardingSphereTable result = new ShardingSphereTable(table.getName(), new LinkedHashMap<>(table.getColumns()),
-                new LinkedHashMap<>(table.getIndexes()), new LinkedHashMap<>(table.getConstraints()));
+        ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getColumns(), table.getIndexes(), table.getConstraints());
         result.getColumnNames().addAll(table.getColumnNames());
         result.getVisibleColumns().addAll(table.getVisibleColumns());
         result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns());
diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataScheduleCollector.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataScheduleCollector.java
index 27cc0fdc8ef..8027c438b45 100644
--- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataScheduleCollector.java
+++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataScheduleCollector.java
@@ -148,7 +148,7 @@ public final class ShardingSphereDataScheduleCollector {
             ShardingSphereSchemaDataAlteredEvent result = new ShardingSphereSchemaDataAlteredEvent(databaseName, schemaName, tableData.getName());
             Map<String, ShardingSphereRowData> tableDataMap = tableData.getRows().stream().collect(Collectors.toMap(ShardingSphereRowData::getUniqueKey, Function.identity()));
             Map<String, ShardingSphereRowData> changedTableDataMap = changedTableData.getRows().stream().collect(Collectors.toMap(ShardingSphereRowData::getUniqueKey, Function.identity()));
-            YamlShardingSphereRowDataSwapper swapper = new YamlShardingSphereRowDataSwapper(new ArrayList<>(table.getColumns().values()));
+            YamlShardingSphereRowDataSwapper swapper = new YamlShardingSphereRowDataSwapper(new ArrayList<>(table.getColumns()));
             for (Entry<String, ShardingSphereRowData> entry : changedTableDataMap.entrySet()) {
                 if (!tableDataMap.containsKey(entry.getKey())) {
                     result.getAddedRows().add(swapper.swapToYamlConfiguration(entry.getValue()));
diff --git a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataCollectorTest.java b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataCollectorTest.java
index e08a8fe5901..91247e31a86 100644
--- a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataCollectorTest.java
+++ b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/execute/ShardingSphereDataCollectorTest.java
@@ -32,9 +32,9 @@ import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.junit.jupiter.api.Test;
 
 import java.sql.Types;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.LinkedList;
 import java.util.Properties;
 
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -81,9 +81,9 @@ class ShardingSphereDataCollectorTest {
         when(schema.getTable("test_table")).thenReturn(table);
         when(schema.containsTable("test_table")).thenReturn(true);
         when(table.getName()).thenReturn("test_table");
-        Map<String, ShardingSphereColumn> columns = new LinkedHashMap<>();
-        columns.put("column1", new ShardingSphereColumn("column1", Types.INTEGER, false, false, false, true, false));
-        columns.put("column2", new ShardingSphereColumn("column2", Types.INTEGER, false, false, false, true, false));
+        Collection<ShardingSphereColumn> columns = new LinkedList<>();
+        columns.add(new ShardingSphereColumn("column1", Types.INTEGER, false, false, false, true, false));
+        columns.add(new ShardingSphereColumn("column2", Types.INTEGER, false, false, false, true, false));
         when(table.getColumns()).thenReturn(columns);
         return result;
     }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
index 91044d8ad96..eb4d206d575 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
@@ -115,7 +115,7 @@ public final class ShardingSphereDataPersistService {
     private void persistTableData(final String databaseName, final String schemaName, final ShardingSphereSchemaData schemaData, final Map<String, ShardingSphereDatabase> databases) {
         schemaData.getTableData().values().forEach(each -> {
             YamlShardingSphereRowDataSwapper swapper =
-                    new YamlShardingSphereRowDataSwapper(new ArrayList<>(databases.get(databaseName.toLowerCase()).getSchema(schemaName).getTable(each.getName()).getColumns().values()));
+                    new YamlShardingSphereRowDataSwapper(new ArrayList<>(databases.get(databaseName.toLowerCase()).getSchema(schemaName).getTable(each.getName()).getColumns()));
             persistTableData(databaseName, schemaName, each.getName(), each.getRows().stream().map(swapper::swapToYamlConfiguration).collect(Collectors.toList()));
         });
     }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
index 0af4580c64a..851795ac414 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
@@ -80,7 +80,7 @@ public final class ShardingSphereTableRowDataPersistService {
      */
     public ShardingSphereTableData load(final String databaseName, final String schemaName, final String tableName, final ShardingSphereTable table) {
         ShardingSphereTableData result = new ShardingSphereTableData(tableName);
-        YamlShardingSphereRowDataSwapper swapper = new YamlShardingSphereRowDataSwapper(new ArrayList<>(table.getColumns().values()));
+        YamlShardingSphereRowDataSwapper swapper = new YamlShardingSphereRowDataSwapper(new ArrayList<>(table.getColumns()));
         for (String each : repository.getChildrenKeys(ShardingSphereDataNode.getTablePath(databaseName, schemaName, tableName))) {
             String yamlRow = repository.getDirectly(ShardingSphereDataNode.getTableRowPath(databaseName, schemaName, tableName, each));
             if (!Strings.isNullOrEmpty(yamlRow)) {
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
index bce6084a26f..5b99aa7d2f1 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
@@ -126,9 +126,11 @@ class DatabaseMetaDataPersistServiceTest {
         assertThat(schema.size(), is(1));
         assertTrue(databaseMetaDataPersistService.loadSchemas("test").isEmpty());
         assertThat(schema.get("foo_schema").getAllTableNames(), is(Collections.singleton("t_order")));
-        assertThat(schema.get("foo_schema").getTable("t_order").getIndexes().keySet(), is(Collections.singleton("primary")));
+        assertThat(schema.get("foo_schema").getTable("t_order").getIndexes().size(), is(1));
+        assertThat(schema.get("foo_schema").getTable("t_order").getIndexes().iterator().next().getName(), is("PRIMARY"));
         assertThat(schema.get("foo_schema").getAllColumnNames("t_order").size(), is(1));
-        assertThat(schema.get("foo_schema").getTable("t_order").getColumns().keySet(), is(Collections.singleton("id")));
+        assertThat(schema.get("foo_schema").getTable("t_order").getColumns().size(), is(1));
+        assertThat(schema.get("foo_schema").getTable("t_order").getColumns().iterator().next().getName(), is("id"));
     }
     
     @SneakyThrows({IOException.class, URISyntaxException.class})
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
index 9803f031ae6..03ee83c5f9a 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistServiceTest.java
@@ -58,9 +58,10 @@ class TableMetaDataPersistServiceTest {
         when(repository.getDirectly("/metadata/foo_db/schemas/foo_schema/tables/t_order")).thenReturn(readYAML());
         Map<String, ShardingSphereTable> tables = tableMetaDataPersistService.load("foo_db", "foo_schema");
         assertThat(tables.size(), is(1));
-        assertThat(tables.get("t_order").getIndexes().keySet(), is(Collections.singleton("primary")));
+        assertThat(tables.get("t_order").getIndexes().size(), is(1));
+        assertThat(tables.get("t_order").getIndexes().iterator().next().getName(), is("PRIMARY"));
         assertThat(tables.get("t_order").getColumns().size(), is(1));
-        assertThat(tables.get("t_order").getColumns().keySet(), is(Collections.singleton("id")));
+        assertThat(tables.get("t_order").getColumns().iterator().next().getName(), is("id"));
     }
     
     @Test
diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationDataTypeUtils.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationDataTypeUtils.java
index 35f6e81ef3b..8997437589d 100644
--- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationDataTypeUtils.java
+++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationDataTypeUtils.java
@@ -47,7 +47,7 @@ public final class SQLFederationDataTypeUtils {
      */
     public static RelDataType createRelDataType(final ShardingSphereTable table, final DatabaseType protocolType, final RelDataTypeFactory typeFactory) {
         Builder fieldInfoBuilder = typeFactory.builder();
-        for (ShardingSphereColumn each : table.getColumns().values()) {
+        for (ShardingSphereColumn each : table.getColumns()) {
             fieldInfoBuilder.add(each.getName(), getRelDataType(protocolType, each, typeFactory));
         }
         return fieldInfoBuilder.build();
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index e169c26e33e..e6d761fe031 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -47,15 +47,15 @@ import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
-import org.apache.shardingsphere.infra.state.cluster.ClusterStateContext;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
+import org.apache.shardingsphere.infra.state.cluster.ClusterStateContext;
 import org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData;
 import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper;
 import org.apache.shardingsphere.metadata.MetaDataFactory;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -658,7 +658,7 @@ public final class ContextManager implements AutoCloseable {
             return;
         }
         ShardingSphereTableData tableData = metaDataContexts.getShardingSphereData().getDatabase(databaseName).getSchema(schemaName).getTable(tableName);
-        List<ShardingSphereColumn> columns = new ArrayList<>(metaDataContexts.getMetaData().getDatabase(databaseName).getSchema(schemaName).getTable(tableName).getColumns().values());
+        List<ShardingSphereColumn> columns = new ArrayList<>(metaDataContexts.getMetaData().getDatabase(databaseName).getSchema(schemaName).getTable(tableName).getColumns());
         tableData.getRows().add(new YamlShardingSphereRowDataSwapper(columns).swapToObject(yamlRowData));
     }
     
diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 8e60a0fed2e..a1619edb9ba 100644
--- a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -36,9 +36,9 @@ import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
 import org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
 import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
@@ -167,7 +167,7 @@ class ContextManagerTest {
         contextManager.alterSchema("foo_db", "foo_schema", toBeChangedTable, null);
         ShardingSphereTable table = contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().get("foo_tbl");
         assertThat(table.getColumns().size(), is(1));
-        assertTrue(table.getColumns().containsKey("foo_col"));
+        assertTrue(table.containsColumn("foo_col"));
     }
     
     @Test
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
index 4c17c7d96cf..d68752f9f54 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
@@ -68,7 +68,7 @@ public final class ShowTableMetaDataExecutor implements ConnectionSessionRequire
     private Collection<LocalDataQueryResultRow> buildTableRows(final String databaseName, final ShardingSphereSchema schema, final String tableName) {
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
         Collection<LocalDataQueryResultRow> columnRows = schema.getAllColumnNames(tableName).stream().map(each -> buildRow(databaseName, tableName, "COLUMN", each)).collect(Collectors.toList());
-        Collection<LocalDataQueryResultRow> indexRows = schema.getTable(tableName).getIndexes().values().stream().map(ShardingSphereIndex::getName)
+        Collection<LocalDataQueryResultRow> indexRows = schema.getTable(tableName).getIndexes().stream().map(ShardingSphereIndex::getName)
                 .map(each -> buildRow(databaseName, tableName, "INDEX", each)).collect(Collectors.toList());
         result.addAll(columnRows);
         result.addAll(indexRows);
diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/response/header/query/MySQLQueryHeaderBuilder.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/response/header/query/MySQLQueryHeaderBuilder.java
index 1bd72432721..12bf6ea60cd 100644
--- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/response/header/query/MySQLQueryHeaderBuilder.java
+++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/response/header/query/MySQLQueryHeaderBuilder.java
@@ -47,7 +47,7 @@ public final class MySQLQueryHeaderBuilder implements QueryHeaderBuilder {
             tableName = getLogicTableName(database, actualTableName);
             ShardingSphereSchema schema = database.getSchema(schemaName);
             primaryKey = null != schema
-                    && Optional.ofNullable(schema.getTable(tableName)).map(optional -> optional.getColumns().get(columnName.toLowerCase())).map(ShardingSphereColumn::isPrimaryKey).orElse(false);
+                    && Optional.ofNullable(schema.getTable(tableName)).map(optional -> optional.getColumn(columnName)).map(ShardingSphereColumn::isPrimaryKey).orElse(false);
         }
         int columnType = queryResultMetaData.getColumnType(columnIndex);
         String columnTypeName = queryResultMetaData.getColumnTypeName(columnIndex);
diff --git a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index d1f81eb2c9c..695e2aa6017 100644
--- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -148,7 +148,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
         for (Projection each : projections) {
             // TODO Calculate column definition flag for other projection types
             if (each instanceof ColumnProjection) {
-                result.add(Optional.ofNullable(columnToTableMap.get(each.getExpression())).map(schema::getTable).map(table -> table.getColumns().get(((ColumnProjection) each).getName()))
+                result.add(Optional.ofNullable(columnToTableMap.get(each.getExpression())).map(schema::getTable).map(table -> table.getColumn(((ColumnProjection) each).getName()))
                         .map(column -> createMySQLColumnDefinition41Packet(characterSet, calculateColumnDefinitionFlag(column), MySQLBinaryColumnType.valueOfJDBCType(column.getDataType())))
                         .orElseGet(() -> createMySQLColumnDefinition41Packet(characterSet, 0, MySQLBinaryColumnType.MYSQL_TYPE_VAR_STRING)));
             } else {
diff --git a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
index 8672a15f181..1c3b440930f 100644
--- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
+++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
@@ -29,13 +29,11 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.Parameter
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
-import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 /**
@@ -59,8 +57,6 @@ public final class MySQLComStmtPrepareParameterMarkerExtractor {
     private static Map<ParameterMarkerSegment, ShardingSphereColumn> findColumnsOfParameterMarkersForInsert(final InsertStatement insertStatement, final ShardingSphereSchema schema) {
         ShardingSphereTable table = schema.getTable(insertStatement.getTable().getTableName().getIdentifier().getValue());
         List<String> columnNamesOfInsert = getColumnNamesOfInsertStatement(insertStatement, table);
-        Map<String, ShardingSphereColumn> columnsOfTable = table.getColumns();
-        Map<String, ShardingSphereColumn> caseInsensitiveColumnsOfTable = convertToCaseInsensitiveColumnsOfTable(columnsOfTable);
         Map<ParameterMarkerSegment, ShardingSphereColumn> result = new LinkedHashMap<>(insertStatement.getParameterMarkerSegments().size(), 1);
         for (InsertValuesSegment each : insertStatement.getValues()) {
             ListIterator<ExpressionSegment> listIterator = each.getValues().listIterator();
@@ -70,7 +66,7 @@ public final class MySQLComStmtPrepareParameterMarkerExtractor {
                     continue;
                 }
                 String columnName = columnNamesOfInsert.get(columnIndex);
-                ShardingSphereColumn column = columnsOfTable.getOrDefault(columnName, caseInsensitiveColumnsOfTable.get(columnName));
+                ShardingSphereColumn column = table.getColumn(columnName);
                 if (null != column) {
                     result.put((ParameterMarkerSegment) value, column);
                 }
@@ -80,13 +76,6 @@ public final class MySQLComStmtPrepareParameterMarkerExtractor {
     }
     
     private static List<String> getColumnNamesOfInsertStatement(final InsertStatement insertStatement, final ShardingSphereTable table) {
-        return insertStatement.getColumns().isEmpty() ? new ArrayList<>(table.getColumns().keySet())
-                : insertStatement.getColumns().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList());
-    }
-    
-    private static Map<String, ShardingSphereColumn> convertToCaseInsensitiveColumnsOfTable(final Map<String, ShardingSphereColumn> columns) {
-        Map<String, ShardingSphereColumn> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        result.putAll(columns);
-        return result;
+        return insertStatement.getColumns().isEmpty() ? table.getColumnNames() : insertStatement.getColumns().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList());
     }
 }
diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
index 22429220368..545b2d5cede 100644
--- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
+++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutorTest.java
@@ -230,9 +230,9 @@ class MySQLComStmtPrepareExecutorTest {
                 .thenReturn(new SQLParserRule(new SQLParserRuleConfiguration(false, cacheOption, cacheOption)));
         when(result.getMetaDataContexts().getMetaData().getDatabase(connectionSession.getDatabaseName()).getProtocolType()).thenReturn(new MySQLDatabaseType());
         ShardingSphereTable table = new ShardingSphereTable();
-        table.getColumns().put("id", new ShardingSphereColumn("id", Types.BIGINT, true, false, false, false, true));
-        table.getColumns().put("name", new ShardingSphereColumn("name", Types.VARCHAR, false, false, false, false, false));
-        table.getColumns().put("age", new ShardingSphereColumn("age", Types.SMALLINT, false, false, false, false, true));
+        table.putColumn(new ShardingSphereColumn("id", Types.BIGINT, true, false, false, false, true));
+        table.putColumn(new ShardingSphereColumn("name", Types.VARCHAR, false, false, false, false, false));
+        table.putColumn(new ShardingSphereColumn("age", Types.SMALLINT, false, false, false, false, true));
         ShardingSphereSchema schema = new ShardingSphereSchema();
         schema.getTables().put("user", table);
         ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", new MySQLDatabaseType(), new ShardingSphereResourceMetaData("foo_db", Collections.emptyMap()),
diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
index 7a10c74276b..d4562a9fe0c 100644
--- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
+++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
@@ -44,17 +44,17 @@ class MySQLComStmtPrepareParameterMarkerExtractorTest {
         ShardingSphereSchema schema = prepareSchema();
         Map<ParameterMarkerSegment, ShardingSphereColumn> actual = MySQLComStmtPrepareParameterMarkerExtractor.findColumnsOfParameterMarkers(sqlStatement, schema);
         List<ParameterMarkerSegment> parameterMarkerSegments = new ArrayList<>(((AbstractSQLStatement) sqlStatement).getParameterMarkerSegments());
-        assertThat(actual.get(parameterMarkerSegments.get(0)), is(schema.getTable("user").getColumns().get("name")));
-        assertThat(actual.get(parameterMarkerSegments.get(1)), is(schema.getTable("user").getColumns().get("age")));
-        assertThat(actual.get(parameterMarkerSegments.get(2)), is(schema.getTable("user").getColumns().get("id")));
-        assertThat(actual.get(parameterMarkerSegments.get(3)), is(schema.getTable("user").getColumns().get("age")));
+        assertThat(actual.get(parameterMarkerSegments.get(0)), is(schema.getTable("user").getColumn("name")));
+        assertThat(actual.get(parameterMarkerSegments.get(1)), is(schema.getTable("user").getColumn("age")));
+        assertThat(actual.get(parameterMarkerSegments.get(2)), is(schema.getTable("user").getColumn("id")));
+        assertThat(actual.get(parameterMarkerSegments.get(3)), is(schema.getTable("user").getColumn("age")));
     }
     
     private ShardingSphereSchema prepareSchema() {
         ShardingSphereTable table = new ShardingSphereTable();
-        table.getColumns().put("id", new ShardingSphereColumn("id", Types.BIGINT, true, false, false, false, true));
-        table.getColumns().put("name", new ShardingSphereColumn("name", Types.VARCHAR, false, false, false, false, false));
-        table.getColumns().put("age", new ShardingSphereColumn("age", Types.SMALLINT, false, false, false, false, true));
+        table.putColumn(new ShardingSphereColumn("id", Types.BIGINT, true, false, false, false, true));
+        table.putColumn(new ShardingSphereColumn("name", Types.VARCHAR, false, false, false, false, false));
+        table.putColumn(new ShardingSphereColumn("age", Types.SMALLINT, false, false, false, false, true));
         ShardingSphereSchema result = new ShardingSphereSchema();
         result.getTables().put("user", table);
         return result;
diff --git a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
index e730b8475fd..7c572ea70f1 100644
--- a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
+++ b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
@@ -71,9 +71,7 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
-import java.util.Map;
 import java.util.Optional;
-import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 /**
@@ -134,9 +132,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
         String logicTableName = insertStatement.getTable().getTableName().getIdentifier().getValue();
         ShardingSphereTable table = getTableFromMetaData(connectionSession.getDatabaseName(), insertStatement, logicTableName);
         List<String> columnNamesOfInsert = getColumnNamesOfInsertStatement(insertStatement, table);
-        Map<String, ShardingSphereColumn> columnsOfTable = table.getColumns();
-        Map<String, ShardingSphereColumn> caseInsensitiveColumnsOfTable = convertToCaseInsensitiveColumnsOfTable(columnsOfTable);
-        preparedStatement.setRowDescription(returningSegment.<PostgreSQLPacket>map(returning -> describeReturning(returning, columnsOfTable, caseInsensitiveColumnsOfTable))
+        preparedStatement.setRowDescription(returningSegment.<PostgreSQLPacket>map(returning -> describeReturning(returning, table))
                 .orElseGet(PostgreSQLNoDataPacket::getInstance));
         int parameterMarkerIndex = 0;
         for (InsertValuesSegment each : insertStatement.getValues()) {
@@ -151,7 +147,7 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
                     continue;
                 }
                 String columnName = columnNamesOfInsert.get(columnIndex);
-                ShardingSphereColumn column = columnsOfTable.getOrDefault(columnName, caseInsensitiveColumnsOfTable.get(columnName));
+                ShardingSphereColumn column = table.getColumn(columnName);
                 ShardingSpherePreconditions.checkState(null != column, () -> new ColumnNotFoundException(logicTableName, columnName));
                 preparedStatement.getParameterTypes().set(parameterMarkerIndex++, PostgreSQLColumnType.valueOfJDBCType(column.getDataType()));
             }
@@ -177,28 +173,20 @@ public final class PostgreSQLComDescribeExecutor implements CommandExecutor {
     }
     
     private static List<String> getColumnNamesOfInsertStatement(final InsertStatement insertStatement, final ShardingSphereTable table) {
-        return insertStatement.getColumns().isEmpty() ? new ArrayList<>(table.getColumns().keySet())
-                : insertStatement.getColumns().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList());
+        return insertStatement.getColumns().isEmpty() ? table.getColumnNames() : insertStatement.getColumns().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList());
     }
     
-    private Map<String, ShardingSphereColumn> convertToCaseInsensitiveColumnsOfTable(final Map<String, ShardingSphereColumn> columns) {
-        Map<String, ShardingSphereColumn> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        result.putAll(columns);
-        return result;
-    }
-    
-    private PostgreSQLRowDescriptionPacket describeReturning(final ReturningSegment returningSegment, final Map<String, ShardingSphereColumn> columnsOfTable,
-                                                             final Map<String, ShardingSphereColumn> caseInsensitiveColumnsOfTable) {
+    private PostgreSQLRowDescriptionPacket describeReturning(final ReturningSegment returningSegment, final ShardingSphereTable table) {
         Collection<PostgreSQLColumnDescription> result = new LinkedList<>();
         for (ProjectionSegment each : returningSegment.getProjections().getProjections()) {
             if (each instanceof ShorthandProjectionSegment) {
-                columnsOfTable.values().stream().map(column -> new PostgreSQLColumnDescription(column.getName(), 0, column.getDataType(), estimateColumnLength(column.getDataType()), ""))
+                table.getColumns().stream().map(column -> new PostgreSQLColumnDescription(column.getName(), 0, column.getDataType(), estimateColumnLength(column.getDataType()), ""))
                         .forEach(result::add);
             }
             if (each instanceof ColumnProjectionSegment) {
                 ColumnProjectionSegment segment = (ColumnProjectionSegment) each;
                 String columnName = segment.getColumn().getIdentifier().getValue();
-                ShardingSphereColumn column = columnsOfTable.getOrDefault(columnName, caseInsensitiveColumnsOfTable.getOrDefault(columnName, generateDefaultColumn(segment)));
+                ShardingSphereColumn column = table.containsColumn(columnName) ? table.getColumn(columnName) : generateDefaultColumn(segment);
                 String alias = segment.getAlias().orElseGet(column::getName);
                 result.add(new PostgreSQLColumnDescription(alias, 0, column.getDataType(), estimateColumnLength(column.getDataType()), ""));
             }
diff --git a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
index ec2914ae9ad..930a1db275b 100644
--- a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
+++ b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/AddResourceTestCase.java
@@ -71,7 +71,7 @@ public final class AddResourceTestCase extends BaseTransactionTestCase {
         try (Connection connection = getDataSource().getConnection()) {
             connection.setAutoCommit(false);
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
-            executeWithLog(connection, "insert into account(id, BALANCE, TRANSACTION_ID) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
+            executeWithLog(connection, "insert into account(id, balance, transaction_id) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
             connection.rollback();
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
@@ -82,7 +82,7 @@ public final class AddResourceTestCase extends BaseTransactionTestCase {
         try (Connection connection = getDataSource().getConnection()) {
             connection.setAutoCommit(false);
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
-            executeWithLog(connection, "insert into account(id, BALANCE, TRANSACTION_ID) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
+            executeWithLog(connection, "insert into account(id, balance, transaction_id) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
             connection.commit();
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
diff --git a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
index 1413c1212c7..a008e8ab5d0 100644
--- a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
+++ b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/CloseResourceTestCase.java
@@ -62,7 +62,7 @@ public final class CloseResourceTestCase extends BaseTransactionTestCase {
         try (Connection connection = getDataSource().getConnection()) {
             connection.setAutoCommit(false);
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
-            executeWithLog(connection, "insert into account(id, BALANCE, TRANSACTION_ID) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
+            executeWithLog(connection, "insert into account(id, balance, transaction_id) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
             connection.rollback();
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
@@ -73,7 +73,7 @@ public final class CloseResourceTestCase extends BaseTransactionTestCase {
         try (Connection connection = getDataSource().getConnection()) {
             connection.setAutoCommit(false);
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 0);
-            executeWithLog(connection, "insert into account(id, BALANCE, TRANSACTION_ID) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
+            executeWithLog(connection, "insert into account(id, balance, transaction_id) values(1, 1, 1),(2, 2, 2),(3, 3, 3),(4, 4, 4),(5, 5, 5),(6, 6, 6);");
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
             connection.commit();
             assertTableRowCount(connection, TransactionTestConstants.ACCOUNT, 6);
diff --git a/test/e2e/operation/transaction/src/test/resources/env/common/command.xml b/test/e2e/operation/transaction/src/test/resources/env/common/command.xml
index c73555a57d8..81c6e2b42b8 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/common/command.xml
+++ b/test/e2e/operation/transaction/src/test/resources/env/common/command.xml
@@ -98,8 +98,8 @@
     <create-account-table>
         CREATE TABLE account
         (
-        ID BIGINT, BALANCE FLOAT,
-        TRANSACTION_ID INT
+        id BIGINT, balance FLOAT,
+        transaction_id INT
         )
     </create-account-table>
 
diff --git a/test/e2e/operation/transaction/src/test/resources/env/scenario/cursor/data/actual/init-sql/opengauss/01-actual-init.sql b/test/e2e/operation/transaction/src/test/resources/env/scenario/cursor/data/actual/init-sql/opengauss/01-actual-init.sql
index c75f4716582..4b7bc981143 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/scenario/cursor/data/actual/init-sql/opengauss/01-actual-init.sql
+++ b/test/e2e/operation/transaction/src/test/resources/env/scenario/cursor/data/actual/init-sql/opengauss/01-actual-init.sql
@@ -47,8 +47,8 @@ CREATE TABLE "t_order_item_0" ("item_id" INT PRIMARY KEY, "order_id" int NOT NUL
 CREATE TABLE "t_order_item_1" ("item_id" INT PRIMARY KEY, "order_id" int NOT NULL, "user_id" int NOT NULL, "status" varchar(50) DEFAULT NULL);
 CREATE OR REPLACE VIEW t_order_view_0 AS SELECT * FROM t_order_0;
 CREATE OR REPLACE VIEW t_order_view_1 AS SELECT * FROM t_order_1;
-CREATE TABLE "account_0"("ID" BIGINT, "BALANCE" FLOAT, "TRANSACTION_ID" INT);
-CREATE TABLE "account_1"("ID" BIGINT, "BALANCE" FLOAT, "TRANSACTION_ID" INT);
+CREATE TABLE "account_0"("id" BIGINT, "balance" FLOAT, "transaction_id" INT);
+CREATE TABLE "account_1"("id" BIGINT, "balance" FLOAT, "transaction_id" INT);
 CREATE TABLE "t_address" ("address_id" INT PRIMARY KEY, "code" VARCHAR(36) DEFAULT NULL, "address" VARCHAR(36) DEFAULT NULL, "city_id" INT, "province_id" INT, "country_id" INT);
 CREATE TABLE "t_country" ("country_id" INT PRIMARY KEY, "country_name" VARCHAR, "continent_name" VARCHAR, "creation_date" DATE NOT NULL);
 CREATE TABLE "t_province" ("province_id" INT PRIMARY KEY, "country_id" INT, "province_name" VARCHAR, "creation_date" DATE NOT NULL);
@@ -86,8 +86,8 @@ CREATE TABLE "t_order_item_0" ("item_id" INT PRIMARY KEY, "order_id" int NOT NUL
 CREATE TABLE "t_order_item_1" ("item_id" INT PRIMARY KEY, "order_id" int NOT NULL, "user_id" int NOT NULL, "status" varchar(50) DEFAULT NULL);
 CREATE OR REPLACE VIEW t_order_view_0 AS SELECT * FROM t_order_0;
 CREATE OR REPLACE VIEW t_order_view_1 AS SELECT * FROM t_order_1;
-CREATE TABLE "account_0"("ID" BIGINT, "BALANCE" FLOAT, "TRANSACTION_ID" INT);
-CREATE TABLE "account_1"("ID" BIGINT, "BALANCE" FLOAT, "TRANSACTION_ID" INT);
+CREATE TABLE "account_0"("id" BIGINT, "balance" FLOAT, "transaction_id" INT);
+CREATE TABLE "account_1"("id" BIGINT, "balance" FLOAT, "transaction_id" INT);
 CREATE TABLE "t_address" ("address_id" INT PRIMARY KEY, "code" VARCHAR(36) DEFAULT NULL, "address" VARCHAR(36) DEFAULT NULL, "city_id" INT, "province_id" INT, "country_id" INT);
 CREATE TABLE "t_country" ("country_id" INT PRIMARY KEY, "country_name" VARCHAR, "continent_name" VARCHAR, "creation_date" DATE NOT NULL);
 CREATE TABLE "t_province" ("province_id" INT PRIMARY KEY, "country_id" INT, "province_name" VARCHAR, "creation_date" DATE NOT NULL);
diff --git a/test/e2e/operation/transaction/src/test/resources/env/scenario/default/data/actual/init-sql/mysql/01-actual-init.sql b/test/e2e/operation/transaction/src/test/resources/env/scenario/default/data/actual/init-sql/mysql/01-actual-init.sql
index e6ae91a2977..14979a7062f 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/scenario/default/data/actual/init-sql/mysql/01-actual-init.sql
+++ b/test/e2e/operation/transaction/src/test/resources/env/scenario/default/data/actual/init-sql/mysql/01-actual-init.sql
@@ -30,14 +30,14 @@ CREATE TABLE transaction_it_0.`t_order_0` (`order_id` INT PRIMARY KEY, `user_id`
 CREATE TABLE transaction_it_0.`t_order_1` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE transaction_it_0.`t_order_item_0` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
 CREATE TABLE transaction_it_0.`t_order_item_1` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
-CREATE TABLE transaction_it_0.`account_0`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
-CREATE TABLE transaction_it_0.`account_1`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
+CREATE TABLE transaction_it_0.`account_0`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
+CREATE TABLE transaction_it_0.`account_1`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
 CREATE TABLE transaction_it_0.`t_address` (`id` INT PRIMARY KEY, `code` VARCHAR(36) DEFAULT NULL, `address` VARCHAR(36) DEFAULT NULL);
 
 CREATE TABLE transaction_it_1.`t_order_0` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE transaction_it_1.`t_order_1` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE transaction_it_1.`t_order_item_0` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
 CREATE TABLE transaction_it_1.`t_order_item_1` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
-CREATE TABLE transaction_it_1.`account_0`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
-CREATE TABLE transaction_it_1.`account_1`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
+CREATE TABLE transaction_it_1.`account_0`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
+CREATE TABLE transaction_it_1.`account_1`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
 CREATE TABLE transaction_it_1.`t_address` (`id` INT PRIMARY KEY, `code` VARCHAR(36) DEFAULT NULL, `address` VARCHAR(36) DEFAULT NULL);
diff --git a/test/e2e/operation/transaction/src/test/resources/env/scenario/readwrite-splitting/data/actual/init-sql/mysql/01-actual-init.sql b/test/e2e/operation/transaction/src/test/resources/env/scenario/readwrite-splitting/data/actual/init-sql/mysql/01-actual-init.sql
index 38344a363ed..2bba89ddf06 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/scenario/readwrite-splitting/data/actual/init-sql/mysql/01-actual-init.sql
+++ b/test/e2e/operation/transaction/src/test/resources/env/scenario/readwrite-splitting/data/actual/init-sql/mysql/01-actual-init.sql
@@ -28,15 +28,15 @@ CREATE DATABASE read_ds_1;
 
 CREATE TABLE write_ds.`t_order` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE write_ds.`t_order_item` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
-CREATE TABLE write_ds.`account`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
+CREATE TABLE write_ds.`account`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
 CREATE TABLE write_ds.`t_address` (`id` INT PRIMARY KEY, `code` VARCHAR(36) DEFAULT NULL, `address` VARCHAR(36) DEFAULT NULL);
 
 CREATE TABLE read_ds_0.`t_order` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE read_ds_0.`t_order_item` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
-CREATE TABLE read_ds_0.`account`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
+CREATE TABLE read_ds_0.`account`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
 CREATE TABLE read_ds_0.`t_address` (`id` INT PRIMARY KEY, `code` VARCHAR(36) DEFAULT NULL, `address` VARCHAR(36) DEFAULT NULL);
 
 CREATE TABLE read_ds_1.`t_order` (`order_id` INT PRIMARY KEY, `user_id` INT NOT NULL, `status` VARCHAR(45) NULL);
 CREATE TABLE read_ds_1.`t_order_item` (`item_id` INT PRIMARY KEY, `order_id` int NOT NULL, `user_id` int NOT NULL, `status` varchar(50) DEFAULT NULL);
-CREATE TABLE read_ds_1.`account`(`ID` BIGINT, `BALANCE` FLOAT, `TRANSACTION_ID` INT);
+CREATE TABLE read_ds_1.`account`(`id` BIGINT, `balance` FLOAT, `transaction_id` INT);
 CREATE TABLE read_ds_1.`t_address` (`id` INT PRIMARY KEY, `code` VARCHAR(36) DEFAULT NULL, `address` VARCHAR(36) DEFAULT NULL);
diff --git a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/MixSQLRewriterIT.java b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/MixSQLRewriterIT.java
index e4bf022cd58..2993ea70b19 100644
--- a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/MixSQLRewriterIT.java
+++ b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/MixSQLRewriterIT.java
@@ -38,7 +38,7 @@ import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.Map;
 
 import static org.mockito.Mockito.mock;
@@ -60,7 +60,7 @@ class MixSQLRewriterIT extends SQLRewriterIT {
         when(result.getAllTableNames()).thenReturn(Arrays.asList("t_account", "t_account_bak", "t_account_detail"));
         ShardingSphereTable accountTable = mock(ShardingSphereTable.class);
         when(accountTable.getColumns()).thenReturn(createColumns());
-        when(accountTable.getIndexes()).thenReturn(Collections.singletonMap("index_name", new ShardingSphereIndex("index_name")));
+        when(accountTable.getIndexes()).thenReturn(Collections.singletonList(new ShardingSphereIndex("index_name")));
         when(result.containsTable("t_account")).thenReturn(true);
         when(result.getTable("t_account")).thenReturn(accountTable);
         ShardingSphereTable accountBakTable = mock(ShardingSphereTable.class);
@@ -83,12 +83,12 @@ class MixSQLRewriterIT extends SQLRewriterIT {
     protected void mockDataSource(final Map<String, DataSource> dataSources) {
     }
     
-    private Map<String, ShardingSphereColumn> createColumns() {
-        Map<String, ShardingSphereColumn> result = new LinkedHashMap<>(4, 1);
-        result.put("account_id", new ShardingSphereColumn("account_id", Types.INTEGER, true, true, false, true, false));
-        result.put("password", mock(ShardingSphereColumn.class));
-        result.put("amount", mock(ShardingSphereColumn.class));
-        result.put("status", mock(ShardingSphereColumn.class));
+    private Collection<ShardingSphereColumn> createColumns() {
+        Collection<ShardingSphereColumn> result = new LinkedList<>();
+        result.add(new ShardingSphereColumn("account_id", Types.INTEGER, true, true, false, true, false));
+        result.add(mock(ShardingSphereColumn.class));
+        result.add(mock(ShardingSphereColumn.class));
+        result.add(mock(ShardingSphereColumn.class));
         return result;
     }
 }
diff --git a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java
index 4d2085deb8b..963018ba8b1 100644
--- a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java
+++ b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java
@@ -41,7 +41,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Optional;
 
@@ -73,7 +73,8 @@ class ShardingSQLRewriterIT extends SQLRewriterIT {
         when(result.getAllTableNames()).thenReturn(Arrays.asList("t_account", "t_account_detail"));
         ShardingSphereTable accountTableMetaData = mock(ShardingSphereTable.class);
         when(accountTableMetaData.getColumns()).thenReturn(createColumnMetaDataMap());
-        when(accountTableMetaData.getIndexes()).thenReturn(Collections.singletonMap("status_idx_exist", new ShardingSphereIndex("status_idx_exist")));
+        when(accountTableMetaData.getIndexes()).thenReturn(Collections.singletonList(new ShardingSphereIndex("status_idx_exist")));
+        when(accountTableMetaData.containsIndex("status_idx_exist")).thenReturn(true);
         when(accountTableMetaData.getPrimaryKeyColumns()).thenReturn(Collections.singletonList("account_id"));
         when(result.containsTable("t_account")).thenReturn(true);
         when(result.getTable("t_account")).thenReturn(accountTableMetaData);
@@ -88,11 +89,11 @@ class ShardingSQLRewriterIT extends SQLRewriterIT {
         return Collections.singletonMap(schemaName, result);
     }
     
-    private Map<String, ShardingSphereColumn> createColumnMetaDataMap() {
-        Map<String, ShardingSphereColumn> result = new LinkedHashMap<>(3, 1);
-        result.put("account_id", new ShardingSphereColumn("account_id", Types.INTEGER, true, true, false, true, false));
-        result.put("amount", mock(ShardingSphereColumn.class));
-        result.put("status", mock(ShardingSphereColumn.class));
+    private Collection<ShardingSphereColumn> createColumnMetaDataMap() {
+        Collection<ShardingSphereColumn> result = new LinkedList<>();
+        result.add(new ShardingSphereColumn("account_id", Types.INTEGER, true, true, false, true, false));
+        result.add(mock(ShardingSphereColumn.class));
+        result.add(mock(ShardingSphereColumn.class));
         return result;
     }