ANALYZE 语句

ANALYZE 语句被用于为存在的表收集统计信息,并将统计信息写入该表的 catalog 中。当前版本中,ANALYZE 语句只支持 ANALYZE TABLE, 且只能由用户手动触发。

注意 现在, ANALYZE TABLE 只支持批模式(Batch Mode),且只能用于已存在的表, 如果表不存在或者是视图(View)则会报错。

执行 ANALYZE TABLE 语句

Java

可以使用 TableEnvironmentexecuteSql() 方法执行 ANALYZE TABLE 语句。

以下示例展示了如何在 TableEnvironment 中执行一条 ANALYZE TABLE 语句。

Scala

可以使用 TableEnvironmentexecuteSql() 方法执行 ANALYZE TABLE 语句。

以下示例展示了如何在 TableEnvironment 中执行一条 ANALYZE TABLE 语句。

Python

可以使用 TableEnvironmentexecute_sql() 方法执行 ANALYZE TABLE 语句。

以下示例展示了如何在 TableEnvironment 中执行一条 ANALYZE TABLE 语句。

SQL CLI

ANALYZE TABLE 语句可以在 SQL CLI 中执行。

以下示例展示了如何在 SQL CLI 中执行一条 ANALYZE TABLE 语句。

Java

  1. TableEnvironment tableEnv = TableEnvironment.create(...);
  2. // 注册名为 “Store” 的非分区表
  3. tableEnv.executeSql(
  4. "CREATE TABLE Store (" +
  5. " `id` BIGINT NOT NULl," +
  6. " `location` VARCHAR(32)," +
  7. " `owner` VARCHAR(32)" +
  8. ") with (...)");
  9. // 注册名为 “Orders” 的分区表
  10. tableEnv.executeSql(
  11. "CREATE TABLE Orders (" +
  12. " `id` BIGINT NOT NULl," +
  13. " `product` VARCHAR(32)," +
  14. " `amount` INT," +
  15. " `sold_year` BIGINT," +
  16. " `sold_month` BIGINT," +
  17. " `sold_day` BIGINT" +
  18. ") PARTITIONED BY (`sold_year`, `sold_month`, `sold_day`) "
  19. ") with (...)");
  20. // 非分区表,收集表级别的统计信息(表的统计信息主要为行数(row count))。
  21. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS");
  22. // 非分区表,收集表级别的统计信息和所有列的列统计信息。
  23. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR ALL COLUMNS");
  24. // 非分区表,收集表级别的统计信息和指定列(列: location)的列统计信息。
  25. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR COLUMNS location");
  26. // 假设分区表 “Orders” 有 4 个分区,分区信息如下:
  27. // Partition1 : (sold_year='2022', sold_month='1', sold_day='10')
  28. // Partition2 : (sold_year='2022', sold_month='1', sold_day='11')
  29. // Partition3 : (sold_year='2022', sold_month='2', sold_day='10')
  30. // Partition4 : (sold_year='2022', sold_month='2', sold_day='11')
  31. // 分区表,收集分区 Partition1 的表级别统计信息。
  32. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS");
  33. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息。
  34. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS");
  35. // 分区表,为所有分区收集表级别统计信息。
  36. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS");
  37. // 分区表,收集分区 Partition1 的表级别统计信息和所有列的统计信息。
  38. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR ALL COLUMNS");
  39. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和所有列统计信息。
  40. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  41. // 分区表,为所有分区收集表级别统计信息和所有列的统计信息。
  42. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  43. // 分区表,收集分区 Partition1 的表级别统计信息和分区中指定列(列: amount)的列统计信息。
  44. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR COLUMNS amount");
  45. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和分区中指定列(列: amount,列: product)的列统计信息。
  46. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");
  47. // 分区表,收集所有分区的表级别统计信息和指定列(列: amount,列: product)的列统计信息。
  48. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");

