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

lijibing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ff165e6bf1 [fix](statistics)Partition stats support truncate single 
partition. (#36758)
4ff165e6bf1 is described below

commit 4ff165e6bf1ff5ee41b8ffe0e39f853e56ad278c
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Tue Jun 25 10:25:34 2024 +0800

    [fix](statistics)Partition stats support truncate single partition. (#36758)
    
    Partition stats support truncate single partition. When truncate single
    partition, drop the stats of this partition and trigger auto analyze in
    next round.
---
 .../apache/doris/datasource/InternalCatalog.java   |  8 +--
 .../apache/doris/statistics/AnalysisManager.java   | 13 ++--
 .../suites/statistics/test_partition_stats.groovy  | 79 ++++++++++++++++++++++
 3 files changed, 92 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 685e0f5e8c2..d349b725770 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -44,6 +44,7 @@ import org.apache.doris.analysis.KeysDesc;
 import org.apache.doris.analysis.LiteralExpr;
 import org.apache.doris.analysis.PartitionDesc;
 import org.apache.doris.analysis.PartitionKeyDesc;
+import org.apache.doris.analysis.PartitionNames;
 import org.apache.doris.analysis.QueryStmt;
 import org.apache.doris.analysis.RecoverDbStmt;
 import org.apache.doris.analysis.RecoverPartitionStmt;
@@ -3439,10 +3440,9 @@ public class InternalCatalog implements 
CatalogIf<Database> {
 
         erasePartitionDropBackendReplicas(oldPartitions);
 
-        if (truncateEntireTable) {
-            // Drop the whole table stats after truncate the entire table
-            Env.getCurrentEnv().getAnalysisManager().dropStats(olapTable);
-        }
+        PartitionNames partitionNames = truncateEntireTable ? null
+                : new PartitionNames(false, 
tblRef.getPartitionNames().getPartitionNames());
+        Env.getCurrentEnv().getAnalysisManager().dropStats(olapTable, 
partitionNames);
         
Env.getCurrentEnv().getAnalysisManager().updateUpdatedRows(updateRecords, 
db.getId(), olapTable.getId());
         LOG.info("finished to truncate table {}, partitions: {}", 
tblRef.getName().toSql(), tblRef.getPartitionNames());
     }
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 d2deade518d..22bc11971c2 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
@@ -668,7 +668,7 @@ public class AnalysisManager implements Writable {
         StatisticsRepository.dropStatistics(catalogId, dbId, tblId, cols, 
partitions);
     }
 
-    public void dropStats(TableIf table) throws DdlException {
+    public void dropStats(TableIf table, PartitionNames partitionNames) throws 
DdlException {
         TableStatsMeta tableStats = findTableStatsStatus(table.getId());
         if (tableStats == null) {
             return;
@@ -676,10 +676,15 @@ public class AnalysisManager implements Writable {
         long catalogId = table.getDatabase().getCatalog().getId();
         long dbId = table.getDatabase().getId();
         long tableId = table.getId();
-        invalidateLocalStats(catalogId, dbId, tableId, null, tableStats, null);
+        invalidateLocalStats(catalogId, dbId, tableId, null, tableStats, 
partitionNames);
         // Drop stats ddl is master only operation.
-        invalidateRemoteStats(catalogId, dbId, tableId, null, null);
-        StatisticsRepository.dropStatistics(catalogId, dbId, table.getId(), 
null, null);
+        Set<String> partitions = null;
+        if (partitionNames != null && !partitionNames.isStar() && 
partitionNames.getPartitionNames() != null) {
+            partitions = new HashSet<>(partitionNames.getPartitionNames());
+        }
+        // Drop stats ddl is master only operation.
+        invalidateRemoteStats(catalogId, dbId, tableId, null, partitions);
+        StatisticsRepository.dropStatistics(catalogId, dbId, table.getId(), 
null, partitions);
     }
 
     public void invalidateLocalStats(long catalogId, long dbId, long tableId, 
Set<String> columns,
diff --git a/regression-test/suites/statistics/test_partition_stats.groovy 
b/regression-test/suites/statistics/test_partition_stats.groovy
index 1f4962d941d..02815c3235c 100644
--- a/regression-test/suites/statistics/test_partition_stats.groovy
+++ b/regression-test/suites/statistics/test_partition_stats.groovy
@@ -736,6 +736,85 @@ suite("test_partition_stats") {
     result = sql """show column stats part7 partition(*)"""
     assertEquals(27, result.size())
 
+    // Test truncate table
+    sql """truncate table part7 partition(p1)"""
+    result = sql """show table stats part7 partition(*)"""
+    assertEquals(2, result.size())
+    assertNotEquals('p1', result[0][0])
+    assertNotEquals('p1', result[1][0])
+    result = sql """show column stats part7 partition(p1)"""
+    assertEquals(0, result.size())
+    result = sql """show column cached stats part7 partition(p1)"""
+    assertEquals(0, result.size())
+    result = sql """show column stats part7 partition(p2)"""
+    assertEquals(9, result.size())
+    result = sql """show column stats part7 partition(p3)"""
+    assertEquals(9, result.size())
+
+    sql """Insert into part7 values (7, 7, 7, 7, 7, 7, 7.7, 7.7, 7.7)"""
+    result = sql """show table stats part7 partition(p1)"""
+    assertEquals(1, result.size())
+    assertEquals("p1", result[0][0])
+    assertEquals("1", result[0][1])
+    sql """analyze table part7 properties("use.auto.analyzer"="true")"""
+    result = sql """show column stats part7"""
+    assertEquals(9, result.size())
+    assertEquals("17.0", result[0][2])
+    assertEquals("17.0", result[1][2])
+    assertEquals("17.0", result[2][2])
+    assertEquals("17.0", result[3][2])
+    assertEquals("17.0", result[4][2])
+    assertEquals("17.0", result[5][2])
+    assertEquals("17.0", result[6][2])
+    assertEquals("17.0", result[7][2])
+    assertEquals("17.0", result[8][2])
+    result = sql """show column cached stats part7"""
+    assertEquals(9, result.size())
+    assertEquals("17.0", result[0][2])
+    assertEquals("17.0", result[1][2])
+    assertEquals("17.0", result[2][2])
+    assertEquals("17.0", result[3][2])
+    assertEquals("17.0", result[4][2])
+    assertEquals("17.0", result[5][2])
+    assertEquals("17.0", result[6][2])
+    assertEquals("17.0", result[7][2])
+    assertEquals("17.0", result[8][2])
+    result = sql """show column stats part7 partition(p1)"""
+    assertEquals(9, result.size())
+    result = sql """show column cached stats part7 partition(p1)"""
+    assertEquals(9, result.size())
+
+    sql """truncate table part7"""
+    result = sql """show table stats part7 partition(*)"""
+    assertEquals(0, result.size())
+    result = sql """show column stats part7"""
+    assertEquals(0, result.size())
+    result = sql """show column cached stats part7"""
+    assertEquals(0, result.size())
+    sql """analyze table part7 properties("use.auto.analyzer"="true")"""
+    result = sql """show column stats part7"""
+    assertEquals(9, result.size())
+    assertEquals("0.0", result[0][2])
+    assertEquals("0.0", result[1][2])
+    assertEquals("0.0", result[2][2])
+    assertEquals("0.0", result[3][2])
+    assertEquals("0.0", result[4][2])
+    assertEquals("0.0", result[5][2])
+    assertEquals("0.0", result[6][2])
+    assertEquals("0.0", result[7][2])
+    assertEquals("0.0", result[8][2])
+    result = sql """show column cached stats part7"""
+    assertEquals(9, result.size())
+    assertEquals("0.0", result[0][2])
+    assertEquals("0.0", result[1][2])
+    assertEquals("0.0", result[2][2])
+    assertEquals("0.0", result[3][2])
+    assertEquals("0.0", result[4][2])
+    assertEquals("0.0", result[5][2])
+    assertEquals("0.0", result[6][2])
+    assertEquals("0.0", result[7][2])
+    assertEquals("0.0", result[8][2])
+
     sql """drop database test_partition_stats"""
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to