You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/11/24 07:53:22 UTC

[iotdb] 03/03: optimize performance

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

rong pushed a commit to branch xianyi
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit d8a91709305490925ed80562ee79a90f9910e8e9
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Wed Nov 24 15:52:05 2021 +0800

    optimize performance
---
 .../main/java/org/apache/iotdb/SessionExample.java | 67 +++++++---------------
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 59 +++++++++++++++++--
 2 files changed, 75 insertions(+), 51 deletions(-)

diff --git a/example/session/src/main/java/org/apache/iotdb/SessionExample.java b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
index cab736d..ba80fac 100644
--- a/example/session/src/main/java/org/apache/iotdb/SessionExample.java
+++ b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
@@ -21,7 +21,6 @@ package org.apache.iotdb;
 
 import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.session.Session;
 import org.apache.iotdb.session.SessionDataSet;
 import org.apache.iotdb.session.SessionDataSet.DataIterator;
@@ -62,18 +61,18 @@ public class SessionExample {
     // set session fetchSize
     session.setFetchSize(10000);
 
-    try {
-      session.setStorageGroup("root.sg1");
-    } catch (StatementExecutionException e) {
-      if (e.getStatusCode() != TSStatusCode.PATH_ALREADY_EXIST_ERROR.getStatusCode()) {
-        throw e;
-      }
-    }
+    //    try {
+    //      session.setStorageGroup("root.sg1");
+    //    } catch (StatementExecutionException e) {
+    //      if (e.getStatusCode() != TSStatusCode.PATH_ALREADY_EXIST_ERROR.getStatusCode()) {
+    //        throw e;
+    //      }
+    //    }
 
     // createTemplate();
-    createTimeseries();
-    createMultiTimeseries();
-    insertRecord();
+    //    createTimeseries();
+    //    createMultiTimeseries();
+    //    insertRecord();
     insertTablet();
     //    insertTabletWithNullValues();
     //    insertTablets();
@@ -90,16 +89,16 @@ public class SessionExample {
     //    deleteTimeseries();
     //    setTimeout();
 
-    sessionEnableRedirect = new Session(LOCAL_HOST, 6667, "root", "root");
-    sessionEnableRedirect.setEnableQueryRedirection(true);
-    sessionEnableRedirect.open(false);
-
-    // set session fetchSize
-    sessionEnableRedirect.setFetchSize(10000);
-
-    insertRecord4Redirect();
-    query4Redirect();
-    sessionEnableRedirect.close();
+    //    sessionEnableRedirect = new Session(LOCAL_HOST, 6667, "root", "root");
+    //    sessionEnableRedirect.setEnableQueryRedirection(true);
+    //    sessionEnableRedirect.open(false);
+    //
+    //    // set session fetchSize
+    //    sessionEnableRedirect.setFetchSize(10000);
+    //
+    //    insertRecord4Redirect();
+    //    query4Redirect();
+    //    sessionEnableRedirect.close();
     session.close();
   }
 
@@ -393,7 +392,7 @@ public class SessionExample {
     // Method 1 to add tablet data
     long timestamp = System.currentTimeMillis();
 
-    for (long row = 0; row < 100; row++) {
+    for (long row = 0; row < 1000; row++) {
       int rowIndex = tablet.rowSize++;
       tablet.addTimestamp(rowIndex, timestamp);
       for (int s = 0; s < 3; s++) {
@@ -404,29 +403,7 @@ public class SessionExample {
         session.insertTablet(tablet, true);
         tablet.reset();
       }
-      timestamp++;
-    }
-
-    if (tablet.rowSize != 0) {
-      session.insertTablet(tablet);
-      tablet.reset();
-    }
-
-    // Method 2 to add tablet data
-    long[] timestamps = tablet.timestamps;
-    Object[] values = tablet.values;
-
-    for (long time = 0; time < 100; time++) {
-      int row = tablet.rowSize++;
-      timestamps[row] = time;
-      for (int i = 0; i < 3; i++) {
-        long[] sensor = (long[]) values[i];
-        sensor[row] = i;
-      }
-      if (tablet.rowSize == tablet.getMaxRowNumber()) {
-        session.insertTablet(tablet, true);
-        tablet.reset();
-      }
+      timestamp += 3600 * 1000;
     }
 
     if (tablet.rowSize != 0) {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 9ca4fd0..93fe754 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -950,12 +950,7 @@ public class TSServiceImpl extends BasicServiceProvider implements TSIService.If
     final SelectIntoPlan selectIntoPlan = (SelectIntoPlan) physicalPlan;
     final QueryPlan queryPlan = selectIntoPlan.getQueryPlan();
 
-    if (queryPlan instanceof UDTFPlan
-        && queryPlan
-            .getResultColumns()
-            .get(0)
-            .getExpression()
-            .isTimeSeriesGeneratingFunctionExpression()
+    if (shouldSplit(queryPlan)
     //        && ((FunctionExpression) queryPlan.getResultColumns().get(0).getExpression())
     //            .getFunctionName()
     //            .equalsIgnoreCase("en")
@@ -991,6 +986,58 @@ public class TSServiceImpl extends BasicServiceProvider implements TSIService.If
     }
   }
 
+  boolean shouldSplit(QueryPlan queryPlan) {
+    if (!(queryPlan instanceof UDTFPlan)) {
+      return false;
+    }
+
+    if (!queryPlan
+        .getResultColumns()
+        .get(0)
+        .getExpression()
+        .isTimeSeriesGeneratingFunctionExpression()) {
+      return false;
+    }
+
+    UDTFPlan udtfPlan = (UDTFPlan) queryPlan;
+    IExpression iExpression = udtfPlan.getExpression();
+    if (iExpression instanceof GlobalTimeExpression) {
+      GlobalTimeExpression globalTimeExpression = (GlobalTimeExpression) iExpression;
+      if (globalTimeExpression.getFilter() instanceof AndFilter) {
+        AndFilter andFilter = (AndFilter) globalTimeExpression.getFilter();
+
+        if ((andFilter.getLeft() instanceof Lt || andFilter.getLeft() instanceof LtEq)
+            && (andFilter.getRight() instanceof Gt || andFilter.getRight() instanceof GtEq)) {
+          Filter filter = andFilter.getLeft();
+          andFilter.setLeft(andFilter.getRight());
+          andFilter.setRight(filter);
+        }
+
+        final long dayTimeDelta = 24 * 60 * 60 * 1000;
+
+        long left = 0, right = 0;
+        if (andFilter.getLeft() instanceof Gt) {
+          left = (long) ((Gt) andFilter.getLeft()).getValue();
+        }
+        if (andFilter.getLeft() instanceof GtEq) {
+          left = (long) ((GtEq) andFilter.getLeft()).getValue();
+        }
+        if (andFilter.getRight() instanceof Lt) {
+          right = (long) ((Lt) andFilter.getRight()).getValue();
+        }
+        if (andFilter.getRight() instanceof LtEq) {
+          right = (long) ((LtEq) andFilter.getRight()).getValue();
+        }
+
+        if (right - left > dayTimeDelta) {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+
   private TSExecuteStatementResp executeSelectIntoStatementXianyi(
       UDTFPlan udtfPlan,
       TSServiceImpl tsService,