This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch OptQuery in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit c284e2db7f602e9e167c23186ec0fe8b15a9f073 Author: JackieTien97 <[email protected]> AuthorDate: Mon Mar 17 20:18:20 2025 +0800 Optimize query execution --- .../buffer/TimeSeriesMetadataCache.java | 3 +- .../dataregion/tsfile/TsFileResource.java | 50 ++++++++++++---------- .../tsfile/timeindex/ArrayDeviceTimeIndex.java | 12 ++++-- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/TimeSeriesMetadataCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/TimeSeriesMetadataCache.java index 3fb377fabba..f2cd55c5e7d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/TimeSeriesMetadataCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/buffer/TimeSeriesMetadataCache.java @@ -126,8 +126,8 @@ public class TimeSeriesMetadataCache { queryContext.getQueryStatistics().getLoadBloomFilterActualIOSize()::addAndGet; boolean cacheHit = true; try { - String deviceStringFormat = key.device.toString(); if (!CACHE_ENABLE) { + String deviceStringFormat = key.device.toString(); cacheHit = false; // bloom filter part @@ -158,6 +158,7 @@ public class TimeSeriesMetadataCache { DEBUG_LOGGER.info("Cache miss: {}.{} in file: {}", key.device, key.measurement, filePath); DEBUG_LOGGER.info("Device: {}, all sensors: {}", key.device, allSensors); } + String deviceStringFormat = key.device.toString(); // allow for the parallelism of different devices synchronized ( devices.computeIfAbsent( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java index c1a6e1826f4..a90aaf72474 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java @@ -634,10 +634,10 @@ public class TsFileResource implements PersistentResource { // cannot use FileTimeIndex public long getOrderTimeForSeq(IDeviceID deviceId, boolean ascending) { - if (timeIndex instanceof ArrayDeviceTimeIndex && !definitelyNotContains(deviceId)) { - // checked above - //noinspection OptionalGetWithoutIsPresent - return ascending ? getStartTime(deviceId).get() : getEndTime(deviceId).get(); + if (timeIndex instanceof ArrayDeviceTimeIndex) { + return ascending + ? timeIndex.getStartTime(deviceId).orElse(Long.MIN_VALUE) + : timeIndex.getEndTime(deviceId).orElse(Long.MAX_VALUE); } else { return ascending ? Long.MIN_VALUE : Long.MAX_VALUE; } @@ -645,12 +645,15 @@ public class TsFileResource implements PersistentResource { // can use FileTimeIndex public long getOrderTimeForUnseq(IDeviceID deviceId, boolean ascending) { - if (!definitelyNotContains(deviceId)) { - // checked above - //noinspection OptionalGetWithoutIsPresent - return ascending ? getStartTime(deviceId).get() : getEndTime(deviceId).get(); + if (timeIndex instanceof ArrayDeviceTimeIndex) { + if (ascending) { + return timeIndex.getStartTime(deviceId).orElse(Long.MIN_VALUE); + } else { + return timeIndex.getEndTime(deviceId).orElse(Long.MAX_VALUE); + } } else { - return ascending ? Long.MIN_VALUE : Long.MAX_VALUE; + // FileTimeIndex + return ascending ? getFileStartTime() : getFileEndTime(); } } @@ -1000,21 +1003,22 @@ public class TsFileResource implements PersistentResource { return false; } - // check above - long startTime = getStartTime(deviceId).get(); - long endTime = isClosed() || !isSeq ? getEndTime(deviceId).get() : Long.MAX_VALUE; - if (startTime > endTime) { - // startTime > endTime indicates that there is something wrong with this TsFile. Return false - // directly, or it may lead to infinite loop in GroupByMonthFilter#getTimePointPosition. - LOGGER.warn( - "startTime[{}] of TsFileResource[{}] is greater than its endTime[{}]", - startTime, - this, - endTime); - return false; - } - if (timeFilter != null) { + // check above + long startTime = getStartTime(deviceId).get(); + long endTime = isClosed() || !isSeq ? getEndTime(deviceId).get() : Long.MAX_VALUE; + if (startTime > endTime) { + // startTime > endTime indicates that there is something wrong with this TsFile. Return + // false + // directly, or it may lead to infinite loop in GroupByMonthFilter#getTimePointPosition. + LOGGER.warn( + "startTime[{}] of TsFileResource[{}] is greater than its endTime[{}]", + startTime, + this, + endTime); + return false; + } + boolean res = timeFilter.satisfyStartEndTime(startTime, endTime); if (debug && !res) { DEBUG_LOGGER.info( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java index 7247eb93f61..f8503c79af5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ArrayDeviceTimeIndex.java @@ -375,18 +375,22 @@ public class ArrayDeviceTimeIndex implements ITimeIndex { @Override public Optional<Long> getStartTime(IDeviceID deviceId) { - if (!deviceToIndex.containsKey(deviceId)) { + Integer index = deviceToIndex.get(deviceId); + if (index == null) { return Optional.empty(); + } else { + return Optional.of(startTimes[index]); } - return Optional.of(startTimes[deviceToIndex.get(deviceId)]); } @Override public Optional<Long> getEndTime(IDeviceID deviceId) { - if (!deviceToIndex.containsKey(deviceId)) { + Integer index = deviceToIndex.get(deviceId); + if (index == null) { return Optional.empty(); + } else { + return Optional.of(endTimes[index]); } - return Optional.of(endTimes[deviceToIndex.get(deviceId)]); } @Override
