使用 UDB-SX 索引优化查询性能

在使用外部数据源时,网络延迟、数据转换和数据量等原因可能导致查询性能较慢。你可以通过使用 UDB-SX 索引(例如跳过索引或覆盖索引)来优化查询性能。

  • 跳过索引(skipping index) 使用跳过加速方法(如分区、最小/最大值和值集)来摄取并创建紧凑的聚合数据结构。这使其在直接查询场景中成为一种经济的选择。更多信息请参见 跳过索引

  • 覆盖索引(covering index) 将部分或全部源数据摄取到 UDB-SX 中,从而可以使用所有 UDB-SX Dashboards 和插件功能。更多信息请参见 覆盖索引

  • 物化视图(materialized view) 通过存储来自源数据的预计算和聚合数据来提升查询性能。更多信息请参见 物化视图

有关每种索引过程的完整指南,请参阅 Flint Index 参考手册(手册可联系售前工作人员获取)。

数据源用例:加速性能

要开始加速查询性能,请执行以下步骤:

  1. 转到 UDB-SX插件 > 查询工作台 并从 Data sources 下拉菜单中选择你的数据源。

  2. 从导航菜单中选择一个数据库。

  3. 在表格中查看结果并确认数据正确。

  4. 通过以下步骤创建 UDB-SX 索引:

    1. 选择 Accelerate data。会弹出一个窗口。

    2. Select data fields 下输入你的数据库和表详细信息。

  5. 对于 Acceleration type,根据用例选择加速类型,然后输入该类型所需的信息。更多信息参见下列部分:

跳过索引

跳过索引 使用跳过加速方法(如分区、最小/最大和值集)来通过紧凑的聚合数据结构摄取数据。这使其在直接查询场景中成为一种经济的选择。

使用跳过索引时,你可以仅索引存储在 Amazon S3 中数据的元数据。当查询带有跳过索引的表时,查询规划器会参考该索引并重写查询以高效定位数据,而不是扫描所有分区和文件。这使跳过索引能够快速缩小存储数据的具体位置。

定义跳过索引设置

  1. Skipping index definition 下,选择 Generate 以自动生成跳过索引。或者,若要手动选择要添加的字段,选择 Add fields。可选择以下类型:

  • Partition:使用数据分区详情来定位数据。此类型适用于基于分区的列(例如 year、month、day、hour)。

  • MinMax:使用被索引列的下界和上界来定位数据。此类型适用于数值列。

  • ValueSet:使用唯一值集来定位数据。此类型适用于低到中等基数且需要精确匹配的列。

  • BloomFilter:使用布隆过滤器算法来定位数据。此类型适用于高基数且不要求精确匹配的列。

  1. 选择 Create acceleration 以应用跳过索引设置。

  2. 查看跳过索引查询详情,然后点击 Run。UDB-SX 会将你的索引添加到左侧导航面板。

或者,你也可以使用 Query Workbench 手动创建跳过索引。 从下拉菜单中选择你的数据源并运行如下查询:

CREATE SKIPPING INDEX
ON datasourcename.gluedatabasename.vpclogstable(
 `srcaddr` BLOOM_FILTER, 
 `dstaddr` BLOOM_FILTER, 
 `day` PARTITION, 
 `account_id`BLOOM_FILTER
 ) WITH (
index_settings = '{"number_of_shards":5,"number_of_replicas":1}',
auto_refresh = true,
checkpoint_location = 's3://accountnum-vpcflow/AWSLogs/checkpoint'
)

覆盖索引

覆盖索引 将源数据的全部或部分摄取到 UDB-SX 中,从而可以使用所有 UDB-SX Dashboards 与插件功能。

使用覆盖索引时,你可以从表中的指定列摄取数据。这三种索引类型中覆盖索引的性能最好。因为 UDB-SX 会摄取所需列的全部数据,你将获得更好的性能并能执行高级分析。

UDB-SX 会根据覆盖索引数据创建一个新索引。你可以使用该新索引来创建可视化,或用于异常检测和地理空间功能。你可以使用索引状态管理(Index State Management)管理覆盖视图索引。更多信息请参见 索引状态管理

定义覆盖索引设置

  1. Index name 中输入有效的索引名称。注意,每个表可以拥有多个覆盖索引。

  2. 选择 Refresh type。默认情况下,UDB-SX 会自动刷新索引。否则,你必须使用 REFRESH 语句手动触发刷新。

  3. 输入 Checkpoint location,它是刷新作业检查点的路径。该位置必须是与 Hadoop 分布式文件系统(HDFS)兼容的文件系统路径。更多信息请参见 启动流式查询

  4. 通过在 Covering index definition 下选择 (add fields here) 来定义覆盖索引字段。

  5. 选择 Create acceleration 以应用覆盖索引设置。

  6. 查看覆盖索引查询详情,然后点击 Run。UDB-SX 会将你的索引添加到左侧导航面板。

或者,你也可以在 Query Workbench 中手动为表创建覆盖索引。选择你的数据源并运行如下查询:

CREATE INDEX vpc_covering_index
ON datasourcename.gluedatabasename.vpclogstable (version, account_id, interface_id, 
srcaddr, dstaddr, srcport, dstport, protocol, packets, 
bytes, start, action, log_status STRING, 
`aws-account-id`, `aws-service`, `aws-region`, year, 
month, day, hour )
WITH (
  auto_refresh = true,
  refresh_interval = '15 minute',
  checkpoint_location = 's3://accountnum-vpcflow/AWSLogs/checkpoint'
)

物化视图

通过 物化视图,你可以使用复杂查询(例如聚合)来驱动 Dashboards 可视化。物化视图将根据查询摄取少量数据到 UDB-SX,然后 UDB-SX 会基于摄取的数据形成一个索引,供你用于可视化。你可以使用索引状态管理来管理物化视图索引。

