You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2017/11/15 18:35:03 UTC

[35/40] phoenix git commit: PHOENIX-4333 Test to demonstrate partial stats information for tenant views

PHOENIX-4333 Test to demonstrate partial stats information for tenant views


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/0e97de5a
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/0e97de5a
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/0e97de5a

Branch: refs/heads/4.x-HBase-1.2
Commit: 0e97de5ab44e28208f923cd3946602e5f755271c
Parents: f8274c6
Author: Samarth Jain <sa...@apache.org>
Authored: Tue Oct 31 14:14:56 2017 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Wed Nov 15 10:02:14 2017 -0800

----------------------------------------------------------------------
 .../end2end/ExplainPlanWithStatsEnabledIT.java  | 95 ++++++++++++++++++++
 1 file changed, 95 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/0e97de5a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java
index 931c398..25d4194 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ExplainPlanWithStatsEnabledIT.java
@@ -31,6 +31,7 @@ import java.sql.SQLException;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.phoenix.jdbc.PhoenixConnection;
 import org.apache.phoenix.query.BaseTest;
@@ -782,4 +783,98 @@ public class ExplainPlanWithStatsEnabledIT extends ParallelStatsEnabledIT {
             this.time += t;
         }
     }
+
+    @Test
+    public void testPartialStatsForTenantViews() throws Exception {
+        String tenant1View = generateUniqueName();
+        String tenant2View = generateUniqueName();
+        String multiTenantTable = generateUniqueName();
+        String tenantId1 = "00Dabcdetenant1";
+        String tenantId2 = "00Dabcdetenant2";
+
+        String ddl =
+                "CREATE TABLE " + multiTenantTable
+                        + " (orgId CHAR(15) NOT NULL, pk2 CHAR(3) NOT NULL, a bigint, b bigint CONSTRAINT PK PRIMARY KEY "
+                        + "(ORGID, PK2)) MULTI_TENANT=true, GUIDE_POSTS_WIDTH=20";
+        createTestTable(getUrl(), ddl, null, null);
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            // split such that some data for view2 resides on region of view1
+            try (HBaseAdmin admin =
+                    conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin()) {
+                byte[] splitKey = Bytes.toBytes("00Dabcdetenant200B");
+                admin.split(Bytes.toBytes(multiTenantTable), splitKey);
+            }
+
+            /**
+             * Insert 2 rows for tenant1 and 6 for tenant2
+             */
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId1 + "','00A',1,1)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId1 + "','00B',2,2)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00A',3,3)");
+            // We split at tenant2 + 00B. So the following rows will reside in a different region
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00B',4,4)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00C',5,5)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00D',6,6)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00E',7,7)");
+            conn.createStatement().execute(
+                "upsert into " + multiTenantTable + " values ('" + tenantId2 + "','00F',8,8)");
+            conn.commit();
+        }
+        try (Connection conn = getTenantConnection(tenantId1)) {
+            conn.createStatement().execute(
+                "CREATE VIEW " + tenant1View + " AS SELECT * FROM " + multiTenantTable);
+        }
+        try (Connection conn = getTenantConnection(tenantId2)) {
+            conn.createStatement().execute(
+                "CREATE VIEW " + tenant2View + " AS SELECT * FROM " + multiTenantTable);
+        }
+        String sql = "";
+        List<Object> binds = Lists.newArrayList();
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            /*
+             * I have seen compaction running and generating stats for the second region of
+             * tenant2View So let's disable compaction on the table, delete any stats we have
+             * collected in SYSTEM.STATS table, clear cache and run update stats to make sure our
+             * test gets a deterministic setup.
+             */
+            String disableCompaction =
+                    "ALTER TABLE " + multiTenantTable + " SET COMPACTION_ENABLED = false";
+            conn.createStatement().executeUpdate(disableCompaction);
+            String delete =
+                    "DELETE FROM SYSTEM.STATS WHERE PHYSICAL_NAME = '" + multiTenantTable + "'";
+            conn.createStatement().executeUpdate(delete);
+            conn.commit();
+            conn.unwrap(PhoenixConnection.class).getQueryServices().clearCache();
+        }
+        // Now let's run update stats on tenant1View
+        try (Connection conn = getTenantConnection(tenantId1)) {
+            conn.createStatement().execute("UPDATE STATISTICS " + tenant1View);
+        }
+        // query tenant2 view
+        try (Connection conn = getTenantConnection(tenantId2)) {
+            sql = "SELECT * FROM " + tenant2View;
+
+            Estimate info = getByteRowEstimates(conn, sql, binds);
+            /*
+             * Because we ran update stats only for tenant1View, there is only partial guidepost
+             * info available for tenant2View.
+             */
+            assertEquals((Long) 1l, info.estimatedRows);
+            // ok now run update stats for tenant2 view
+            conn.createStatement().execute("UPDATE STATISTICS " + tenant2View);
+            /*
+             * And now, let's recheck our estimate info. We should have all the rows of view2
+             * available now.
+             */
+            info = getByteRowEstimates(conn, sql, binds);
+            assertEquals((Long) 6l, info.estimatedRows);
+        }
+    }
 }