Scala

  1. val tableEnv = TableEnvironment.create(...)
  2. // 注册名为 “Store” 的非分区表
  3. tableEnv.executeSql(
  4. "CREATE TABLE Store (" +
  5. " `id` BIGINT NOT NULl," +
  6. " `location` VARCHAR(32)," +
  7. " `owner` VARCHAR(32)" +
  8. ") with (...)");
  9. // 注册名为 “Orders” 的分区表
  10. tableEnv.executeSql(
  11. "CREATE TABLE Orders (" +
  12. " `id` BIGINT NOT NULl," +
  13. " `product` VARCHAR(32)," +
  14. " `amount` INT," +
  15. " `sold_year` BIGINT," +
  16. " `sold_month` BIGINT," +
  17. " `sold_day` BIGINT" +
  18. ") PARTITIONED BY (`sold_year`, `sold_month`, `sold_day`) "
  19. ") with (...)");
  20. // 非分区表,收集表级别的统计信息(表的统计信息主要为行数(row count))。
  21. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS");
  22. // 非分区表,收集表级别的统计信息和所有列的列统计信息。
  23. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR ALL COLUMNS");
  24. // 非分区表,收集表级别的统计信息和指定列(列: location)的列统计信息。
  25. tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR COLUMNS location");
  26. // 假设分区表 “Orders” 有 4 个分区,分区信息如下:
  27. // Partition1 : (sold_year='2022', sold_month='1', sold_day='10')
  28. // Partition2 : (sold_year='2022', sold_month='1', sold_day='11')
  29. // Partition3 : (sold_year='2022', sold_month='2', sold_day='10')
  30. // Partition4 : (sold_year='2022', sold_month='2', sold_day='11')
  31. // 分区表,收集分区 Partition1 的表级别统计信息。
  32. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS");
  33. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息。
  34. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS");
  35. // 分区表,为所有分区收集表级别统计信息。
  36. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS");
  37. // 分区表,收集分区 Partition1 的表级别统计信息和所有列的统计信息。
  38. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR ALL COLUMNS");
  39. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和所有列统计信息。
  40. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  41. // 分区表,为所有分区收集表级别统计信息和所有列的统计信息。
  42. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  43. // 分区表,收集分区 Partition1 的表级别统计信息和分区中指定列(列: amount)的列统计信息。
  44. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR COLUMNS amount");
  45. // 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和分区中指定列(列: amount,列: product)的列统计信息。
  46. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");
  47. // 分区表,收集所有分区的表级别统计信息和指定列(列: amount,列: product)的列统计信息。
  48. tableEnv.executeSql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");

Python

  1. table_env = TableEnvironment.create(...)
  2. # 注册名为 “Store” 的非分区表
  3. table_env.execute_sql(
  4. "CREATE TABLE Store (" +
  5. " `id` BIGINT NOT NULl," +
  6. " `location` VARCHAR(32)," +
  7. " `owner` VARCHAR(32)" +
  8. ") with (...)");
  9. # 注册名为 “Orders” 的分区表
  10. table_env.execute_sql(
  11. "CREATE TABLE Orders (" +
  12. " `id` BIGINT NOT NULl," +
  13. " `product` VARCHAR(32)," +
  14. " `amount` INT," +
  15. " `sold_year` BIGINT," +
  16. " `sold_month` BIGINT," +
  17. " `sold_day` BIGINT" +
  18. ") PARTITIONED BY (`sold_year`, `sold_month`, `sold_day`) "
  19. ") with (...)");
  20. # 非分区表,收集表级别的统计信息(表的统计信息主要为行数(row count))。
  21. table_env.execute_sql("ANALYZE TABLE Store COMPUTE STATISTICS");
  22. # 非分区表,收集表级别的统计信息和所有列的列统计信息。
  23. table_env.execute_sql("ANALYZE TABLE Store COMPUTE STATISTICS FOR ALL COLUMNS");
  24. # 非分区表,收集表级别的统计信息和指定列(列: location)的列统计信息。
  25. table_env.execute_sql("ANALYZE TABLE Store COMPUTE STATISTICS FOR COLUMNS location");
  26. # 假设分区表 “Orders” 有 4 个分区,分区信息如下:
  27. # Partition1 : (sold_year='2022', sold_month='1', sold_day='10')
  28. # Partition2 : (sold_year='2022', sold_month='1', sold_day='11')
  29. # Partition3 : (sold_year='2022', sold_month='2', sold_day='10')
  30. # Partition4 : (sold_year='2022', sold_month='2', sold_day='11')
  31. # 分区表,收集分区 Partition1 的表级别统计信息。
  32. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS");
  33. # 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息。
  34. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS");
  35. # 分区表,为所有分区收集表级别统计信息。
  36. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS");
  37. # 分区表,收集分区 Partition1 的表级别统计信息和所有列的统计信息。
  38. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR ALL COLUMNS");
  39. # 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和所有列统计信息。
  40. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  41. # 分区表,为所有分区收集表级别统计信息和所有列的统计信息。
  42. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR ALL COLUMNS");
  43. # 分区表,收集分区 Partition1 的表级别统计信息和分区中指定列(列: amount)的列统计信息。
  44. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR COLUMNS amount");
  45. # 分区表,收集分区 Partition1 和 Partition2 的表级别统计信息和分区中指定列(列: amount,列: product)的列统计信息。
  46. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");
  47. # 分区表,收集所有分区的表级别统计信息和指定列(列: amount,列: product)的列统计信息。
  48. table_env.execute_sql("ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product");

