diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp index 05a91f463ee048..875876d3b17b7f 100644 --- a/be/src/olap/tablet_manager.cpp +++ b/be/src/olap/tablet_manager.cpp @@ -1035,7 +1035,6 @@ void TabletManager::build_all_report_tablets_info(std::map* t_tablet_stat.__set_row_count(tablet_info.row_count); t_tablet_stat.__set_total_version_count(tablet_info.total_version_count); t_tablet_stat.__set_visible_version_count(tablet_info.visible_version_count); - t_tablet_stat.__set_visible_version(tablet_info.version); }; for_each_tablet(handler, filter_all_tablets); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java index 91b8bf1de2db04..8a1feab28507b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java @@ -63,9 +63,7 @@ public class ShowTableStatsStmt extends ShowStmt { new ImmutableList.Builder() .add("table_name") .add("index_name") - .add("analyze_row_count") - .add("report_row_count") - .add("report_row_count_for_nereids") + .add("row_count") .build(); private final TableName tableName; @@ -169,33 +167,37 @@ public long getTableId() { return tableId; } - public ShowResultSet constructResultSet(TableStatsMeta tableStatistic, TableIf table) { + public ShowResultSet constructResultSet(TableStatsMeta tableStatistic) { if (indexName != null) { - return constructIndexResultSet(tableStatistic, table); + return constructIndexResultSet(tableStatistic); } - return constructTableResultSet(tableStatistic, table); + return constructTableResultSet(tableStatistic); } public ShowResultSet constructEmptyResultSet() { return new ShowResultSet(getMetaData(), new ArrayList<>()); } - public ShowResultSet constructTableResultSet(TableStatsMeta tableStatistic, TableIf table) { + public ShowResultSet constructResultSet(long rowCount) { + List> result = Lists.newArrayList(); + List row = Lists.newArrayList(); + row.add(""); + row.add(""); + row.add(String.valueOf(rowCount)); + row.add(""); + row.add(""); + row.add(""); + row.add(""); + row.add(""); + result.add(row); + return new ShowResultSet(getMetaData(), result); + } + + public ShowResultSet constructTableResultSet(TableStatsMeta tableStatistic) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); if (tableStatistic == null) { - List> result = Lists.newArrayList(); - List row = Lists.newArrayList(); - row.add(""); - row.add(""); - row.add(String.valueOf(table.getCachedRowCount())); - row.add(""); - row.add(""); - row.add(""); - row.add(""); - row.add(""); - result.add(row); - return new ShowResultSet(getMetaData(), result); + return new ShowResultSet(getMetaData(), new ArrayList<>()); } - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List> result = Lists.newArrayList(); List row = Lists.newArrayList(); row.add(String.valueOf(tableStatistic.updatedRows)); @@ -214,7 +216,7 @@ public ShowResultSet constructTableResultSet(TableStatsMeta tableStatistic, Tabl return new ShowResultSet(getMetaData(), result); } - public ShowResultSet constructIndexResultSet(TableStatsMeta tableStatistic, TableIf table) { + public ShowResultSet constructIndexResultSet(TableStatsMeta tableStatistic) { List> result = Lists.newArrayList(); if (!(table instanceof OlapTable)) { return new ShowResultSet(getMetaData(), result); @@ -224,13 +226,14 @@ public ShowResultSet constructIndexResultSet(TableStatsMeta tableStatistic, Tabl if (indexId == null) { throw new RuntimeException(String.format("Index %s not exist.", indexName)); } - long rowCount = tableStatistic == null ? -1 : tableStatistic.getRowCount(olapTable.getIndexIdByName(indexName)); + long rowCount = tableStatistic.getRowCount(olapTable.getIndexIdByName(indexName)); + if (rowCount == -1) { + return new ShowResultSet(getMetaData(), result); + } List row = Lists.newArrayList(); row.add(table.getName()); row.add(indexName); row.add(String.valueOf(rowCount)); - row.add(String.valueOf(olapTable.getRowCountForIndex(indexId, false))); - row.add(String.valueOf(olapTable.getRowCountForIndex(indexId, true))); result.add(row); return new ShowResultSet(getMetaData(), result); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java index 4b70d96c28a49f..094aebc6fc3008 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java @@ -73,8 +73,6 @@ public enum IndexExtState { @SerializedName(value = "rollupFinishedVersion") private long rollupFinishedVersion; - private boolean rowCountReported = false; - public MaterializedIndex() { this.state = IndexState.NORMAL; this.idToTablets = new HashMap<>(); @@ -208,14 +206,6 @@ public int getTabletOrderIdx(long tabletId) { return -1; } - public void setRowCountReported(boolean reported) { - this.rowCountReported = reported; - } - - public boolean getRowCountReported() { - return this.rowCountReported; - } - @Override public void write(DataOutput out) throws IOException { super.write(out); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index 413dbdddccc440..e048ae8ede877a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -1396,17 +1396,18 @@ public List> getColumnIndexPairs(Set columns) { @Override public long fetchRowCount() { - return getRowCountForIndex(baseIndexId, false); + long rowCount = 0; + for (Map.Entry entry : idToPartition.entrySet()) { + rowCount += entry.getValue().getBaseIndex().getRowCount(); + } + return rowCount; } - public long getRowCountForIndex(long indexId, boolean strict) { + public long getRowCountForIndex(long indexId) { long rowCount = 0; for (Map.Entry entry : idToPartition.entrySet()) { MaterializedIndex index = entry.getValue().getIndex(indexId); - if (strict && !index.getRowCountReported()) { - return -1; - } - rowCount += (index == null || index.getRowCount() == -1) ? 0 : index.getRowCount(); + rowCount += index == null ? 0 : index.getRowCount(); } return rowCount; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java index c0e153f6cee66c..f6b2944d7541c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java @@ -164,8 +164,6 @@ public enum ReplicaStatus { private long userDropTime = -1; - private long lastReportVersion = 0; - public Replica() { } @@ -813,12 +811,4 @@ public boolean isScheduleAvailable() { return Env.getCurrentSystemInfo().checkBackendScheduleAvailable(backendId) && !isUserDrop(); } - - public void setLastReportVersion(long version) { - this.lastReportVersion = version; - } - - public long getLastReportVersion() { - return lastReportVersion; - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java index fef57f37b5bcf1..896ecac6f8ef05 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java @@ -118,41 +118,17 @@ protected void runAfterCatalogReady() { long version = partition.getVisibleVersion(); for (MaterializedIndex index : partition.getMaterializedIndices(IndexExtState.VISIBLE)) { long indexRowCount = 0L; - boolean indexReported = true; for (Tablet tablet : index.getTablets()) { long tabletRowCount = 0L; - boolean tabletReported = false; for (Replica replica : tablet.getReplicas()) { - LOG.debug("Table {} replica {} current version {}, report version {}", - olapTable.getName(), replica.getId(), - replica.getVersion(), replica.getLastReportVersion()); if (replica.checkVersionCatchUp(version, false) - && replica.getRowCount() >= tabletRowCount) { - // 1. If replica version and reported replica version are all equal to - // PARTITION_INIT_VERSION, set tabletReported to true, which indicates this - // tablet is empty for sure when previous report. - // 2. If last report version is larger than PARTITION_INIT_VERSION, set - // tabletReported to true as well. That is, we only guarantee all replicas of - // the tablet are reported for the init version. - // e.g. When replica version is 2, but last reported version is 1, - // tabletReported would be false. - if (replica.getVersion() == Partition.PARTITION_INIT_VERSION - && replica.getLastReportVersion() == Partition.PARTITION_INIT_VERSION - || replica.getLastReportVersion() > Partition.PARTITION_INIT_VERSION) { - tabletReported = true; - } + && replica.getRowCount() > tabletRowCount) { tabletRowCount = replica.getRowCount(); } } indexRowCount += tabletRowCount; - // Only when all tablets of this index are reported, we set indexReported to true. - indexReported = indexReported && tabletReported; } // end for tablets - index.setRowCountReported(indexReported); index.setRowCount(indexRowCount); - LOG.debug("Table {} index {} all tablets reported[{}], row count {}", - olapTable.getName(), olapTable.getIndexNameById(index.getId()), - indexReported, indexRowCount); } // end for indices } // end for partitions if (LOG.isDebugEnabled()) { @@ -181,9 +157,6 @@ private void updateTabletStat(Long beId, TTabletStatResult result) { replica.setTotalVersionCount(stat.getTotalVersionCount()); replica.setVisibleVersionCount(stat.isSetVisibleVersionCount() ? stat.getVisibleVersionCount() : stat.getTotalVersionCount()); - // Older version BE doesn't set visible version. Set it to max for compatibility. - replica.setLastReportVersion(stat.isSetVisibleVersion() ? stat.getVisibleVersion() - : Long.MAX_VALUE); } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index 94878f0533b378..7652e8bb2bb549 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -2520,12 +2520,19 @@ private void handleShowTableStats() { if (tableStats == null) { resultSet = showTableStatsStmt.constructEmptyResultSet(); } else { - resultSet = showTableStatsStmt.constructResultSet(tableStats, tableIf); + resultSet = showTableStatsStmt.constructResultSet(tableStats); } return; } TableStatsMeta tableStats = Env.getCurrentEnv().getAnalysisManager().findTableStatsStatus(tableIf.getId()); - resultSet = showTableStatsStmt.constructResultSet(tableStats, tableIf); + /* + tableStats == null means it's not analyzed, in this case show the estimated row count. + */ + if (tableStats == null) { + resultSet = showTableStatsStmt.constructResultSet(tableIf.getCachedRowCount()); + } else { + resultSet = showTableStatsStmt.constructResultSet(tableStats); + } } private void handleShowColumnStats() throws AnalysisException { diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java index 6121dfd83ebb13..204b60cfd03afb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java @@ -640,7 +640,7 @@ public void dropStats(DropStatsStmt dropStatsStmt) throws DdlException { if (tableStats == null) { return; } - invalidateLocalStats(catalogId, dbId, tblId, dropStatsStmt.isAllColumns() ? null : cols, tableStats); + invalidateLocalStats(catalogId, dbId, tblId, cols, tableStats); // Drop stats ddl is master only operation. invalidateRemoteStats(catalogId, dbId, tblId, cols, dropStatsStmt.isAllColumns()); StatisticsRepository.dropStatisticsByColNames(catalogId, dbId, tblId, cols); @@ -655,7 +655,7 @@ public void dropStats(TableIf table) throws DdlException { long dbId = table.getDatabase().getId(); long tableId = table.getId(); Set cols = table.getSchemaAllIndexes(false).stream().map(Column::getName).collect(Collectors.toSet()); - invalidateLocalStats(catalogId, dbId, tableId, null, tableStats); + invalidateLocalStats(catalogId, dbId, tableId, cols, tableStats); // Drop stats ddl is master only operation. invalidateRemoteStats(catalogId, dbId, tableId, cols, true); StatisticsRepository.dropStatisticsByColNames(catalogId, dbId, table.getId(), cols); @@ -717,8 +717,6 @@ public void invalidateLocalStats(long catalogId, long dbId, long tableId, // To remove stale column name that is changed before. if (allColumn) { tableStats.removeAllColumn(); - tableStats.clearIndexesRowCount(); - removeTableStats(tableId); } tableStats.updatedTime = 0; tableStats.userInjected = false; diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java index 7f96c52e81b248..e9bc9afbe26f2a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java @@ -102,7 +102,7 @@ protected void doSample() throws Exception { List tabletIds = pair.first; long totalRowCount = info.indexId == -1 ? tbl.getRowCount() - : ((OlapTable) tbl).getRowCountForIndex(info.indexId, false); + : ((OlapTable) tbl).getRowCountForIndex(info.indexId); double scaleFactor = (double) totalRowCount / (double) pair.second; // might happen if row count in fe metadata hasn't been updated yet if (Double.isInfinite(scaleFactor) || Double.isNaN(scaleFactor)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java index f2af3e88274cdb..aa3d1e6a4e53a4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java @@ -95,7 +95,7 @@ public class TableStatsMeta implements Writable, GsonPostProcessable { public boolean userInjected; @SerializedName("irc") - private ConcurrentMap indexesRowCount = new ConcurrentHashMap<>(); + public ConcurrentMap indexesRowCount = new ConcurrentHashMap<>(); @VisibleForTesting public TableStatsMeta() { @@ -212,10 +212,6 @@ public long getRowCount(long indexId) { return indexesRowCount.getOrDefault(indexId, -1L); } - public void clearIndexesRowCount() { - indexesRowCount.clear(); - } - private void clearStaleIndexRowCount(OlapTable table) { Iterator iterator = indexesRowCount.keySet().iterator(); List indexIds = table.getIndexIds(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java index e7794769754840..38514aff8d6e64 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java @@ -2102,9 +2102,6 @@ private boolean updateCatalogAfterVisible(TransactionState transactionState, Dat } } replica.updateVersionWithFailed(newVersion, lastFailedVersion, lastSuccessVersion); - if (newVersion == Partition.PARTITION_INIT_VERSION + 1) { - index.setRowCountReported(false); - } Set partitionIds = backendPartitions.get(replica.getBackendId()); if (partitionIds == null) { partitionIds = Sets.newHashSet(); diff --git a/gensrc/thrift/BackendService.thrift b/gensrc/thrift/BackendService.thrift index 6a5e4035066fd2..4714b38b4c9eab 100644 --- a/gensrc/thrift/BackendService.thrift +++ b/gensrc/thrift/BackendService.thrift @@ -37,7 +37,6 @@ struct TTabletStat { 4: optional i64 total_version_count 5: optional i64 remote_data_size 6: optional i64 visible_version_count - 7: optional i64 visible_version } struct TTabletStatResult { diff --git a/regression-test/suites/statistics/analyze_stats.groovy b/regression-test/suites/statistics/analyze_stats.groovy index 50ba18e97b84d7..09a8ecbcad32ea 100644 --- a/regression-test/suites/statistics/analyze_stats.groovy +++ b/regression-test/suites/statistics/analyze_stats.groovy @@ -2753,7 +2753,7 @@ PARTITION `p599` VALUES IN (599) assertEquals("true", alter_result[0][7]) sql """drop stats alter_test""" alter_result = sql """show table stats alter_test""" - assertEquals("", alter_result[0][7]) + assertEquals("false", alter_result[0][7]) sql """alter table alter_test modify column id set stats ('row_count'='100', 'ndv'='0', 'num_nulls'='0.0', 'data_size'='2.69975443E8', 'min_value'='1', 'max_value'='2');""" alter_result = sql """show column stats alter_test(id)""" logger.info("show column alter_test(id) stats: " + alter_result) diff --git a/regression-test/suites/statistics/test_analyze_mv.groovy b/regression-test/suites/statistics/test_analyze_mv.groovy index add93f2a95adef..d5acedf61472c5 100644 --- a/regression-test/suites/statistics/test_analyze_mv.groovy +++ b/regression-test/suites/statistics/test_analyze_mv.groovy @@ -126,17 +126,6 @@ suite("test_analyze_mv") { "replication_num" = "1" ) """ - def result_row - if (!isCloudMode()) { - // Test row count report and report for nereids - result_row = sql """show index stats mvTestDup mvTestDup""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mvTestDup", result_row[0][1]) - assertEquals("0", result_row[0][3]) - assertEquals("-1", result_row[0][4]) - } - createMV("create materialized view mv1 as select key1 from mvTestDup;") createMV("create materialized view mv2 as select key2 from mvTestDup;") createMV("create materialized view mv3 as select key1, key2, sum(value1), max(value2), min(value3) from mvTestDup group by key1, key2;") @@ -145,7 +134,7 @@ suite("test_analyze_mv") { sql """analyze table mvTestDup with sync;""" // Test show index row count - result_row = sql """show index stats mvTestDup mvTestDup""" + def result_row = sql """show index stats mvTestDup mvTestDup""" assertEquals(1, result_row.size()) assertEquals("mvTestDup", result_row[0][0]) assertEquals("mvTestDup", result_row[0][1]) @@ -474,35 +463,6 @@ suite("test_analyze_mv") { logger.info(e.getMessage()); return; } - - if (!isCloudMode()) { - // Test row count report and report for nereids - result_row = sql """show index stats mvTestDup mvTestDup""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mvTestDup", result_row[0][1]) - assertEquals("6", result_row[0][3]) - assertEquals("6", result_row[0][4]) - result_row = sql """show index stats mvTestDup mv1""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv1", result_row[0][1]) - assertEquals("6", result_row[0][3]) - assertEquals("6", result_row[0][4]) - result_row = sql """show index stats mvTestDup mv2""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv2", result_row[0][1]) - assertEquals("6", result_row[0][3]) - assertEquals("6", result_row[0][4]) - result_row = sql """show index stats mvTestDup mv3""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv3", result_row[0][1]) - assertEquals("4", result_row[0][3]) - assertEquals("4", result_row[0][4]) - } - sql """analyze table mvTestDup with sample rows 4000000""" wait_analyze_finish("mvTestDup") result_sample = sql """SHOW ANALYZE mvTestDup;""" @@ -650,38 +610,6 @@ suite("test_analyze_mv") { verifyTaskStatus(result_sample, "mva_MIN__`value3`", "mv3") verifyTaskStatus(result_sample, "mva_SUM__CAST(`value1` AS bigint)", "mv3") - if (!isCloudMode()) { - // Test row count report and report for nereids - sql """truncate table mvTestDup""" - result_row = sql """show index stats mvTestDup mv3""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv3", result_row[0][1]) - assertEquals("0", result_row[0][3]) - assertEquals("-1", result_row[0][4]) - - for (int i = 0; i < 120; i++) { - result_row = sql """show index stats mvTestDup mv3""" - logger.info("mv3 stats: " + result_row) - if (result_row[0][4] == "0") { - break; - } - Thread.sleep(5000) - } - result_row = sql """show index stats mvTestDup mv3""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv3", result_row[0][1]) - assertEquals("0", result_row[0][3]) - assertEquals("0", result_row[0][4]) - sql """insert into mvTestDup values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 3001, 4001, 5001);""" - result_row = sql """show index stats mvTestDup mv3""" - assertEquals(1, result_row.size()) - assertEquals("mvTestDup", result_row[0][0]) - assertEquals("mv3", result_row[0][1]) - assertEquals("-1", result_row[0][4]) - } - // Test alter column stats sql """drop stats mvTestDup""" sql """alter table mvTestDup modify column key1 set stats ('ndv'='1', 'num_nulls'='1', 'min_value'='10', 'max_value'='40', 'row_count'='50');"""