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

morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 74690cec927 [improvement](statistics)Optimize drop stats operation 
(#30202)
74690cec927 is described below

commit 74690cec9274d3a6ce068ca99f7ba10c57c50ae7
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Mon Jan 22 13:30:18 2024 +0800

    [improvement](statistics)Optimize drop stats operation (#30202)
    
    Before, drop stats operation need to call columns * followers times of 
isMaster() function and the same times of rpc to drop remote column stats. This 
pr is to reduce the rpc calls and use more efficient way to check master node 
instead of using isMaster()
    
    backport #30144
---
 .../org/apache/doris/analysis/DropStatsStmt.java   | 19 +++++++++++++
 .../apache/doris/service/FrontendServiceImpl.java  |  2 +-
 .../apache/doris/statistics/AnalysisManager.java   | 33 ++++++++++++++--------
 .../doris/statistics/InvalidateStatsTarget.java    | 16 +++++++++--
 4 files changed, 55 insertions(+), 15 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java
index ac08f01f31e..5e3bd20c0f1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java
@@ -53,7 +53,10 @@ public class DropStatsStmt extends DdlStmt {
     private Set<String> columnNames;
     // Flag to drop external table row count in table_statistics.
     private boolean dropTableRowCount;
+    private boolean isAllColumns;
 
+    private long catalogId;
+    private long dbId;
     private long tblId;
 
     public DropStatsStmt(boolean dropExpired) {
@@ -100,10 +103,13 @@ public class DropStatsStmt extends DdlStmt {
         DatabaseIf db = catalog.getDbOrAnalysisException(dbName);
         TableIf table = db.getTableOrAnalysisException(tblName);
         tblId = table.getId();
+        dbId = db.getId();
+        catalogId = catalog.getId();
         // check permission
         checkAnalyzePriv(db.getFullName(), table.getName());
         // check columnNames
         if (columnNames != null) {
+            isAllColumns = false;
             for (String cName : columnNames) {
                 if (table.getColumn(cName) == null) {
                     ErrorReport.reportAnalysisException(
@@ -115,6 +121,7 @@ public class DropStatsStmt extends DdlStmt {
                 }
             }
         } else {
+            isAllColumns = true;
             columnNames = 
table.getColumns().stream().map(Column::getName).collect(Collectors.toSet());
         }
     }
@@ -123,10 +130,22 @@ public class DropStatsStmt extends DdlStmt {
         return tblId;
     }
 
+    public long getDbId() {
+        return dbId;
+    }
+
+    public long getCatalogIdId() {
+        return catalogId;
+    }
+
     public Set<String> getColumnNames() {
         return columnNames;
     }
 
+    public boolean isAllColumns() {
+        return isAllColumns;
+    }
+
     public boolean dropTableRowCount() {
         return dropTableRowCount;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java 
b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index 198fdf1d10a..69d71dc814f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -3097,7 +3097,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         if (tableStats == null) {
             return new TStatus(TStatusCode.OK);
         }
-        analysisManager.invalidateLocalStats(target.tableId, target.columns, 
tableStats);
+        analysisManager.invalidateLocalStats(target.catalogId, target.dbId, 
target.tableId, target.columns, tableStats);
         return new TStatus(TStatusCode.OK);
     }
 
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 742afe2957f..1bc6da5a6c2 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
@@ -653,14 +653,16 @@ public class AnalysisManager implements Writable {
         }
 
         Set<String> cols = dropStatsStmt.getColumnNames();
+        long catalogId = dropStatsStmt.getCatalogIdId();
+        long dbId = dropStatsStmt.getDbId();
         long tblId = dropStatsStmt.getTblId();
         TableStatsMeta tableStats = 
findTableStatsStatus(dropStatsStmt.getTblId());
         if (tableStats == null) {
             return;
         }
-        invalidateLocalStats(tblId, cols, tableStats);
+        invalidateLocalStats(catalogId, dbId, tblId, cols, tableStats);
         // Drop stats ddl is master only operation.
-        invalidateRemoteStats(tblId, cols);
+        invalidateRemoteStats(catalogId, dbId, tblId, cols, 
dropStatsStmt.isAllColumns());
         StatisticsRepository.dropStatistics(tblId, cols);
     }
 
@@ -669,30 +671,37 @@ public class AnalysisManager implements Writable {
         if (tableStats == null) {
             return;
         }
+        long catalogId = table.getDatabase().getCatalog().getId();
+        long dbId = table.getDatabase().getId();
+        long tableId = table.getId();
         Set<String> cols = 
table.getBaseSchema().stream().map(Column::getName).collect(Collectors.toSet());
-        invalidateLocalStats(table.getId(), cols, tableStats);
+        invalidateLocalStats(catalogId, dbId, tableId, cols, tableStats);
         // Drop stats ddl is master only operation.
-        invalidateRemoteStats(table.getId(), cols);
+        invalidateRemoteStats(catalogId, dbId, tableId, cols, true);
         StatisticsRepository.dropStatistics(table.getId(), cols);
     }
 
-    public void invalidateLocalStats(long tableId, Set<String> columns, 
TableStatsMeta tableStats) {
+    public void invalidateLocalStats(long catalogId, long dbId, long tableId,
+                                     Set<String> columns, TableStatsMeta 
tableStats) {
         if (tableStats == null) {
             return;
         }
         StatisticsCache statisticsCache = 
Env.getCurrentEnv().getStatisticsCache();
-        if (columns != null) {
-            for (String column : columns) {
-                tableStats.removeColumn(column);
-                statisticsCache.invalidate(tableId, -1, column);
-            }
+        if (columns == null) {
+            TableIf table = StatisticsUtil.findTable(catalogId, dbId, tableId);
+            columns = 
table.getBaseSchema().stream().map(Column::getName).collect(Collectors.toSet());
+        }
+        for (String column : columns) {
+            tableStats.removeColumn(column);
+            statisticsCache.invalidate(tableId, -1, column);
         }
         tableStats.updatedTime = 0;
         tableStats.userInjected = false;
     }
 
-    public void invalidateRemoteStats(long tableId, Set<String> columns) {
-        InvalidateStatsTarget target = new InvalidateStatsTarget(tableId, 
columns);
+    public void invalidateRemoteStats(long catalogId, long dbId, long tableId,
+                                      Set<String> columns, boolean 
isAllColumns) {
+        InvalidateStatsTarget target = new InvalidateStatsTarget(catalogId, 
dbId, tableId, columns, isAllColumns);
         TInvalidateFollowerStatsCacheRequest request = new 
TInvalidateFollowerStatsCacheRequest();
         request.key = GsonUtils.GSON.toJson(target);
         StatisticsCache statisticsCache = 
Env.getCurrentEnv().getStatisticsCache();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/InvalidateStatsTarget.java
 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/InvalidateStatsTarget.java
index 1ee7b745048..e49048f8946 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/InvalidateStatsTarget.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/InvalidateStatsTarget.java
@@ -23,14 +23,26 @@ import java.util.Set;
 
 public class InvalidateStatsTarget {
 
+    @SerializedName("catalogId")
+    public final long catalogId;
+
+    @SerializedName("dbId")
+    public final long dbId;
+
     @SerializedName("tableId")
     public final long tableId;
 
     @SerializedName("columns")
     public final Set<String> columns;
 
-    public InvalidateStatsTarget(long tableId, Set<String> columns) {
+    public InvalidateStatsTarget(long catalogId, long dbId, long tableId, 
Set<String> columns, boolean isAllColumns) {
+        this.catalogId = catalogId;
+        this.dbId = dbId;
         this.tableId = tableId;
-        this.columns = columns;
+        if (isAllColumns) {
+            this.columns = null;
+        } else {
+            this.columns = columns;
+        }
     }
 }


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

Reply via email to