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,