定义物化视图设置

  1. Index name 中输入有效的索引名称。注意,每个表可以拥有多个覆盖索引。

  2. 选择 Refresh type。默认情况下,UDB-SX 会自动刷新索引。否则,你必须使用 REFRESH 语句手动触发刷新。

  3. 输入 Checkpoint location,它是刷新作业检查点的路径。该位置必须是与 HDFS 兼容的文件系统路径。

  4. 输入 Watermark delay,用于定义延迟多长时间的数据仍然可以被处理,例如 1 minute 或 10 seconds。

  5. Materialized view definition 下定义物化视图字段。

  6. 选择 Create acceleration 以应用物化视图索引设置。

  7. 查看物化视图查询详情,然后点击 Run。UDB-SX 会将你的索引添加到左侧导航面板。

或者,你也可以在 Query Workbench 中手动为表创建物化视图索引。选择数据源并运行如下查询:

CREATE MATERIALIZED VIEW {table_name}__week_live_mview AS
  SELECT
    cloud.account_uid AS `aws.vpc.cloud_account_uid`,
    cloud.region AS `aws.vpc.cloud_region`,
    cloud.zone AS `aws.vpc.cloud_zone`,
    cloud.provider AS `aws.vpc.cloud_provider`,

    CAST(IFNULL(src_endpoint.port, 0) AS LONG) AS `aws.vpc.srcport`,
    CAST(IFNULL(src_endpoint.svc_name, 'Unknown') AS STRING)  AS `aws.vpc.pkt-src-aws-service`,
    CAST(IFNULL(src_endpoint.ip, '0.0.0.0') AS STRING)  AS `aws.vpc.srcaddr`,
    CAST(IFNULL(src_endpoint.interface_uid, 'Unknown') AS STRING)  AS `aws.vpc.src-interface_uid`,
    CAST(IFNULL(src_endpoint.vpc_uid, 'Unknown') AS STRING)  AS `aws.vpc.src-vpc_uid`,
    CAST(IFNULL(src_endpoint.instance_uid, 'Unknown') AS STRING)  AS `aws.vpc.src-instance_uid`,
    CAST(IFNULL(src_endpoint.subnet_uid, 'Unknown') AS STRING)  AS `aws.vpc.src-subnet_uid`,

    CAST(IFNULL(dst_endpoint.port, 0) AS LONG) AS `aws.vpc.dstport`,
    CAST(IFNULL(dst_endpoint.svc_name, 'Unknown') AS STRING) AS `aws.vpc.pkt-dst-aws-service`,
    CAST(IFNULL(dst_endpoint.ip, '0.0.0.0') AS STRING)  AS `aws.vpc.dstaddr`,
    CAST(IFNULL(dst_endpoint.interface_uid, 'Unknown') AS STRING)  AS `aws.vpc.dst-interface_uid`,
    CAST(IFNULL(dst_endpoint.vpc_uid, 'Unknown') AS STRING)  AS `aws.vpc.dst-vpc_uid`,
    CAST(IFNULL(dst_endpoint.instance_uid, 'Unknown') AS STRING)  AS `aws.vpc.dst-instance_uid`,
    CAST(IFNULL(dst_endpoint.subnet_uid, 'Unknown') AS STRING)  AS `aws.vpc.dst-subnet_uid`,
    CASE
      WHEN regexp(dst_endpoint.ip, '(10\\..*)|(192\\.168\\..*)|(172\\.1[6-9]\\..*)|(172\\.2[0-9]\\..*)|(172\\.3[0-1]\\.*)')
        THEN 'ingress'
      ELSE 'egress'
      END AS `aws.vpc.flow-direction`,

    CAST(IFNULL(connection_info['protocol_num'], 0) AS INT) AS `aws.vpc.connection.protocol_num`,
    CAST(IFNULL(connection_info['tcp_flags'], '0') AS STRING)  AS `aws.vpc.connection.tcp_flags`,
    CAST(IFNULL(connection_info['protocol_ver'], '0') AS STRING)  AS `aws.vpc.connection.protocol_ver`,
    CAST(IFNULL(connection_info['boundary'], 'Unknown') AS STRING)  AS `aws.vpc.connection.boundary`,
    CAST(IFNULL(connection_info['direction'], 'Unknown') AS STRING)  AS `aws.vpc.connection.direction`,

    CAST(IFNULL(traffic.packets, 0) AS LONG) AS `aws.vpc.packets`,
    CAST(IFNULL(traffic.bytes, 0) AS LONG) AS `aws.vpc.bytes`,

    CAST(FROM_UNIXTIME(time / 1000) AS TIMESTAMP) AS `@timestamp`,
    CAST(FROM_UNIXTIME(start_time / 1000) AS TIMESTAMP) AS `start_time`,
    CAST(FROM_UNIXTIME(start_time / 1000) AS TIMESTAMP) AS `interval_start_time`,
    CAST(FROM_UNIXTIME(end_time / 1000) AS TIMESTAMP) AS `end_time`,
    status_code AS `aws.vpc.status_code`,

    severity AS `aws.vpc.severity`,
    class_name AS `aws.vpc.class_name`,
    category_name AS `aws.vpc.category_name`,
    activity_name AS `aws.vpc.activity_name`,
    disposition AS `aws.vpc.disposition`,
    type_name AS `aws.vpc.type_name`,

    region AS `aws.vpc.region`,
    accountid AS `aws.vpc.account-id`
  FROM
  datasourcename.gluedatabasename.vpclogstable 
WITH (
  auto_refresh = true,
  refresh_interval = '15 Minute',
  checkpoint_location = 's3://accountnum-vpcflow/AWSLogs/checkpoint',
  watermark_delay = '1 Minute',
)