You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by vj...@apache.org on 2023/12/01 04:45:04 UTC

(phoenix) branch 5.1 updated: PHOENIX-7101 Explain plan to output local index name if it is used (#1742)

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

vjasani pushed a commit to branch 5.1
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/5.1 by this push:
     new a74d4125ec PHOENIX-7101 Explain plan to output local index name if it is used (#1742)
a74d4125ec is described below

commit a74d4125ecd44355787be60d605af7759ab9e322
Author: Jing Yu <yu...@salesforce.com>
AuthorDate: Thu Nov 30 23:44:58 2023 -0500

    PHOENIX-7101 Explain plan to output local index name if it is used (#1742)
---
 .../end2end/BaseTenantSpecificViewIndexIT.java     |   8 +-
 .../phoenix/end2end/CostBasedDecisionIT.java       |  57 +++++++----
 .../java/org/apache/phoenix/end2end/DeleteIT.java  |   2 +-
 .../phoenix/end2end/FlappingLocalIndexIT.java      |  16 +--
 .../phoenix/end2end/IndexBuildTimestampIT.java     |   6 +-
 .../apache/phoenix/end2end/IndexExtendedIT.java    |   4 +-
 .../org/apache/phoenix/end2end/IndexToolIT.java    |   8 +-
 .../phoenix/end2end/LocalIndexSplitMergeIT.java    |  16 +--
 .../phoenix/end2end/TenantSpecificViewIndexIT.java |  13 +--
 .../phoenix/end2end/UserDefinedFunctionsIT.java    |   2 +-
 .../it/java/org/apache/phoenix/end2end/ViewIT.java |  10 +-
 .../apache/phoenix/end2end/index/BaseIndexIT.java  |  23 +++--
 .../end2end/index/GlobalIndexOptimizationIT.java   |   3 +-
 .../phoenix/end2end/index/IndexMaintenanceIT.java  |   8 +-
 .../apache/phoenix/end2end/index/IndexUsageIT.java |  26 ++---
 .../apache/phoenix/end2end/index/LocalIndexIT.java |  40 +++++---
 .../end2end/index/MutableIndexFailureIT.java       |   5 +-
 .../phoenix/end2end/index/MutableIndexIT.java      |  25 +++--
 .../apache/phoenix/end2end/index/ViewIndexIT.java  |   5 +-
 .../end2end/index/txn/TxWriteFailureIT.java        |   3 +-
 .../apache/phoenix/end2end/join/BaseJoinIT.java    |  10 ++
 .../phoenix/end2end/join/HashJoinLocalIndexIT.java | 111 ++++++++++++++-------
 .../end2end/join/SortMergeJoinLocalIndexIT.java    |  22 ++--
 .../apache/phoenix/end2end/join/SubqueryIT.java    |  40 +++++---
 .../end2end/join/SubqueryUsingSortMergeJoinIT.java |  30 ++++--
 .../org/apache/phoenix/iterate/ExplainTable.java   |  20 +++-
 26 files changed, 334 insertions(+), 179 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseTenantSpecificViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseTenantSpecificViewIndexIT.java
index fdce1c4b87..37e3be38e3 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseTenantSpecificViewIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseTenantSpecificViewIndexIT.java
@@ -157,7 +157,9 @@ public abstract class BaseTenantSpecificViewIndexIT extends SplitSystemCatalogIT
                 iteratorTypeAndScanSize = "PARALLEL 3-WAY";
             }
             clientSortAlgo = "CLIENT MERGE SORT";
-            expectedTableName = tableName;
+            expectedTableName =
+                    SchemaUtil.getTableName(SchemaUtil.getSchemaNameFromFullName(viewName),
+                            indexName) + "(" + tableName + ")";
             keyRanges = " [" + (1L + expectedIndexIdOffset) + ",'" + tenantId
                 + "','" + valuePrefix + "v2-1']";
         } else {
@@ -202,7 +204,9 @@ public abstract class BaseTenantSpecificViewIndexIT extends SplitSystemCatalogIT
         assertEquals("SERVER FILTER BY FIRST KEY ONLY",
             explainPlanAttributes.getServerWhereFilter());
         assertEquals("RANGE SCAN ", explainPlanAttributes.getExplainScanType());
-        assertEquals(tableName, explainPlanAttributes.getTableName());
+        assertEquals(SchemaUtil.getTableName(SchemaUtil.getSchemaNameFromFullName(viewName),
+                        indexName) + "(" + tableName + ")",
+                explainPlanAttributes.getTableName());
         assertEquals(" [1," + tenantId + ",'" + valuePrefix + "v2-1']",
             explainPlanAttributes.getKeyRanges());
         assertEquals("CLIENT MERGE SORT",
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java
index f815eacc19..a76c40962e 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java
@@ -107,11 +107,13 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName = tableName + "_IDX";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 VARCHAR,\n" +
                     "c2 VARCHAR)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx ON " + tableName + " (c1)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName +
+                    " (c1)");
 
             String query = "SELECT c1, max(rowkey), max(c2) FROM " + tableName + " where rowkey <= 'z' GROUP BY c1";
             // Use the index table plan that opts out order-by when stats are not available.
@@ -153,7 +155,7 @@ public class CostBasedDecisionIT extends BaseTest {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(tableName, explainPlanAttributes.getTableName());
+            assertEquals(indexName + "(" + tableName + ")", explainPlanAttributes.getTableName());
             assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" <= 'z'",
                 explainPlanAttributes.getServerWhereFilter());
@@ -173,13 +175,15 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName1 = tableName + "_IDX1";
+            String indexName2 = tableName + "_IDX2";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 INTEGER,\n" +
                     "c2 INTEGER,\n" +
                     "c3 INTEGER)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx1 ON " + tableName + " (c1) INCLUDE (c2, c3)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx2 ON " + tableName + " (c2, c3) INCLUDE (c1)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName1 + " ON " + tableName + " (c1) INCLUDE (c2, c3)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName2 + " ON " + tableName + " (c2, c3) INCLUDE (c1)");
 
             String query = "SELECT * FROM " + tableName + " where c1 BETWEEN 10 AND 20 AND c2 < 9000 AND C3 < 5000";
             // Use the idx2 plan with a wider PK slot span when stats are not available.
@@ -192,7 +196,7 @@ public class CostBasedDecisionIT extends BaseTest {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(tableName, explainPlanAttributes.getTableName());
+            assertEquals(indexName2 + "(" + tableName + ")", explainPlanAttributes.getTableName());
             assertEquals(" [2,*] - [2,9,000]",
                 explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY ((\"C1\" >= 10 AND \"C1\" <= 20) AND TO_INTEGER(\"C3\") < 5000)",
@@ -220,7 +224,7 @@ public class CostBasedDecisionIT extends BaseTest {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(tableName, explainPlanAttributes.getTableName());
+            assertEquals(indexName1 + "(" + tableName + ")", explainPlanAttributes.getTableName());
             assertEquals(" [1,10] - [1,20]",
                 explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY (\"C2\" < 9000 AND \"C3\" < 5000)",
@@ -239,19 +243,22 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName1 = tableName + "_IDX1";
+            String indexName2 = tableName + "_IDX2";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 INTEGER,\n" +
                     "c2 INTEGER,\n" +
                     "c3 INTEGER)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx1 ON " + tableName + " (c1) INCLUDE (c2, c3)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx2 ON " + tableName + " (c2, c3) INCLUDE (c1)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName1 + " ON " + tableName + "(c1) INCLUDE (c2, c3)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName2 + " ON " + tableName + " (c2, c3) INCLUDE (c1)");
 
             String query = "UPSERT INTO " + tableName + " SELECT * FROM " + tableName + " where c1 BETWEEN 10 AND 20 AND c2 < 9000 AND C3 < 5000";
             // Use the idx2 plan with a wider PK slot span when stats are not available.
             verifyQueryPlan(query,
                     "UPSERT SELECT\n" +
-                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [2,*] - [2,9,000]\n" +
+                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName2 + "(" + tableName + ")" +
+                            " [2,*] - [2,9,000]\n" +
                             "    SERVER FILTER BY ((\"C1\" >= 10 AND \"C1\" <= 20) AND TO_INTEGER(\"C3\") < 5000)\n" +
                             "CLIENT MERGE SORT");
 
@@ -269,7 +276,8 @@ public class CostBasedDecisionIT extends BaseTest {
             // Use the idx2 plan that scans less data when stats become available.
             verifyQueryPlan(query,
                     "UPSERT SELECT\n" +
-                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1,10] - [1,20]\n" +
+                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName1 + "(" + tableName + ")" +
+                            " [1,10] - [1,20]\n" +
                             "    SERVER FILTER BY (\"C2\" < 9000 AND \"C3\" < 5000)\n" +
                             "CLIENT MERGE SORT");
         } finally {
@@ -284,19 +292,23 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName1 = tableName + "_IDX1";
+            String indexName2 = tableName + "_IDX2";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 INTEGER,\n" +
                     "c2 INTEGER,\n" +
                     "c3 INTEGER)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx1 ON " + tableName + " (c1) INCLUDE (c2, c3)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx2 ON " + tableName + " (c2, c3) INCLUDE (c1)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName1 + " ON " + tableName + " (c1) INCLUDE (c2, c3)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName2 + " ON " + tableName +
+                    " (c2, c3) INCLUDE (c1)");
 
             String query = "DELETE FROM " + tableName + " where c1 BETWEEN 10 AND 20 AND c2 < 9000 AND C3 < 5000";
             // Use the idx2 plan with a wider PK slot span when stats are not available.
             verifyQueryPlan(query,
                     "DELETE ROWS CLIENT SELECT\n" +
-                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [2,*] - [2,9,000]\n" +
+                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName2 + "(" + tableName + ")" +
+                            " [2,*] - [2,9,000]\n" +
                             "    SERVER FILTER BY ((\"C1\" >= 10 AND \"C1\" <= 20) AND TO_INTEGER(\"C3\") < 5000)\n" +
                             "CLIENT MERGE SORT");
 
@@ -314,7 +326,8 @@ public class CostBasedDecisionIT extends BaseTest {
             // Use the idx2 plan that scans less data when stats become available.
             verifyQueryPlan(query,
                     "DELETE ROWS CLIENT SELECT\n" +
-                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1,10] - [1,20]\n" +
+                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName1 + "(" + tableName + ")" +
+                            " [1,10] - [1,20]\n" +
                             "    SERVER FILTER BY (\"C2\" < 9000 AND \"C3\" < 5000)\n" +
                             "CLIENT MERGE SORT");
         } finally {
@@ -329,11 +342,12 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName = tableName + "_IDX";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 VARCHAR,\n" +
                     "c2 VARCHAR)");
-            conn.createStatement().execute("CREATE LOCAL INDEX " + tableName + "_idx ON " + tableName + " (c1)");
+            conn.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + " (c1)");
 
             String query = "SELECT c1, max(rowkey), max(c2) FROM " + tableName + " where rowkey <= 'z' GROUP BY c1 "
                     + "UNION ALL SELECT c1, max(rowkey), max(c2) FROM " + tableName + " where rowkey >= 'a' GROUP BY c1";
@@ -361,12 +375,14 @@ public class CostBasedDecisionIT extends BaseTest {
             // Use the optimal plan based on cost when stats become available.
             verifyQueryPlan(query,
                     "UNION ALL OVER 2 QUERIES\n" +
-                    "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
+                    "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName + "(" + tableName +
+                            ") [1]\n" +
                     "        SERVER MERGE [0.C2]\n" +
                     "        SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" <= 'z'\n" +
                     "        SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
                     "    CLIENT MERGE SORT\n" +
-                    "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
+                    "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName + "(" + tableName +
+                            ") [1]\n" +
                     "        SERVER MERGE [0.C2]\n" +
                     "        SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" >= 'a'\n" +
                     "        SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
@@ -383,6 +399,7 @@ public class CostBasedDecisionIT extends BaseTest {
         conn.setAutoCommit(true);
         try {
             String tableName = BaseTest.generateUniqueName();
+            String indexName = tableName + "_IDX";
             conn.createStatement().execute("CREATE TABLE " + tableName + " (\n" +
                     "rowkey VARCHAR PRIMARY KEY,\n" +
                     "c1 VARCHAR,\n" +
@@ -415,13 +432,15 @@ public class CostBasedDecisionIT extends BaseTest {
 
             // Use the optimal plan based on cost when stats become available.
             verifyQueryPlan(query,
-                    "CLIENT PARALLEL 626-WAY RANGE SCAN OVER " + tableName + " [1,'X0'] - [1,'X1']\n" +
+                    "CLIENT PARALLEL 626-WAY RANGE SCAN OVER " + indexName + "(" + tableName +
+                            ") [1,'X0'] - [1,'X1']\n" +
                     "    SERVER MERGE [0.C2]\n" +
                     "    SERVER FILTER BY FIRST KEY ONLY\n" +
                     "    SERVER SORTED BY [\"T1.:ROWKEY\"]\n" +
                     "CLIENT MERGE SORT\n" +
                     "    PARALLEL INNER-JOIN TABLE 0\n" +
-                    "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" +
+                    "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexName + "(" + tableName +
+                            ") [1]\n" +
                     "            SERVER MERGE [0.C2]\n" +
                     "            SERVER FILTER BY FIRST KEY ONLY AND \"ROWKEY\" <= 'z'\n" +
                     "            SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"C1\"]\n" +
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
index 70bd77b8f0..bfd96df678 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java
@@ -225,7 +225,7 @@ public class DeleteIT extends ParallelStatsDisabledIT {
         if (createIndex) {
             if (local) {
                 conn.createStatement().execute("CREATE LOCAL INDEX IF NOT EXISTS " + localIndexName + " ON " + tableName + "(j)");
-                indexInUse = tableName;
+                indexInUse = localIndexName + "(" + tableName + ")";
             } else {
                 conn.createStatement().execute("CREATE INDEX IF NOT EXISTS " + indexName + " ON " + tableName + "(j)");
             }
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/FlappingLocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/FlappingLocalIndexIT.java
index 02fc77a064..80b877272a 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/FlappingLocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/FlappingLocalIndexIT.java
@@ -178,8 +178,8 @@ public class FlappingLocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(indexTableName + "(" + indexPhysicalTableName + ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [1,'a'] - [1,'b']",
                 explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
@@ -211,8 +211,8 @@ public class FlappingLocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(indexTableName + "(" + indexPhysicalTableName + ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [1,'a']",
                 explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
@@ -241,8 +241,8 @@ public class FlappingLocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(indexTableName + "(" + indexPhysicalTableName + ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [1,*] - [1,'z']",
                 explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
@@ -276,8 +276,8 @@ public class FlappingLocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(indexTableName + "(" + indexPhysicalTableName + ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexBuildTimestampIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexBuildTimestampIT.java
index 52d905b80a..cdd8e9e6b9 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexBuildTimestampIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexBuildTimestampIT.java
@@ -250,7 +250,8 @@ public class IndexBuildTimestampIT extends BaseTest {
             String selectSql = String.format("SELECT * FROM %s WHERE val = 'abc'", (view ? viewName : dataTableName));
             conn = DriverManager.getConnection(getUrl());
             // assert we are pulling from index table
-            assertExplainPlan(conn, localIndex, selectSql, dataTableName, (view ? "_IDX_" + dataTableName : indexName));
+            assertExplainPlan(conn, localIndex, selectSql, dataTableName, (view && !localIndex ?
+                    "_IDX_" + dataTableName : indexName));
             ResultSet rs = conn.createStatement().executeQuery(selectSql);
             assertTrue (rs.next());
             assertTrue(rs.unwrap(PhoenixResultSet.class).getCurrentRow().getValue(0).getTimestamp() < clock2.initialTime() &&
@@ -259,7 +260,8 @@ public class IndexBuildTimestampIT extends BaseTest {
             selectSql =
                     String.format("SELECT * FROM %s WHERE val = 'bcd'", (view ? viewName : dataTableName));
             // assert we are pulling from index table
-            assertExplainPlan(conn, localIndex, selectSql, dataTableName, (view ? "_IDX_" + dataTableName : indexName));
+            assertExplainPlan(conn, localIndex, selectSql, dataTableName, (view && !localIndex ?
+                    "_IDX_" + dataTableName : indexName));
 
             rs = conn.createStatement().executeQuery(selectSql);
             assertTrue (rs.next());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java
index 0f143af45c..a287bdf3e7 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexExtendedIT.java
@@ -197,8 +197,8 @@ public class IndexExtendedIT extends BaseTest {
             explainPlanAttributes =
                 plan.getPlanStepsAsAttributes();
             //assert we are pulling from index table.
-            String expectedTableName = localIndex ? dataTableFullName
-                : indexTableFullName;
+            String expectedTableName = localIndex ?
+                    indexTableFullName + "(" + dataTableFullName + ")" : indexTableFullName;
             assertEquals(expectedTableName,
                 explainPlanAttributes.getTableName());
 
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java
index 7ec44007d1..9ba96a4bd2 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java
@@ -349,7 +349,7 @@ public class IndexToolIT extends BaseTest {
                 explainPlanAttributes.getExplainScanType());
             final String expectedTableName;
             if (localIndex) {
-                expectedTableName = dataTableFullName;
+                expectedTableName = indexTableFullName + "(" + dataTableFullName + ")";
             } else {
                 expectedTableName = indexTableFullName;
             }
@@ -826,8 +826,10 @@ public class IndexToolIT extends BaseTest {
         String expectedExplainPlan;
         if (localIndex) {
             expectedExplainPlan = String.format(" RANGE SCAN OVER %s [1,",
-                normalizeTableNames ? SchemaUtil.normalizeIdentifier(dataTableFullName)
-                        : dataTableFullName);
+                    normalizeTableNames ?
+                            SchemaUtil.normalizeIdentifier(indexTableFullName) + "(" +
+                                    SchemaUtil.normalizeIdentifier(dataTableFullName) + ")":
+                            indexTableFullName + "(" + dataTableFullName + ")");
         } else {
             expectedExplainPlan = String.format(" RANGE SCAN OVER %s",
                 normalizeTableNames ? SchemaUtil.normalizeIdentifier(indexTableFullName)
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/LocalIndexSplitMergeIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LocalIndexSplitMergeIT.java
index 57f05da104..07e4e731c5 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/LocalIndexSplitMergeIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LocalIndexSplitMergeIT.java
@@ -90,6 +90,7 @@ public class LocalIndexSplitMergeIT extends BaseTest {
         String schemaName = generateUniqueName();
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = schemaName + "." + indexName;
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), false);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -157,8 +158,8 @@ public class LocalIndexSplitMergeIT extends BaseTest {
                     explainPlanAttributes.getIteratorTypeAndScanSize());
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(indexPhysicalTableName,
-                    explainPlanAttributes.getTableName());
+                assertEquals(fullIndexName + "(" + indexPhysicalTableName + ")",
+                        explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                     explainPlanAttributes.getServerWhereFilter());
@@ -177,7 +178,7 @@ public class LocalIndexSplitMergeIT extends BaseTest {
                     explainPlanAttributes.getIteratorTypeAndScanSize());
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(indexPhysicalTableName,
+                assertEquals(fullIndexName + "_2(" + indexPhysicalTableName +  ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [2]", explainPlanAttributes.getKeyRanges());
                 assertEquals("SERVER FILTER BY FIRST KEY ONLY",
@@ -214,6 +215,7 @@ public class LocalIndexSplitMergeIT extends BaseTest {
         String schemaName = generateUniqueName();
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = schemaName + "." + indexName;
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), false);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -272,8 +274,8 @@ public class LocalIndexSplitMergeIT extends BaseTest {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(fullIndexName + "(" + indexPhysicalTableName +  ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
@@ -289,8 +291,8 @@ public class LocalIndexSplitMergeIT extends BaseTest {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-            assertEquals(indexPhysicalTableName,
-                explainPlanAttributes.getTableName());
+            assertEquals(fullIndexName + "_2(" + indexPhysicalTableName + ")",
+                    explainPlanAttributes.getTableName());
             assertEquals(" [2]", explainPlanAttributes.getKeyRanges());
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
index c5ba9542a4..6d60fb4206 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificViewIndexIT.java
@@ -154,6 +154,8 @@ public class TenantSpecificViewIndexIT extends BaseTenantSpecificViewIndexIT {
             boolean isNamespaceMapped, long indexIdOffset) throws Exception {
         Properties props = new Properties();
         String indexName = "I_"+ generateUniqueName();
+        String schemaName = SchemaUtil.getSchemaNameFromFullName(viewName);
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         if (tenantId != null) {
             props.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
         }
@@ -224,19 +226,18 @@ public class TenantSpecificViewIndexIT extends BaseTenantSpecificViewIndexIT {
         assertEquals("SERVER FILTER BY FIRST KEY ONLY",
             explainPlanAttributes.getServerWhereFilter());
         if (localIndex) {
-            assertEquals(SchemaUtil.getPhysicalTableName(
-                Bytes.toBytes(tableName), isNamespaceMapped).toString(),
+            assertEquals(fullIndexName + "(" + SchemaUtil.getPhysicalTableName(
+                Bytes.toBytes(tableName), isNamespaceMapped).toString() + ")",
                 explainPlanAttributes.getTableName());
             assertEquals("CLIENT MERGE SORT",
                 explainPlanAttributes.getClientSortAlgo());
             assertEquals(" [" + (1L + indexIdOffset) + ",'"
                 + tenantId + "','f']", explainPlanAttributes.getKeyRanges());
         } else {
-            assertEquals(
-                Bytes.toString(MetaDataUtil.getViewIndexPhysicalName(
+            assertEquals(Bytes.toString(MetaDataUtil.getViewIndexPhysicalName(
                     SchemaUtil.getPhysicalTableName(Bytes.toBytes(tableName),
-                        isNamespaceMapped).toBytes())),
-                explainPlanAttributes.getTableName());
+                            isNamespaceMapped).toBytes())),
+                    explainPlanAttributes.getTableName());
             assertNull(explainPlanAttributes.getClientSortAlgo());
             assertEquals(" [" + (Short.MIN_VALUE + indexIdOffset) + ",'"
                 + tenantId + "','f']", explainPlanAttributes.getKeyRanges());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java
index 9b3d1311a0..fa8c8ffe57 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java
@@ -828,7 +828,7 @@ public class UserDefinedFunctionsIT extends BaseOwnClusterIT {
             explainPlanAttributes.getIteratorTypeAndScanSize());
         assertEquals("RANGE SCAN ",
             explainPlanAttributes.getExplainScanType());
-        assertEquals("T5", explainPlanAttributes.getTableName());
+        assertEquals("IDX2(T5)", explainPlanAttributes.getTableName());
         assertEquals(" [1,'kcoj']", explainPlanAttributes.getKeyRanges());
         assertEquals("SERVER FILTER BY FIRST KEY ONLY",
             explainPlanAttributes.getServerWhereFilter());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
index 552dadd581..7199dee1df 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
@@ -488,7 +488,8 @@ public class ViewIT extends SplitSystemCatalogIT {
             // Assert that in either case (local & global) that index from
             // physical table used for query on view.
             if (localIndex) {
-                assertEquals(fullTableName, explainPlanAttributes.getTableName());
+                assertEquals(fullIndexName1 + "(" + fullTableName + ")",
+                        explainPlanAttributes.getTableName());
                 assertEquals(" [1,1,100] - [1,2,109]",
                     explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
@@ -1026,6 +1027,8 @@ public class ViewIT extends SplitSystemCatalogIT {
         try (Connection conn = DriverManager.getConnection(getUrl());
                 Statement stmt = conn.createStatement()) {
             String viewIndexName1 = "I_" + generateUniqueName();
+            String schemaName = SchemaUtil.getSchemaNameFromFullName(viewName);
+            String viewIndexFullName1 = SchemaUtil.getTableName(schemaName, viewIndexName1);
             String viewIndexPhysicalName = MetaDataUtil.
                     getViewIndexPhysicalName(fullTableName);
             if (localIndex) {
@@ -1069,7 +1072,7 @@ public class ViewIT extends SplitSystemCatalogIT {
                 assertEquals("PARALLEL "
                         + (saltBuckets == null ? 1 : saltBuckets) + "-WAY",
                     explainPlanAttributes.getIteratorTypeAndScanSize());
-                assertEquals(fullTableName,
+                assertEquals(viewIndexFullName1 + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,51]", explainPlanAttributes.getKeyRanges());
                 assertEquals("SERVER FILTER BY FIRST KEY ONLY",
@@ -1097,6 +1100,7 @@ public class ViewIT extends SplitSystemCatalogIT {
             }
 
             String viewIndexName2 = "I_" + generateUniqueName();
+            String viewIndexFullName2 = SchemaUtil.getTableName(schemaName, viewIndexName2);
             if (localIndex) {
                 stmt.execute("CREATE LOCAL INDEX " + viewIndexName2 + " on "
                         + viewName + "(s)");
@@ -1137,7 +1141,7 @@ public class ViewIT extends SplitSystemCatalogIT {
                 physicalTableName = fullTableName;
                 assertEquals("PARALLEL " + (saltBuckets == null ? 1 : saltBuckets)
                     + "-WAY", explainPlanAttributes.getIteratorTypeAndScanSize());
-                assertEquals(fullTableName,
+                assertEquals(viewIndexFullName2 + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [" + (2) + ",'foo']",
                     explainPlanAttributes.getKeyRanges());
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java
index d0260120bc..ed946eabe4 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/BaseIndexIT.java
@@ -158,7 +158,8 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
                 explainPlanAttributes.getServerWhereFilter());
 
             if (localIndex) {
-                assertEquals(fullTableName, explainPlanAttributes.getTableName());
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
+                        explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
@@ -575,7 +576,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
@@ -609,7 +610,8 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName, explainPlanAttributes.getTableName());
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
+                        explainPlanAttributes.getTableName());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
@@ -676,7 +678,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
@@ -720,7 +722,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             assertEquals("CLIENT MERGE SORT",
                 explainPlanAttributes.getClientSortAlgo());
             if (localIndex) {
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
             } else {
                 assertEquals(fullIndexName,
@@ -793,7 +795,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if(localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
@@ -977,7 +979,8 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
                     explainPlanAttributes.getIteratorTypeAndScanSize());
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(testTable, explainPlanAttributes.getTableName());
+                assertEquals(fullIndexName + "(" + testTable + ")",
+                        explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
@@ -1055,7 +1058,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
             if (localIndex) {
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,'1']", explainPlanAttributes.getKeyRanges());
             } else {
@@ -1096,7 +1099,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
@@ -1228,7 +1231,7 @@ public abstract class BaseIndexIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullTableName,
+                assertEquals(fullIndexName + "(" + fullTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
index de506a775a..2ff2217218 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
@@ -79,7 +79,8 @@ public class GlobalIndexOptimizationIT extends ParallelStatsDisabledIT {
             ResultSet rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
             String expected =
                     "DELETE ROWS CLIENT SELECT\n" +
-                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + dataTableName +" [1,*] - [1,100]\n" +
+                    "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                            indexTableName+"L" + "(" + dataTableName + ") [1,*] - [1,100]\n" +
                     "    SERVER FILTER BY FIRST KEY ONLY\n" +
                     "CLIENT MERGE SORT";
             String actual = QueryUtil.getExplainPlan(rs);
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMaintenanceIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMaintenanceIT.java
index 4354fe003d..3ae8214a73 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMaintenanceIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexMaintenanceIT.java
@@ -162,7 +162,7 @@ public class IndexMaintenanceIT extends ParallelStatsDisabledIT {
             ResultSet rs = stmt.executeQuery("EXPLAIN " + whereSql);
             assertEquals(
                     localIndex ? "CLIENT PARALLEL 1-WAY RANGE SCAN OVER INDEX_TEST."
-                            + dataTableName
+                            + indexName + "(" + fullDataTableName + ")"
                             + " [1,'VARCHAR1_CHAR1     _A.VARCHAR1_B.CHAR1   ',3,'2015-01-02 00:00:00.000',1,420,156,800,000,1,420,156,800,000]\nCLIENT MERGE SORT"
                             : "CLIENT PARALLEL 1-WAY RANGE SCAN OVER INDEX_TEST." + indexName + " ['VARCHAR1_CHAR1     _A.VARCHAR1_B.CHAR1   ',3,'2015-01-02 00:00:00.000',1,420,156,800,000,1,420,156,800,000]",
                     QueryUtil.getExplainPlan(rs));
@@ -183,8 +183,10 @@ public class IndexMaintenanceIT extends ParallelStatsDisabledIT {
                     + "from "
                     + fullDataTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + indexSelectSql);
-            assertEquals(localIndex ? "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullDataTableName
-                    + " [1]\nCLIENT MERGE SORT" : "CLIENT PARALLEL 1-WAY FULL SCAN OVER INDEX_TEST." + indexName,
+            assertEquals(localIndex ?
+                            "CLIENT PARALLEL 1-WAY RANGE SCAN OVER INDEX_TEST." + indexName +
+                                    "(" + fullDataTableName + ") [1]\nCLIENT MERGE SORT"
+                            : "CLIENT PARALLEL 1-WAY FULL SCAN OVER INDEX_TEST." + indexName,
                     QueryUtil.getExplainPlan(rs));
             rs = conn.createStatement().executeQuery(indexSelectSql);
             verifyResult(rs, 1);
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexUsageIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexUsageIT.java
index aa22f7df54..87583416bf 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexUsageIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/IndexUsageIT.java
@@ -150,7 +150,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullDataTableName,
+                assertEquals("INDEX_TEST." + indexName + "(" + fullDataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals("CLIENT MERGE SORT",
                     explainPlanAttributes.getClientSortAlgo());
@@ -221,7 +221,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [TO_BIGINT(\"(A.INT_COL1 + 1)\")]",
                 explainPlanAttributes.getServerAggregate());
             if (localIndex) {
-                assertEquals(fullDataTableName,
+                assertEquals("INDEX_TEST." + indexName + "(" + fullDataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,0] - [1,*]",
                     explainPlanAttributes.getKeyRanges());
@@ -292,7 +292,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
             if (localIndex) {
-                assertEquals(fullDataTableName,
+                assertEquals("INDEX_TEST." + indexName + "(" + fullDataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,2]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
@@ -361,7 +361,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullDataTableName,
+                assertEquals("INDEX_TEST." + indexName + "(" + fullDataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1]", explainPlanAttributes.getKeyRanges());
                 assertEquals("CLIENT MERGE SORT",
@@ -445,7 +445,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
             if (localIndex) {
-                assertEquals(dataTableName,
+                assertEquals(indexName + "(" + dataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,'x_1']",
                     explainPlanAttributes.getKeyRanges());
@@ -481,7 +481,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(dataTableName,
+                assertEquals(indexName + "(" + dataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1]",
                     explainPlanAttributes.getKeyRanges());
@@ -571,7 +571,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             if (localIndex) {
                 assertEquals("RANGE SCAN ",
                     explainPlanAttributes.getExplainScanType());
-                assertEquals(fullDataTableName,
+                assertEquals("INDEX_TEST." + indexName + "(" + fullDataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,2]",
                     explainPlanAttributes.getKeyRanges());
@@ -639,7 +639,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
             if (local) {
-                assertEquals(dataTableName,
+                assertEquals(indexName1 + "(" + dataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,173]",
                     explainPlanAttributes.getKeyRanges());
@@ -676,7 +676,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
             if (local) {
-                assertEquals(dataTableName,
+                assertEquals(indexName2 + "(" + dataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [" + (2) + ",'foo2_bar2']",
                     explainPlanAttributes.getKeyRanges());
@@ -860,7 +860,7 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
             if (localIndex) {
-                assertEquals(dataTableName,
+                assertEquals(indexName + "(" + dataTableName + ")",
                     explainPlanAttributes.getTableName());
                 assertEquals(" [1,'id:id1']",
                     explainPlanAttributes.getKeyRanges());
@@ -938,11 +938,13 @@ public class IndexUsageIT extends ParallelStatsDisabledIT {
             rs = conn.createStatement().executeQuery("EXPLAIN "+query);
             String explainPlan = QueryUtil.getExplainPlan(rs);
             if (localIndex) {
-            	assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1,'1David']\n" + 
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        indexName + "(" + tableName + ") [1,'1David']\n" +
                         "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                         "CLIENT MERGE SORT\n" +
                         "    PARALLEL LEFT-JOIN TABLE 0 (SKIP MERGE)\n" +
-                        "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1]\n" + 
+                        "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        indexName + "(" + tableName + ") [1]\n" +
                         "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                         "        CLIENT MERGE SORT", explainPlan);
             }
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
index e034f21033..6aa61cd7b0 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
@@ -386,6 +386,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testUseUncoveredLocalIndexWithPrefix() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -422,7 +423,8 @@ public class LocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
         assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-        assertEquals(indexPhysicalTableName, explainPlanAttributes.getTableName());
+        assertEquals( fullIndexName+ "(" + indexPhysicalTableName + ")",
+                explainPlanAttributes.getTableName());
         assertEquals(" [1,3,4]", explainPlanAttributes.getKeyRanges());
         assertEquals("SERVER FILTER BY FIRST KEY ONLY",
                 explainPlanAttributes.getServerWhereFilter());
@@ -454,7 +456,8 @@ public class LocalIndexIT extends BaseLocalIndexIT {
                 explainPlanAttributes.getIteratorTypeAndScanSize());
         assertEquals("RANGE SCAN ",
                 explainPlanAttributes.getExplainScanType());
-        assertEquals(physicalTableName.toString(), explainPlanAttributes.getTableName());
+        assertEquals(fullIndexName+ "(" + indexPhysicalTableName + ")",
+                explainPlanAttributes.getTableName());
         assertEquals(" [1,3,4,3]", explainPlanAttributes.getKeyRanges());
         assertEquals("[0.V3]", explainPlanAttributes.getServerMergeColumns().toString());
         assertEquals("SERVER FILTER BY FIRST KEY ONLY AND \"V3\" = 1",
@@ -467,6 +470,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testUseUncoveredLocalIndexWithSplitPrefix() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -485,7 +489,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         ResultSet rs = conn.createStatement().executeQuery("EXPLAIN SELECT pk1, pk2, pk3, v1 FROM " + tableName + " WHERE pk1 = 2 AND pk3 = 3");
         assertEquals(
             "CLIENT PARALLEL 16-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1,2,3]\n"
+                    + fullIndexName +  "(" + indexPhysicalTableName + ") [1,2,3]\n"
                     + "    SERVER MERGE [0.V1]\n"
                     + "    SERVER FILTER BY FIRST KEY ONLY\n"
                     + "CLIENT MERGE SORT",
@@ -497,6 +501,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testUseUncoveredLocalIndex() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -514,7 +519,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         ResultSet rs = conn.createStatement().executeQuery("EXPLAIN SELECT COUNT(*) FROM " + tableName);
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1]\n"
                             + "    SERVER FILTER BY FIRST KEY ONLY\n"
                             + "    SERVER AGGREGATE INTO SINGLE ROW",
                     QueryUtil.getExplainPlan(rs));
@@ -531,7 +536,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + tableName + " ORDER BY v2");
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1]\n"
                             + "    SERVER MERGE [0.V1]\n"
                             + "    SERVER FILTER BY FIRST KEY ONLY\n"
                             + "CLIENT MERGE SORT",
@@ -552,7 +557,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + tableName + " WHERE v2 = 2 ORDER BY v3");
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1,2]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1,2]\n"
                             + "    SERVER MERGE [0.V1]\n"
                             + "    SERVER FILTER BY FIRST KEY ONLY\n"
                             + "CLIENT MERGE SORT",
@@ -581,7 +586,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + tableName + " WHERE v2 = 2");
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1,2]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1,2]\n"
                             + "    SERVER MERGE [0.V1]\n"
                             + "    SERVER FILTER BY FIRST KEY ONLY\n"
                             + "CLIENT MERGE SORT",
@@ -592,7 +597,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + tableName + " WHERE v2 = 2 AND v4 = 4");
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1,2]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1,2]\n"
                             + "    SERVER MERGE [0.V1]\n"
                             + "    SERVER FILTER BY FIRST KEY ONLY AND TO_INTEGER(\"V4\") = 4\n"
                             + "CLIENT MERGE SORT",
@@ -603,7 +608,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
         rs = conn.createStatement().executeQuery("EXPLAIN SELECT * FROM " + tableName + " WHERE v2 = 2 AND v1 = 3");
         assertEquals(
             "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "
-                    + indexPhysicalTableName + " [1,2]\n"
+                    + fullIndexName + "(" + indexPhysicalTableName + ") [1,2]\n"
                     + "    SERVER MERGE [0.V1]\n"
                     + "    SERVER FILTER BY FIRST KEY ONLY AND \"V1\" = 3.0\n"
                     + "CLIENT MERGE SORT",
@@ -794,6 +799,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testLocalIndexUsedForUncoveredOrderBy() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -814,7 +820,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
 
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
-                        + indexPhysicalTableName + " [1]\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1]\n"
                                 + "    SERVER MERGE [0.K3]\n"
                                 + "    SERVER FILTER BY FIRST KEY ONLY\n"
                                 + "CLIENT MERGE SORT",
@@ -837,7 +843,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
             rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY REVERSE RANGE SCAN OVER "
-                        + indexPhysicalTableName + " [1]\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1]\n"
                                 + "    SERVER MERGE [0.K3]\n"
                                 + "    SERVER FILTER BY FIRST KEY ONLY\n"
                                 + "CLIENT MERGE SORT",
@@ -863,6 +869,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testLocalIndexReverseScanShouldReturnAllRows() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
 
@@ -883,7 +890,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
 
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY REVERSE RANGE SCAN OVER "
-                        + indexPhysicalTableName + " [1]\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1]\n"
                                 + "    SERVER FILTER BY FIRST KEY ONLY\n"
                                 + "CLIENT MERGE SORT",
                         QueryUtil.getExplainPlan(rs));
@@ -908,6 +915,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
     public void testLocalIndexScanJoinColumnsFromDataTable() throws Exception {
         String tableName = schemaName + "." + generateUniqueName();
         String indexName = "IDX_" + generateUniqueName();
+        String fullIndexName = SchemaUtil.getTableName(schemaName, indexName);
         String indexTableName = schemaName + "." + indexName;
         TableName physicalTableName = SchemaUtil.getPhysicalTableName(tableName.getBytes(), isNamespaceMapped);
         String indexPhysicalTableName = physicalTableName.getNameAsString();
@@ -933,7 +941,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
             
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
-                        + indexPhysicalTableName + " [1,'a']\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1,'a']\n"
                                 + "    SERVER MERGE [0.K3]\n"
                                 + "    SERVER FILTER BY FIRST KEY ONLY\n"
                                 + "CLIENT MERGE SORT",
@@ -957,7 +965,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
             
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
-                        + indexPhysicalTableName +" [1,*] - [1,'z']\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1,*] - [1,'z']\n"
                         + "    SERVER MERGE [0.K3]\n"
                         + "    SERVER FILTER BY FIRST KEY ONLY\n"
                          + "CLIENT MERGE SORT",
@@ -994,7 +1002,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
             
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
-                        + indexPhysicalTableName +" [1,*] - [1,'z']\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1,*] - [1,'z']\n"
                         + "    SERVER MERGE [0.K3]\n"
                         + "    SERVER FILTER BY FIRST KEY ONLY\n"
                         + "    SERVER AGGREGATE INTO DISTINCT ROWS BY [\"V1\", \"T_ID\", \"K3\"]\nCLIENT MERGE SORT",
@@ -1023,7 +1031,7 @@ public class LocalIndexIT extends BaseLocalIndexIT {
             rs = conn1.createStatement().executeQuery("EXPLAIN " + query);
             assertEquals(
                 "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
-                        + indexPhysicalTableName +" [1,*] - [1,'z']\n"
+                        + fullIndexName + "(" + indexPhysicalTableName + ") [1,*] - [1,'z']\n"
                         + "    SERVER MERGE [0.K3]\n"
                         + "    SERVER FILTER BY FIRST KEY ONLY\n"
                         + "    SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"V1\"]\nCLIENT MERGE SORT",
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
index 49cd642cd9..9cd415ad09 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexFailureIT.java
@@ -509,8 +509,9 @@ public class MutableIndexFailureIT extends BaseTest {
         ResultSet rs = conn.createStatement().executeQuery(query);
         String expectedPlan = " OVER "
                 + (localIndex
-                        ? Bytes.toString(
-                                SchemaUtil.getPhysicalTableName(fullTableName.getBytes(), isNamespaceMapped).getName())
+                        ? fullIndexName + "(" + Bytes.toString(
+                                SchemaUtil.getPhysicalTableName(fullTableName.getBytes(),
+                                        isNamespaceMapped).getName()) + ")"
                         : SchemaUtil.getPhysicalTableName(fullIndexName.getBytes(), isNamespaceMapped).getNameAsString());
         String explainPlan = QueryUtil.getExplainPlan(conn.createStatement().executeQuery("EXPLAIN " + query));
         assertTrue(explainPlan, explainPlan.contains(expectedPlan));
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
index e6dd5fc90b..49e5ea706f 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
@@ -116,7 +116,9 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             String query = "SELECT char_col1, int_col1, long_col2 from " + fullTableName;
             ResultSet rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if (localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName +" [1]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                        "(" + fullTableName + ") [1]\nCLIENT MERGE SORT",
+                        QueryUtil.getExplainPlan(rs));
             } else {
                 assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullIndexName, QueryUtil.getExplainPlan(rs));
             }
@@ -183,7 +185,8 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             if(localIndex) {
                 query = "SELECT b.* from " + fullTableName + " where int_col1 = 4 AND char_col1 = 'chara'";
                 rs = conn.createStatement().executeQuery("EXPLAIN " + query);
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName +" [1,'chara',4]\n" +
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                                "(" + fullTableName + ") [1,'chara',4]\n" +
                         "    SERVER MERGE [B.VARCHAR_COL2, B.CHAR_COL2, B.INT_COL2, B.DECIMAL_COL2, B.DATE_COL]\n" +
                         "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
                 rs = conn.createStatement().executeQuery(query);
@@ -284,7 +287,9 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             query = "SELECT * FROM " + fullTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if(localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName+" [1]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));            
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                        "(" + fullTableName + ") [1]\nCLIENT MERGE SORT",
+                        QueryUtil.getExplainPlan(rs));
             } else {
                 assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullIndexName, QueryUtil.getExplainPlan(rs));
             }
@@ -305,7 +310,9 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             query = "SELECT * FROM " + fullTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if(localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName + " [1]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));            
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        fullIndexName + "(" + fullTableName + ") [1]\nCLIENT MERGE SORT",
+                        QueryUtil.getExplainPlan(rs));
             } else {
                 assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullIndexName, QueryUtil.getExplainPlan(rs));
             }
@@ -326,7 +333,9 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             query = "SELECT * FROM " + fullTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if(localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName+" [1]\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));            
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                        "(" + fullTableName + ") [1]\nCLIENT MERGE SORT",
+                        QueryUtil.getExplainPlan(rs));
             } else {
                 assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER " + fullIndexName, QueryUtil.getExplainPlan(rs));
             }
@@ -394,7 +403,8 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             query = "SELECT * FROM " + fullTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if (localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName+" [1]\n"
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                        "(" + fullTableName + ") [1]\n"
                         + "    SERVER FILTER BY FIRST KEY ONLY\n"
                         + "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
             } else {
@@ -521,7 +531,8 @@ public class MutableIndexIT extends ParallelStatsDisabledIT {
             query = "SELECT * FROM " + fullTableName;
             rs = conn.createStatement().executeQuery("EXPLAIN " + query);
             if(localIndex) {
-                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullTableName+" [1]\n"
+                assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName +
+                                "(" + fullTableName + ") [1]\n"
                         + "    SERVER FILTER BY FIRST KEY ONLY\n"
                         + "CLIENT MERGE SORT",
                     QueryUtil.getExplainPlan(rs));
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
index ea9c2c6c04..974f30ca19 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/ViewIndexIT.java
@@ -200,6 +200,7 @@ public class ViewIndexIT extends SplitSystemCatalogIT {
 		String indexName = "IND_" + generateUniqueName();
         String fullTableName = SchemaUtil.getTableName(SCHEMA1, tableName);
         String fullViewName = SchemaUtil.getTableName(SCHEMA2, generateUniqueName());
+        String fullIndexName = SchemaUtil.getTableName(SCHEMA2, indexName);
 
         try (Connection conn = getConnection();
              Connection conn1 = getTenantConnection("10")) {
@@ -248,7 +249,9 @@ public class ViewIndexIT extends SplitSystemCatalogIT {
             String sql = "SELECT * FROM " + fullViewName + " WHERE v2 = 100";
             ResultSet rs = conn1.prepareStatement("EXPLAIN " + sql).executeQuery();
             assertEquals(
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + SchemaUtil.getPhysicalTableName(Bytes.toBytes(fullTableName), isNamespaceMapped) + " [1,'10',100]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + fullIndexName + "(" +
+                        SchemaUtil.getPhysicalTableName(Bytes.toBytes(fullTableName),
+                                 isNamespaceMapped) + ") [1,'10',100]\n" +
                     "    SERVER MERGE [0.V1]\n" +
                     "    SERVER FILTER BY FIRST KEY ONLY\n" +
                     "CLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
index a06ac84fd9..4e429cb279 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/txn/TxWriteFailureIT.java
@@ -172,7 +172,8 @@ public class TxWriteFailureIT extends BaseTest {
         rs = conn.createStatement().executeQuery("EXPLAIN "+indexSql);
         if(localIndex) {
             assertEquals(
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + dataTableFullName + " [1]\n" + 
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexFullName +
+                        "(" + dataTableFullName + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "CLIENT MERGE SORT",
                 QueryUtil.getExplainPlan(rs));
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/BaseJoinIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/BaseJoinIT.java
index 92bd585d4e..c800bd4570 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/BaseJoinIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/BaseJoinIT.java
@@ -57,6 +57,16 @@ public abstract class BaseJoinIT extends ParallelStatsDisabledIT {
     protected static final String JOIN_SUPPLIER_TABLE_FULL_NAME = '"' + JOIN_SCHEMA + "\".\"" + JOIN_SUPPLIER_TABLE + '"';
     protected static final String JOIN_COITEM_TABLE_FULL_NAME = '"' + JOIN_SCHEMA + "\".\"" + JOIN_COITEM_TABLE + '"';
 
+    protected static final String JOIN_CUSTOMER_INDEX = "IDX_CUSTOMER";
+    protected static final String JOIN_ITEM_INDEX = "IDX_ITEM";
+    protected static final String JOIN_SUPPLIER_INDEX = "IDX_SUPPLIER";
+    protected static final String JOIN_CUSTOMER_INDEX_FULL_NAME =
+            SchemaUtil.getTableName(JOIN_SCHEMA, JOIN_CUSTOMER_INDEX);
+    protected static final String JOIN_ITEM_INDEX_FULL_NAME =
+            SchemaUtil.getTableName(JOIN_SCHEMA, JOIN_ITEM_INDEX);
+    protected static final String JOIN_SUPPLIER_INDEX_FULL_NAME =
+            SchemaUtil.getTableName(JOIN_SCHEMA, JOIN_SUPPLIER_INDEX);
+
     private static final Map<String,String> tableDDLMap;
     
     static {
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/HashJoinLocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/HashJoinLocalIndexIT.java
index 761bc0ee72..f10cf8b09a 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/HashJoinLocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/HashJoinLocalIndexIT.java
@@ -72,9 +72,13 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
         List<Object> testCases = Lists.newArrayList();
         testCases.add(new String[][] {
                 {
-                "CREATE LOCAL INDEX \"idx_customer\" ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
-                "CREATE LOCAL INDEX \"idx_item\" ON " + JOIN_ITEM_TABLE_FULL_NAME + " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
-                "CREATE LOCAL INDEX \"idx_supplier\" ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
+                "CREATE LOCAL INDEX " + JOIN_CUSTOMER_INDEX + " ON " +
+                        JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
+                "CREATE LOCAL INDEX " + JOIN_ITEM_INDEX + " ON " +
+                        JOIN_ITEM_TABLE_FULL_NAME + " (name) " +
+                        "INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
+                "CREATE LOCAL INDEX " + JOIN_SUPPLIER_INDEX + " ON " +
+                        JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
                 }, {
                 /* 
                  * testLeftJoinWithAggregation()
@@ -86,7 +90,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "    SERVER AGGREGATE INTO DISTINCT ROWS BY [\"I.0:NAME\"]\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_ITEM_TABLE_FULL_NAME +" [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT",
                 /* 
@@ -100,7 +105,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "CLIENT MERGE SORT\n" +
                 "CLIENT SORTED BY [SUM(O.QUANTITY) DESC]\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME +" [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT",          
                 /* 
@@ -121,7 +127,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     RIGHT JOIN joinItemTable i ON o.item_id = i.item_id 
                  *     GROUP BY i.name ORDER BY i.name
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME+" [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY [\"I.0:NAME\"]\n" +
                 "CLIENT MERGE SORT\n" + 
@@ -156,11 +163,13 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *         AND (supp.name BETWEEN 'S1' AND 'S5') 
                  *     WHERE item.name BETWEEN 'T1' AND 'T5'
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1,'T1'] - [1,'T5']\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1,'T1'] - [1,'T5']\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME +" [1,'S1'] - [1,'S5']\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1,'S1'] - [1,'S5']\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        CLIENT MERGE SORT",
                 /*
@@ -171,10 +180,13 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     WHERE (item.name = 'T1' OR item.name = 'T5') 
                  *         AND (supp.name = 'S1' OR supp.name = 'S5')
                  */
-                "CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1,'T1'] - [1,'T5']\n" +
+                "CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1,'T1'] - [1,'T5']\n" +
                 "CLIENT MERGE SORT\n" + 
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME +" [1,'S1'] - [1,'S5']\n" + 
+                "        CLIENT PARALLEL 1-WAY SKIP SCAN ON 2 KEYS OVER " +
+                        JOIN_SUPPLIER_INDEX_FULL_NAME + "(" +
+                        JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1,'S1'] - [1,'S5']\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        CLIENT MERGE SORT",
                 /*
@@ -183,13 +195,15 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     JOIN joinOrderTable o ON o.item_id = i.item_id AND quantity < 5000 
                  *     JOIN joinSupplierTable s ON i.supplier_id = s.supplier_id
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "CLIENT MERGE SORT\n" + 
                 "    PARALLEL INNER-JOIN TABLE 0 (SKIP MERGE)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "            SERVER FILTER BY QUANTITY < 5000\n" +
                 "    PARALLEL INNER-JOIN TABLE 1\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        CLIENT MERGE SORT\n" +
                 "    DYNAMIC SERVER FILTER BY \"I.:item_id\" IN (\"O.item_id\")",
@@ -201,7 +215,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  */
                 "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + "\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME +" [1]\n"  +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    DYNAMIC SERVER FILTER BY \"I1.item_id\" IN (\"I2.:item_id\")",
@@ -211,12 +226,14 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     JOIN joinItemTable i2 ON i1.item_id = i2.supplier_id 
                  *     ORDER BY i1.name, i2.name
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME +" [1]\n"  +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    SERVER SORTED BY [\"I1.0:NAME\", \"I2.0:NAME\"]\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME +" [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    DYNAMIC SERVER FILTER BY \"I1.:item_id\" IN (\"I2.0:supplier_id\")",
                 /*
@@ -229,11 +246,13 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  */
                 "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_INDEX_FULL_NAME +
+                        "(" + JOIN_CUSTOMER_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 1\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT",
                 /*
@@ -244,14 +263,17 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     JOIN joinItemTable i ON o.item_id = i.item_id 
                  *     ORDER BY order_id
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    SERVER SORTED BY [\"O.order_id\"]\n"+
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "            PARALLEL INNER-JOIN TABLE 0\n" +
-                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_TABLE_FULL_NAME+" [1]\n"+
+                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        JOIN_CUSTOMER_INDEX_FULL_NAME + "(" +
+                        JOIN_CUSTOMER_TABLE_FULL_NAME + ") [1]\n" +
                 "                    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "                CLIENT MERGE SORT\n" +
                 "    DYNAMIC SERVER FILTER BY \"I.:item_id\" IN (\"O.item_id\")",
@@ -275,7 +297,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "            SERVER FILTER BY \"order_id\" != '000000000000003'\n" +
                 "            PARALLEL INNER-JOIN TABLE 0\n" +
-                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME +" [1]\n" +
+                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        JOIN_ITEM_INDEX_FULL_NAME + "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "                    SERVER FILTER BY \"NAME\" != 'T3'\n" +
                 "                CLIENT MERGE SORT\n" +
                 "                    PARALLEL LEFT-JOIN TABLE 0\n" +
@@ -292,7 +315,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "    SERVER AGGREGATE INTO DISTINCT ROWS BY [I.NAME]\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_ITEM_TABLE_FULL_NAME+" [1]\n"+
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT",
                 /* 
@@ -308,7 +332,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "CLIENT MERGE SORT\n" +
                 "CLIENT SORTED BY [SUM(O.QUANTITY) DESC]\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0 (SKIP MERGE)\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        CLIENT MERGE SORT",
                 /* 
@@ -319,7 +344,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     ON o.iid = i.iid 
                  *     ORDER BY o.q DESC NULLS LAST, i.iid
                  */     
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    SERVER SORTED BY [O.Q DESC NULLS LAST, I.IID]\n"+
                 "CLIENT MERGE SORT\n" +
@@ -335,7 +361,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     ON o.iid = i.iid 
                  *     ORDER BY o.q DESC, i.iid
                  */     
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "    SERVER SORTED BY [O.Q DESC, I.IID]\n"+
                 "CLIENT MERGE SORT\n" +
@@ -369,7 +396,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "            SERVER FILTER BY \"order_id\" != '000000000000003'\n" +
                 "            PARALLEL INNER-JOIN TABLE 0\n" +
-                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +  JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "                CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
+                        JOIN_ITEM_INDEX_FULL_NAME + "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "                    SERVER FILTER BY \"NAME\" != 'T3'\n" +
                 "                CLIENT MERGE SORT\n" +      
                 "                    PARALLEL LEFT-JOIN TABLE 0\n" +
@@ -385,7 +413,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "    SERVER 4 ROW LIMIT\n" +
                 "CLIENT 4 ROW LIMIT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +      
                 "    PARALLEL LEFT-JOIN TABLE 1(DELAYED EVALUATION)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER "+ JOIN_ORDER_TABLE_FULL_NAME + "\n" +
@@ -400,7 +429,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + "\n" +
                 "CLIENT 4 ROW LIMIT\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 1(DELAYED EVALUATION)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER "+ JOIN_ORDER_TABLE_FULL_NAME + "\n" +
@@ -415,7 +445,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     JOIN (SELECT order_id, item_id, quantity FROM joinOrderTable) o
                  *     ON o.item_id = i.item_id;
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "CLIENT MERGE SORT\n" +
                 "CLIENT 4 ROW LIMIT\n" +
@@ -435,7 +466,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "    SERVER 3 ROW LIMIT\n" +
                 "CLIENT 1 ROW LIMIT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +      
                 "    PARALLEL LEFT-JOIN TABLE 1(DELAYED EVALUATION)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER "+ JOIN_ORDER_TABLE_FULL_NAME + "\n" +
@@ -451,7 +483,8 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                 "    SERVER OFFSET 2\n" +
                 "CLIENT 1 ROW LIMIT\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER "+ JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 1(DELAYED EVALUATION)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER "+ JOIN_ORDER_TABLE_FULL_NAME + "\n" +
@@ -464,12 +497,14 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     JOIN joinItemTable i ON s.supplier_id = i.supplier_id 
                  *     WHERE s.name = 'S1' AND i.name < 'T6'
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,'S1']\n" + 
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1,'S1']\n" +
                 "    SERVER MERGE [0.PHONE]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "CLIENT MERGE SORT\n" + 
                 "    PARALLEL INNER-JOIN TABLE 0\n" + 
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1,*] - [1,'T6']\n" + 
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1,*] - [1,'T6']\n" +
                 "        CLIENT MERGE SORT\n" + 
                 "    DYNAMIC SERVER FILTER BY \"S.:supplier_id\" IN (\"I.0:supplier_id\")",
                 
@@ -481,13 +516,15 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     WHERE s.name = 'S1' AND i.name < 'T6' 
                  *     GROUP BY phone
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,'S1']\n" + 
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1,'S1']\n" +
                 "    SERVER MERGE [0.PHONE]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "    SERVER AGGREGATE INTO DISTINCT ROWS BY [\"S.PHONE\"]\n" + 
                 "CLIENT MERGE SORT\n" + 
                 "    PARALLEL INNER-JOIN TABLE 0\n" + 
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1,*] - [1,'T6']\n" + 
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1,*] - [1,'T6']\n" +
                 "        CLIENT MERGE SORT\n" + 
                 "    DYNAMIC SERVER FILTER BY \"S.:supplier_id\" IN (\"I.0:supplier_id\")",
                 
@@ -498,12 +535,14 @@ public class HashJoinLocalIndexIT extends HashJoinIT {
                  *     LEFT JOIN joinItemTable i ON s."supplier_id" = i."supplier_id" AND i.name < 'T6' 
                  *     WHERE s.name <= 'S3'
                  */
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1,*] - [1,'S3']\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1,*] - [1,'S3']\n" +
                 "    SERVER MERGE [0.PHONE]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "    SERVER AGGREGATE INTO SINGLE ROW\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1,*] - [1,'T6']\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1,*] - [1,'T6']\n" +
                 "        CLIENT MERGE SORT",
                 }});
         return testCases;
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SortMergeJoinLocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SortMergeJoinLocalIndexIT.java
index b8ecf509a6..ef31dd6db6 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SortMergeJoinLocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SortMergeJoinLocalIndexIT.java
@@ -54,18 +54,21 @@ public class SortMergeJoinLocalIndexIT extends SortMergeJoinIT {
         List<Object> testCases = Lists.newArrayList();
         testCases.add(new String[][] {
                 {
-                "CREATE LOCAL INDEX \"idx_customer\" ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
-                "CREATE LOCAL INDEX \"idx_item\" ON " + JOIN_ITEM_TABLE_FULL_NAME + " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
-                "CREATE LOCAL INDEX \"idx_supplier\" ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
+                "CREATE LOCAL INDEX " + JOIN_CUSTOMER_INDEX + " ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + "(name)",
+                "CREATE LOCAL INDEX " + JOIN_ITEM_INDEX + " ON " + JOIN_ITEM_TABLE_FULL_NAME + "(name) " +
+                        "INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
+                "CREATE LOCAL INDEX " + JOIN_SUPPLIER_INDEX + " ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
                 }, {
                 "SORT-MERGE-JOIN (LEFT) TABLES\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_SUPPLIER_TABLE_FULL_NAME + " [1]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        SERVER SORTED BY [\"S.:supplier_id\"]\n" +
                 "    CLIENT MERGE SORT\n" +
                 "AND\n" +
                 "    SORT-MERGE-JOIN (INNER) TABLES\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER SORTED BY [\"I.:item_id\"]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    AND (SKIP MERGE)\n" +
@@ -76,7 +79,8 @@ public class SortMergeJoinLocalIndexIT extends SortMergeJoinIT {
                 "    CLIENT SORTED BY [\"I.0:supplier_id\"]",
                 
                 "SORT-MERGE-JOIN (INNER) TABLES\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        SERVER SORTED BY [\"I.:item_id\"]\n" +
                 "    CLIENT MERGE SORT\n" +
@@ -87,12 +91,14 @@ public class SortMergeJoinLocalIndexIT extends SortMergeJoinIT {
                 "CLIENT 4 ROW LIMIT",
                 
                 "SORT-MERGE-JOIN (INNER) TABLES\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        SERVER SORTED BY [\"I1.:item_id\"]\n" +
                 "    CLIENT MERGE SORT\n" +
                 "AND\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        SERVER SORTED BY [\"I2.:item_id\"]\n" +
                 "    CLIENT MERGE SORT"
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java
index 027f0033cc..dd1f4ad9ec 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryIT.java
@@ -191,14 +191,17 @@ public class SubqueryIT extends BaseJoinIT {
                 }});
         testCases.add(new String[][] {
                 {
-                "CREATE LOCAL INDEX \"idx_customer\" ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
-                "CREATE LOCAL INDEX \"idx_item\" ON " + JOIN_ITEM_TABLE_FULL_NAME + " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
-                "CREATE LOCAL INDEX \"idx_supplier\" ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
+                "CREATE LOCAL INDEX " + JOIN_CUSTOMER_INDEX + " ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
+                "CREATE LOCAL INDEX " + JOIN_ITEM_INDEX + " ON " + JOIN_ITEM_TABLE_FULL_NAME + " " +
+                        "(name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
+                "CREATE LOCAL INDEX " + JOIN_SUPPLIER_INDEX + " ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
                 }, {
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL INNER-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "\\(" + JOIN_SUPPLIER_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "        CLIENT MERGE SORT\n" +
                 "    PARALLEL SEMI-JOIN TABLE 1 \\(SKIP MERGE\\)\n" +
@@ -207,12 +210,14 @@ public class SubqueryIT extends BaseJoinIT {
                 "        CLIENT MERGE SORT\n" +
                 "    DYNAMIC SERVER FILTER BY \"I.:item_id\" IN \\(\\$\\d+.\\$\\d+\\)",
                             
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "    SERVER SORTED BY [\"I.0:NAME\"]\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    PARALLEL SEMI-JOIN TABLE 1(DELAYED EVALUATION) (SKIP MERGE)\n" +
                 "        CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
@@ -222,7 +227,8 @@ public class SubqueryIT extends BaseJoinIT {
                 "CLIENT PARALLEL 4-WAY FULL SCAN OVER " + JOIN_COITEM_TABLE_FULL_NAME + "\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 0\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "            SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY \\[\".+.0:NAME\", \".+.:item_id\"\\]\n" +
                 "        CLIENT MERGE SORT\n" + 
@@ -231,7 +237,8 @@ public class SubqueryIT extends BaseJoinIT {
                 "                    SERVER AGGREGATE INTO DISTINCT ROWS BY \\[\"item_id\"\\]\n" +
                 "                CLIENT MERGE SORT\n" +
                 "    PARALLEL LEFT-JOIN TABLE 1\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "            SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY \\[\".+.0:NAME\", \".+.:item_id\"\\]\n" +
                 "        CLIENT MERGE SORT\n" + 
@@ -239,10 +246,12 @@ public class SubqueryIT extends BaseJoinIT {
                 "                CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "                    SERVER AGGREGATE INTO DISTINCT ROWS BY \\[\"item_id\"\\]\n" +
                 "                CLIENT MERGE SORT\n" +
-                "            DYNAMIC SERVER FILTER BY \"" + JOIN_SCHEMA + ".idx_item.:item_id\" IN \\(\\$\\d+.\\$\\d+\\)\n" +
+                "            DYNAMIC SERVER FILTER BY \"" + JOIN_ITEM_INDEX_FULL_NAME +
+                        ".:item_id\" IN \\(\\$\\d+.\\$\\d+\\)\n" +
                 "    AFTER-JOIN SERVER FILTER BY \\(\\$\\d+.\\$\\d+ IS NOT NULL OR \\$\\d+.\\$\\d+ IS NOT NULL\\)",
                 
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" +
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL ANTI-JOIN TABLE 0 (SKIP MERGE)\n" +
@@ -250,11 +259,13 @@ public class SubqueryIT extends BaseJoinIT {
                 "            SERVER AGGREGATE INTO DISTINCT ROWS BY [\"item_id\"]\n" +
                 "        CLIENT MERGE SORT",
                 
-                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_INDEX_FULL_NAME +
+                        "\\(" + JOIN_CUSTOMER_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "    SERVER FILTER BY FIRST KEY ONLY\n" + 
                 "CLIENT MERGE SORT\n" +
                 "    PARALLEL SEMI-JOIN TABLE 0 \\(SKIP MERGE\\)\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "            SERVER AGGREGATE INTO DISTINCT ROWS BY \\[\"O.customer_id\"\\]\n" +
                 "        CLIENT MERGE SORT\n" +
@@ -266,7 +277,8 @@ public class SubqueryIT extends BaseJoinIT {
                 "                CLIENT MERGE SORT\n" +
                 "            DYNAMIC SERVER FILTER BY \"I.:item_id\" IN \\(\"O.item_id\"\\)\n" +
                 "            AFTER-JOIN SERVER FILTER BY \\(\"I.0:NAME\" = 'T2' OR O.QUANTITY > \\$\\d+.\\$\\d+\\)\n" +
-                "    DYNAMIC SERVER FILTER BY \"" + JOIN_SCHEMA + ".idx_customer.:customer_id\" IN \\(\\$\\d+.\\$\\d+\\)"
+                "    DYNAMIC SERVER FILTER BY \"" + JOIN_CUSTOMER_INDEX_FULL_NAME + ".:customer_id\" IN " +
+                        "\\(\\$\\d+.\\$\\d+\\)"
                 }});
         return testCases;
     }
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryUsingSortMergeJoinIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryUsingSortMergeJoinIT.java
index b1f56ed7d6..28e5ffbd1d 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryUsingSortMergeJoinIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/join/SubqueryUsingSortMergeJoinIT.java
@@ -183,17 +183,20 @@ public class SubqueryUsingSortMergeJoinIT extends BaseJoinIT {
                 }});
         testCases.add(new String[][] {
                 {
-                "CREATE LOCAL INDEX \"idx_customer\" ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
-                "CREATE LOCAL INDEX \"idx_item\" ON " + JOIN_ITEM_TABLE_FULL_NAME + " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
-                "CREATE LOCAL INDEX \"idx_supplier\" ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
+                "CREATE LOCAL INDEX " + JOIN_CUSTOMER_INDEX + " ON " + JOIN_CUSTOMER_TABLE_FULL_NAME + " (name)",
+                "CREATE LOCAL INDEX "+ JOIN_ITEM_INDEX + " ON " + JOIN_ITEM_TABLE_FULL_NAME +
+                        " (name) INCLUDE (price, discount1, discount2, \"supplier_id\", description)",
+                "CREATE LOCAL INDEX " + JOIN_SUPPLIER_INDEX + " ON " + JOIN_SUPPLIER_TABLE_FULL_NAME + " (name)"
                 }, {
                 "SORT-MERGE-JOIN (SEMI) TABLES\n" +
                 "    SORT-MERGE-JOIN (INNER) TABLES\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "(" + JOIN_ITEM_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER SORTED BY [\"I.0:supplier_id\"]\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    AND\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_TABLE_FULL_NAME + " [1]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_SUPPLIER_INDEX_FULL_NAME +
+                        "(" + JOIN_SUPPLIER_TABLE_FULL_NAME + ") [1]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "            SERVER SORTED BY [\"S.:supplier_id\"]\n" +
                 "        CLIENT MERGE SORT\n" +
@@ -209,7 +212,8 @@ public class SubqueryUsingSortMergeJoinIT extends BaseJoinIT {
                 "        CLIENT PARALLEL 4-WAY FULL SCAN OVER " + JOIN_COITEM_TABLE_FULL_NAME + "\n" +
                 "        CLIENT MERGE SORT\n" +
                 "    AND\n" +
-                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "        CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "            SERVER FILTER BY FIRST KEY ONLY\n" +
                 "            SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY \\[\".+.0:NAME\", \".+.:item_id\"\\]\n" +
                 "        CLIENT MERGE SORT\n" + 
@@ -220,7 +224,8 @@ public class SubqueryUsingSortMergeJoinIT extends BaseJoinIT {
                 "                CLIENT MERGE SORT\n" +
                 "    CLIENT SORTED BY \\[.*.CO_ITEM_ID, .*.CO_ITEM_NAME\\]\n" +
                 "AND\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY \\[\".+.0:NAME\", \".+.:item_id\"\\]\n" +
                 "    CLIENT MERGE SORT\n" + 
@@ -229,16 +234,19 @@ public class SubqueryUsingSortMergeJoinIT extends BaseJoinIT {
                 "            CLIENT PARALLEL 1-WAY FULL SCAN OVER " + JOIN_ORDER_TABLE_FULL_NAME + "\n" +
                 "                SERVER AGGREGATE INTO DISTINCT ROWS BY \\[\"item_id\"\\]\n" +
                 "            CLIENT MERGE SORT\n" +
-                "        DYNAMIC SERVER FILTER BY \"" + JOIN_SCHEMA + ".idx_item.:item_id\" IN \\(\\$\\d+.\\$\\d+\\)\n" +
+                "        DYNAMIC SERVER FILTER BY \"" + JOIN_ITEM_INDEX_FULL_NAME + ".:item_id\" IN \\(\\$\\d+" +
+                        ".\\$\\d+\\)\n" +
                 "CLIENT FILTER BY \\(\\$\\d+.\\$\\d+ IS NOT NULL OR \\$\\d+.\\$\\d+ IS NOT NULL\\)",
                 
                 "SORT-MERGE-JOIN \\(SEMI\\) TABLES\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_CUSTOMER_INDEX_FULL_NAME +
+                        "\\(" + JOIN_CUSTOMER_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
-                "        SERVER SORTED BY \\[\"Join.idx_customer.:customer_id\"\\]\n" +
+                "        SERVER SORTED BY \\[\"" + JOIN_CUSTOMER_INDEX_FULL_NAME + ".:customer_id\"\\]\n" +
                 "    CLIENT MERGE SORT\n" +
                 "AND \\(SKIP MERGE\\)\n" +
-                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_TABLE_FULL_NAME + " \\[1\\]\n" +
+                "    CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + JOIN_ITEM_INDEX_FULL_NAME +
+                        "\\(" + JOIN_ITEM_TABLE_FULL_NAME + "\\) \\[1\\]\n" +
                 "        SERVER FILTER BY FIRST KEY ONLY\n" +
                 "        SERVER AGGREGATE INTO DISTINCT ROWS BY \\[\"O.customer_id\"\\]\n" +
                 "    CLIENT MERGE SORT\n" +
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java
index 20f5d40ecd..458260ff21 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java
@@ -49,9 +49,11 @@ import org.apache.phoenix.parse.HintNode;
 import org.apache.phoenix.parse.HintNode.Hint;
 import org.apache.phoenix.query.KeyRange;
 import org.apache.phoenix.query.KeyRange.Bound;
+import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.query.QueryServices;
 import org.apache.phoenix.query.QueryServicesOptions;
 import org.apache.phoenix.schema.PColumn;
+import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.RowKeySchema;
 import org.apache.phoenix.schema.SortOrder;
 import org.apache.phoenix.schema.TableRef;
@@ -146,7 +148,20 @@ public abstract class ExplainTable {
             scanTypeDetails = explainSkipScan();
         }
         buf.append(scanTypeDetails);
-        buf.append("OVER ").append(tableRef.getTable().getPhysicalName().getString());
+
+        String tableName = tableRef.getTable().getPhysicalName().getString();
+        if (tableRef.getTable().getIndexType() == PTable.IndexType.LOCAL) {
+            String indexName = tableRef.getTable().getName().getString();
+            if (tableRef.getTable().getViewIndexId() != null
+                    && indexName.contains(QueryConstants.CHILD_VIEW_INDEX_NAME_SEPARATOR)) {
+                int lastIndexOf = indexName.lastIndexOf(
+                        QueryConstants.CHILD_VIEW_INDEX_NAME_SEPARATOR);
+                indexName = indexName.substring(lastIndexOf + 1);
+            }
+            tableName = indexName + "(" + tableName + ")";
+        }
+        buf.append("OVER ").append(tableName);
+
         if (!scanRanges.isPointLookup()) {
             buf.append(appendKeyRanges());
         }
@@ -160,8 +175,7 @@ public abstract class ExplainTable {
                 explainPlanAttributesBuilder.setClientSortedBy("REVERSE");
             }
             explainPlanAttributesBuilder.setExplainScanType(scanTypeDetails);
-            explainPlanAttributesBuilder.setTableName(tableRef.getTable()
-                .getPhysicalName().getString());
+            explainPlanAttributesBuilder.setTableName(tableName);
             if (!scanRanges.isPointLookup()) {
                 explainPlanAttributesBuilder.setKeyRanges(appendKeyRanges());
             }