使用 UDB-SX 索引优化查询性能
在使用外部数据源时,网络延迟、数据转换和数据量等原因可能导致查询性能较慢。你可以通过使用 UDB-SX 索引(例如跳过索引或覆盖索引)来优化查询性能。
跳过索引(skipping index) 使用跳过加速方法(如分区、最小/最大值和值集)来摄取并创建紧凑的聚合数据结构。这使其在直接查询场景中成为一种经济的选择。更多信息请参见 跳过索引。
覆盖索引(covering index) 将部分或全部源数据摄取到 UDB-SX 中,从而可以使用所有 UDB-SX Dashboards 和插件功能。更多信息请参见 覆盖索引。
物化视图(materialized view) 通过存储来自源数据的预计算和聚合数据来提升查询性能。更多信息请参见 物化视图。
有关每种索引过程的完整指南,请参阅 Flint Index 参考手册(手册可联系售前工作人员获取)。
数据源用例:加速性能
要开始加速查询性能,请执行以下步骤:
转到 UDB-SX插件 > 查询工作台 并从 Data sources 下拉菜单中选择你的数据源。
从导航菜单中选择一个数据库。
在表格中查看结果并确认数据正确。
通过以下步骤创建 UDB-SX 索引:
选择 Accelerate data。会弹出一个窗口。
在 Select data fields 下输入你的数据库和表详细信息。
对于 Acceleration type,根据用例选择加速类型,然后输入该类型所需的信息。更多信息参见下列部分:
跳过索引
跳过索引 使用跳过加速方法(如分区、最小/最大和值集)来通过紧凑的聚合数据结构摄取数据。这使其在直接查询场景中成为一种经济的选择。
使用跳过索引时,你可以仅索引存储在 Amazon S3 中数据的元数据。当查询带有跳过索引的表时,查询规划器会参考该索引并重写查询以高效定位数据,而不是扫描所有分区和文件。这使跳过索引能够快速缩小存储数据的具体位置。
定义跳过索引设置
在 Skipping index definition 下,选择 Generate 以自动生成跳过索引。或者,若要手动选择要添加的字段,选择 Add fields。可选择以下类型:
Partition:使用数据分区详情来定位数据。此类型适用于基于分区的列(例如 year、month、day、hour)。MinMax:使用被索引列的下界和上界来定位数据。此类型适用于数值列。ValueSet:使用唯一值集来定位数据。此类型适用于低到中等基数且需要精确匹配的列。BloomFilter:使用布隆过滤器算法来定位数据。此类型适用于高基数且不要求精确匹配的列。
选择 Create acceleration 以应用跳过索引设置。
查看跳过索引查询详情,然后点击 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)管理覆盖视图索引。更多信息请参见 索引状态管理。
定义覆盖索引设置
在 Index name 中输入有效的索引名称。注意,每个表可以拥有多个覆盖索引。
选择 Refresh type。默认情况下,UDB-SX 会自动刷新索引。否则,你必须使用
REFRESH语句手动触发刷新。输入 Checkpoint location,它是刷新作业检查点的路径。该位置必须是与 Hadoop 分布式文件系统(HDFS)兼容的文件系统路径。更多信息请参见 启动流式查询。
通过在 Covering index definition 下选择 (add fields here) 来定义覆盖索引字段。
选择 Create acceleration 以应用覆盖索引设置。
查看覆盖索引查询详情,然后点击 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 会基于摄取的数据形成一个索引,供你用于可视化。你可以使用索引状态管理来管理物化视图索引。
定义物化视图设置
在 Index name 中输入有效的索引名称。注意,每个表可以拥有多个覆盖索引。
选择 Refresh type。默认情况下,UDB-SX 会自动刷新索引。否则,你必须使用
REFRESH语句手动触发刷新。输入 Checkpoint location,它是刷新作业检查点的路径。该位置必须是与 HDFS 兼容的文件系统路径。
输入 Watermark delay,用于定义延迟多长时间的数据仍然可以被处理,例如 1 minute 或 10 seconds。
在 Materialized view definition 下定义物化视图字段。
选择 Create acceleration 以应用物化视图索引设置。
查看物化视图查询详情,然后点击 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',
)