SQL CLI

  1. Flink SQL> CREATE TABLE Store (
  2. > `id` BIGINT NOT NULl,
  3. > `location` VARCHAR(32),
  4. > `owner` VARCHAR(32)
  5. > ) with (
  6. > ...
  7. > );
  8. [INFO] Table has been created.
  9. Flink SQL> CREATE TABLE Orders (
  10. > `id` BIGINT NOT NULl,
  11. > `product` VARCHAR(32),
  12. > `amount` INT,
  13. > `sold_year` BIGINT,
  14. > `sold_month` BIGINT,
  15. > `sold_day` BIGINT
  16. > ) PARTITIONED BY (`sold_year`, `sold_month`, `sold_day`)
  17. > ) with (
  18. > ...
  19. > );
  20. [INFO] Table has been created.
  21. Flink SQL> ANALYZE TABLE Store COMPUTE STATISTICS;
  22. [INFO] Execute statement succeeded.
  23. Flink SQL> ANALYZE TABLE Store COMPUTE STATISTICS FOR ALL COLUMNS;
  24. [INFO] Execute statement succeeded.
  25. Flink SQL> ANALYZE TABLE Store COMPUTE STATISTICS FOR COLUMNS location;
  26. [INFO] Execute statement succeeded.
  27. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS;
  28. [INFO] Execute statement succeeded.
  29. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS;
  30. [INFO] Execute statement succeeded.
  31. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS;
  32. [INFO] Execute statement succeeded.
  33. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR ALL COLUMNS;
  34. [INFO] Execute statement succeeded.
  35. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR ALL COLUMNS;
  36. [INFO] Execute statement succeeded.
  37. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR ALL COLUMNS;
  38. [INFO] Execute statement succeeded.
  39. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year='2022', sold_month='1', sold_day='10') COMPUTE STATISTICS FOR COLUMNS amount;
  40. [INFO] Execute statement succeeded.
  41. Flink SQL> ANALYZE TABLE Orders PARTITION (sold_year='2022', sold_month='1', sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product;
  42. [INFO] Execute statement succeeded.
  43. Flink SQL> ANALYZE TABLE Orders PARTITION(sold_year, sold_month, sold_day) COMPUTE STATISTICS FOR COLUMNS amount, product;
  44. [INFO] Execute statement succeeded.

语法

  1. ANALYZE TABLE [catalog_name.][db_name.]table_name PARTITION(partcol1[=val1] [, partcol2[=val2], ...]) COMPUTE STATISTICS [FOR COLUMNS col1 [, col2, ...] | FOR ALL COLUMNS]
  • 对于分区表, 语法中 PARTITION(partcol1[=val1] [, partcol2[=val2], …]) 是必须指定的

    • 如果没有指定某分区,则会收集所有分区的统计信息
    • 如果指定了某分区,则只会收集该分区的统计信息
    • 如果该表为非分区表,但语句中指定了分区,则会报异常
    • 如果指定了某个分区,但是该分区不存在,则会报异常
  • 语法中,FOR COLUMNS col1 [, col2, …] 或者 FOR ALL COLUMNS 也是可选的

    • 如果没有指定某一列,则只会收集表级别的统计信息
    • 如果指定的列不存在,或者该列不是物理列,则会报异常
    • 如果指定了某一列或者某几列,则会收集列的统计信息
    • 列级别的统计信息包括:
      • ndv: 该列中列值不同的数量
      • nullCount: 该列中空值的数量
      • avgLen: 列值的平均长度
      • maxLen: 列值的最大长度
      • minValue: 列值的最小值
      • maxValue: 列值的最大值
      • valueCount: 该值只应用于 boolean 类型
    • 对于列统计信息,支持类型和对应的列统计信息值如下表所示(“Y” 代表支持,“N” 代表不支持):
类型ndvnullCountavgLenmaxLenmaxValueminValuevalueCount
BOOLEANNYNNNNY
TINYINTYYNNYYN
SMALLINTYYNNYYN
INTEGERYYNNYYN
FLOATYYNNYYN
DATEYYNNYYN
TIME_WITHOUT_TIME_ZONEYYNNYYN
BIGINTYYNNYYN
DOUBLEYYNNYYN
DECIMALYYNNYYN
TIMESTAMP_WITH_LOCAL_TIME_ZONEYYNNYYN
TIMESTAMP_WITHOUT_TIME_ZONEYYNNYYN
CHARYYYYNNN
VARCHARYYYYNNN
other typesNYNNNNN

注意: 对于数据值定长的类型(例如:BOOLEAN, INTEGER, DOUBLE 等), Flink 不会去收集 avgLenmaxLen 值。