稳定运行的以Azure Synapse Dedicated SQL Pool数据仓库为数据源和目标的ETL性能变差时提高性能方法和步骤

在Azure Synapse Dedicated SQL Pool(以前称为SQL Data Warehouse)的ETL性能变差时,可以通过以下方法和步骤来提高性能:

1. 分析和监控性能瓶颈

  • 查看执行计划:使用SQL的SET STATISTICS IO ONSET STATISTICS TIME ON来查看查询的执行计划和I/O操作,识别性能瓶颈(如大范围的扫描、大量的I/O操作等)。
  • 监控资源使用情况:使用Azure Monitor或SQL Pool内置的系统视图(如sys.dm_pdw_exec_requestssys.dm_pdw_request_steps等)来监控资源的使用情况(例如CPU、内存、磁盘I/O)。
  • 检查并行度和分配:确保查询合理地利用了分布式查询和并行处理,避免瓶颈。

2. 优化表结构和数据分布

  • 选择合适的分布键:在大数据量表中,选择合理的分布键是非常重要的。尽量选择经常用于JOINWHERE条件中的列作为分布键。常见的选择是DateID或与查询频繁过滤或联接的列。
    • 如果是范围查询,使用HASH分布,避免数据倾斜。
    • 如果是维度表,通常选择ROUND-ROBIN分布,以避免数据倾斜。
  • 优化聚簇索引:Azure Synapse使用列存储,因此为常用的查询字段创建合适的聚簇索引或列存储索引,以提高查询效率。
  • 避免小表的广播JOIN:对于小表的JOIN,如果使用的是广播式JOIN,可以考虑改成合适的分布方式,以避免广播传输大量数据。

3. 分区表的使用

  • 使用分区表:对于大型表,采用分区可以有效地减少I/O并提高查询性能。选择合理的分区列(如日期、ID范围等)来分区数据。
  • 合理管理分区:定期进行分区维护,移除不再需要的历史数据,避免查询时处理大量不必要的分区。

4. 优化ETL作业的批处理

  • 批量数据加载:将ETL作业拆分成较小的批次进行加载,避免一次性加载过大的数据。可以使用PolyBase或BULK INSERT来进行高效的数据加载。
  • 使用Data Flow/Copy活动:如果你使用Azure Synapse Pipelines,确保你使用了高效的Copy activity,并考虑启用并行加载来加速数据传输。
  • 优化数据转换操作:减少ETL过程中不必要的转换逻辑。可以通过提前在源系统处理数据转换,减少在数据仓库中的计算负载。

5. 调整资源分配

  • 动态调整数据仓库资源:根据工作负载的需求调整Synapse SQL池的资源。例如,在高负载时增加数据仓库的性能级别(DWU),在低负载时缩减资源,以节省成本。
  • 使用适当的索引和统计信息:定期更新统计信息,并根据查询模式调整索引。尤其是对于大数据量表,合理选择覆盖索引,避免全表扫描。

6. 避免数据倾斜

  • 数据倾斜:确保数据均匀分布,避免在某些节点上过多的数据聚集,导致某些节点资源紧张。使用合适的分布键、分区策略,并定期监控和调整。
  • 分布和分区优化:避免过多的单节点操作,合理调整数据分布策略。

7. 优化并行度

  • 增加并行度:Azure Synapse支持并行执行。可以调整查询的并行度设置来提高处理速度。适当地配置MAXDOP(最大并行度)设置,确保查询能够利用足够的并行度。
  • 使用表格函数和存储过程:优化ETL过程中使用的查询,避免在复杂的查询中使用大范围的循环或递归操作。

8. 调整ETL流程中的数据移动

  • 最小化数据移动:尽量减少在不同区域或不同表之间的数据移动。使用合适的缓存和存储选项,避免频繁的数据传输。
  • 使用PolyBase:对于从外部数据源加载数据时,使用PolyBase进行数据的并行加载,尤其对于Azure Blob Storage、Azure Data Lake等外部数据源的加载非常高效。

9. 合理的临时存储和清理

  • 清理临时数据:ETL过程中生成的临时表和数据不要长期保存,避免影响系统的存储性能。定期清理无用的临时对象。
  • 使用临时表优化复杂查询:如果ETL作业中包含复杂的查询,考虑将中间结果存储到临时表中,避免重复计算。

10. ETL调度与分配优化

  • 合理调度ETL任务:根据负载的需求,调整ETL作业的执行时间,避免与其他高负载查询同时运行,影响整体性能。
  • 合理的资源分配:在执行ETL时,将资源池进行合适的分配,避免过度竞争资源。

11. 启用数据缓存

  • 启用结果缓存:如果ETL中的某些查询是重复执行的,可以考虑使用结果缓存来加速查询。

12. 定期维护和优化

  • 定期更新统计信息:定期更新统计信息,以确保查询优化器使用最佳执行计划。
  • 清理过时数据:定期清理过时或不必要的数据,减少系统负担。

13. Azure Synapse Dedicated SQL Pool数据仓库性能优化

1. 检查资源使用情况和查询性能
  • 监控性能:首先,通过Azure Synapse Studio或Azure Monitor查看查询的性能指标和资源利用情况。

    • 查询性能:查看查询的执行计划和性能瓶颈(例如,I/O、CPU、内存等)。
    • 资源利用情况:检查分配给SQL池的资源(例如,DWU,Data Warehouse Units)是否充足,或者是否存在资源竞争。
  • 查询优化

    • 确保查询执行计划高效,避免全表扫描,检查是否有适当的索引或分区策略。
    • 使用查询存储(Query Store)和性能监视器来识别并优化慢查询。
2. 优化数据分布和分区

数据分布策略在数据仓库的性能上起着至关重要的作用。常见的优化方法包括:

  • 重新设计表的分布策略:确保表的数据分布方式适应查询模式。常见的分布方式有:

    • 哈希分布:适用于连接查询(JOIN)中的连接键,减少数据移动。
    • 轮转分布:适用于不频繁参与JOIN的表,或单独查询时。
    • 列存储索引:适用于列式压缩,提升读取性能。
  • 数据分区:对于大的表,使用分区可以提高查询性能,尤其是在有时间范围查询时。按时间字段进行分区(例如按月或年分区)可以减少扫描的数据量。

3. 调整DWU(Data Warehouse Units)
  • 增加DWU:如果性能下降是由于资源不足导致的,可以考虑增加DWU(计算资源单元)。增加DWU可以提高处理能力,但需要根据成本效益分析做出决策。
  • 平衡成本与性能:并不是每次都需要提高DWU,适当的DWU设置取决于工作负载和查询需求,确保不会过度增加资源。
4. 清理不必要的数据和索引
  • 删除过期数据:定期清理不再使用的数据可以减少存储负担和提高查询效率。
  • 清理索引:不常用的索引会影响写入性能并占用不必要的存储空间。定期检查和清理不再需要的索引。
5. 调整并行度设置
  • 并行度:调整查询的并行度可以提高查询的执行速度。检查查询是否充分利用了并行计算,必要时可以手动调整并行度设置。
6. 优化表的索引和统计信息
  • 更新统计信息:定期更新统计信息,以便查询优化器能够选择最合适的执行计划。
  • 创建合适的索引:根据查询模式(尤其是JOIN和WHERE子句)创建合适的索引。避免过多的索引,这会影响DML操作的性能。
7. 数据仓库重建(Rebuilding)

如果数据仓库已经使用了一段时间,并且出现了性能下降,可能需要重新构建数据仓库:

  • 数据重新加载:重建数据仓库,导出数据后重建仓库,并重新加载数据。重建仓库可以清理过期的元数据和碎片,从而提升性能。
  • 重新分布和分区:重建表的分布和分区结构,以适应当前的查询模式和数据分布。
8. 缓存和索引优化
  • 查询缓存:Azure Synapse SQL池支持查询缓存,使用缓存可以提高查询响应时间。对于频繁执行的查询,确保启用缓存。
  • 磁盘I/O优化:磁盘I/O是影响性能的一个关键因素。通过监控磁盘I/O情况,可以帮助发现并优化瓶颈。
9. 诊断瓶颈
  • 检查资源瓶颈:通过Azure Monitor、SQL Pool的资源图表查看可能的瓶颈,如CPU、内存、存储等。
  • 查询计划分析:使用查询存储和查询执行计划(Query Execution Plans)来分析性能瓶颈。
10. 升级到更高版本的服务

如果当前的配置和资源利用已接近极限,可以考虑将Azure Synapse Dedicated SQL Pool从当前版本升级到更高的规格,或使用更高级的功能(如Hyperscale)。此外,定期关注Azure Synapse的更新,查看是否有新功能能优化性能。

步骤总结:
  1. 监控性能:通过Azure Monitor和Synapse Studio监控SQL池性能。
  2. 优化数据分布和分区:根据查询模式选择合适的表分布和分区方式。
  3. 调整DWU:评估是否需要调整计算资源(DWU)。
  4. 清理不必要的数据和索引:删除过期数据并清理无用的索引。
  5. 更新统计信息和优化查询:更新统计信息和执行查询优化。
  6. 定期重建数据仓库:如果性能下降严重,考虑重建数据仓库和重新加载数据。

14. 提高表和视图的读写效率

在Azure Synapse Dedicated SQL Pool(之前叫Azure SQL Data Warehouse)中,提高表和视图的读写效率,通常需要优化数据库的架构、查询、存储和分区策略等。
提高Azure Synapse Dedicated SQL Pool中的读写效率需要综合考虑表设计、查询优化、索引策略、存储和并行处理等多个方面。通过合理的分布、分区、索引设计以及查询优化,可以显著提升系统的性能。在不同的使用场景下,选择合适的优化策略,将带来更好的数据处理效率。以下是一些提高效率的常见方法:

1. 合理设计表的分布方式

在Azure Synapse中,可以选择不同的分布策略来决定表的物理存储方式,这对性能有很大影响。

  • 哈希分布 (Hash Distribution):适用于大表,特别是当你有某些列经常作为连接条件时。例如,如果有一张表经常与另一张表通过某个字段连接,可以选择将两张表都按该字段进行哈希分布,减少数据移动,提高连接性能。

  • 轮转分布 (Round-robin Distribution):适用于那些没有明显连接字段的表。轮转分布将数据均匀分布在各个分区上,但可能会导致跨节点查询时需要大量的数据移动,因此适合小到中等规模的表。

  • 列存储 (Clustered Columnstore Index):对于只读或查询密集型的表,建议使用列存储索引。列存储能够提供更高的查询性能和压缩比,适用于需要读取大量数据而不需要频繁更新的场景。

2. 表的分区设计

通过合理的分区设计,可以减少查询时扫描的数据量,从而提高查询效率。

  • 分区策略:可以根据数据的时间范围(如按月或按年分区)来分区大表,减少每次查询的扫描范围。

  • 合适的分区列:选择合适的列作为分区列,通常是那些查询中频繁用于过滤的列。例如,时间戳列或地区列。

3. 索引优化

索引可以显著提高查询性能,但不当的索引会导致额外的存储开销和维护成本。

  • 聚集列存储索引 (Clustered Columnstore Index):对于大多数分析型工作负载,聚集列存储索引通常能够提供最佳的性能。特别是对只读或者读取大量数据的查询,列存储索引提供高压缩率和优秀的查询性能。

  • 非聚集索引 (Non-clustered Indexes):适用于频繁基于某些列查询的场景,但在更新、删除操作频繁时需要谨慎使用。

  • 避免过多的索引:每增加一个索引,都会增加表的写入成本,尤其是在数据量大且更新频繁时。

4. 查询优化

优化查询本身可以显著提高读写效率:

  • *避免SELECT 语句:总是只查询需要的列,避免扫描和传输不必要的列。

  • 使用合适的JOIN类型:尽量避免在查询中使用笛卡尔积(CROSS JOIN),并使用合适的INNER JOINLEFT JOIN等,以避免不必要的数据量。

  • 查询分块:对于大规模数据更新,可以通过分批次处理来减少每次查询的负载,避免阻塞整个系统。

  • 统计信息更新:确保表的统计信息是最新的,特别是在数据量变化较大的情况下。Synapse SQL池会使用统计信息来决定查询计划,过时的统计信息可能导致不高效的执行计划。

5. 压缩和存储优化
  • 列存储压缩:使用列存储时,数据会自动进行压缩,这可以大大减少存储需求和提高I/O效率。

  • 存储优化:对于频繁写入和更新的表,可以使用行存储。对大部分只查询数据的表,使用列存储可以提高查询性能。

6. 内存优化

在进行大规模的查询时,内存使用效率对性能有较大影响:

  • 使用MEMORY_OPTIMIZED:如果需要高性能的事务性查询,可以将某些表设计为内存优化的表。内存优化的表不会持久化到磁盘,操作更为高效。
7. 使用Materialized Views (物化视图)

对于某些计算密集型的查询,物化视图可以预先计算和存储查询结果,以减少后续的计算负担。特别适用于需要频繁访问的复杂查询。

8. 负载分配与并行处理

Azure Synapse能够自动将工作负载分配到多个节点进行并行处理,因此在设计查询时,要确保合理使用并行性来提高性能。

  • 避免大规模全表扫描:如果查询需要扫描全表,考虑使用分区和合适的索引来避免性能瓶颈。
  • 数据均衡:确保分布的均匀性,避免某些节点过载而影响性能。
9. 数据加载优化

数据加载速度直接影响到读写效率,尤其是在大数据量的情况下。

  • 并行加载:通过使用多个线程进行数据加载,分摊数据加载的时间。
  • 使用PolyBase:PolyBase是用于从外部数据源加载数据的技术,能够支持大规模的数据加载。特别是当数据来自Azure Blob Storage或其他外部系统时,PolyBase可以提高加载效率。

15. 提高只用于读取数据的表的读取效率

在Azure Synapse Dedicated SQL Pool(以前称为SQL Data Warehouse)中,提高只用于读取数据的表的读取效率,通常涉及优化存储、索引和查询计划等方面。
提高只读表的读取效率通常依赖于数据的存储结构、分布策略、索引和查询优化。使用列存储索引、合理的分布策略和分区,以及确保查询的合理性,都会对性能产生显著影响。以下是一些可以考虑的最佳实践:

1. 使用聚簇列存储(Clustered Columnstore Index)
  • 聚簇列存储是一种用于数据仓库的存储格式,它能够显著提高读取性能,尤其是在只用于读取数据的表中。
  • 聚簇列存储将数据按列而不是按行存储,使得查询仅读取相关的列而不是整个表,减少I/O。
  • 对于大数据量表,列存储能够显著压缩数据并加速查询。
  • 可以通过 CREATE CLUSTERED COLUMNSTORE INDEXALTER TABLE 来应用此索引:
    CREATE CLUSTERED COLUMNSTORE INDEX idx_name ON table_name;
    
2. 选择合适的分布策略

在Dedicated SQL Pool中,表的分布策略对查询性能有很大影响。以下是几种分布策略的选择:

  • HASH分布:适用于大表且有等值连接的查询。如果你的表数据具有某些列的高选择性,可以选择基于某些列的哈希分布,这有助于避免数据倾斜并提高查询性能。
    CREATE TABLE table_name
    (column1 INT,column2 NVARCHAR(50),...
    )
    WITH (DISTRIBUTION = HASH(column1));
    
  • ROUND-ROBIN分布:适用于没有特定连接条件的大表,可以将数据平均分布,但查询性能可能不如哈希分布。
    CREATE TABLE table_name
    (column1 INT,column2 NVARCHAR(50),...
    )
    WITH (DISTRIBUTION = ROUND_ROBIN);
    
  • REPLICATE分布:适用于小表,避免数据的分片和移动,适合于小型维度表。
    CREATE TABLE table_name
    (column1 INT,column2 NVARCHAR(50),...
    )
    WITH (DISTRIBUTION = REPLICATE);
    
3. 适当使用索引
  • 虽然Azure Synapse使用列存储来优化读取性能,但在某些情况下,传统的非聚簇索引(non-clustered index)也能提高查询性能,尤其是在需要进行频繁的点查找或范围查询时。
  • 但是要小心,过多的索引会影响数据加载性能。对于只读表,适当添加索引可以提高查询效率。
    CREATE NONCLUSTERED INDEX idx_name ON table_name (column1, column2);
    
4. 优化查询模式
  • 避免全表扫描:尽量确保查询中涉及的列与表的分布键和索引一致,避免不必要的全表扫描。
  • 避免数据倾斜:确保表的数据均匀分布,以免出现某些节点上数据过多,导致性能瓶颈。
  • 使用分区:如果数据按时间等逻辑划分,可以使用表分区来提高查询性能。例如,按日期分区的表可以大大加速时间范围查询。
    CREATE PARTITION FUNCTION pf_date (DATE)
    AS RANGE RIGHT FOR VALUES ('2020-01-01', '2021-01-01');CREATE PARTITION SCHEME ps_date
    AS PARTITION pf_date ALL TO ([PRIMARY]);CREATE TABLE table_name
    (column1 INT,column2 DATE,...
    )
    ON ps_date (column2);
    
5. 数据压缩
  • 通过使用列存储格式,可以自动实现数据压缩,从而减少I/O并加速查询。
  • 确保表的列存储索引启用,并且对频繁查询的列进行压缩。
6. 分区和聚合策略
  • 对于非常大的表,可以考虑将表按照某些逻辑(例如日期、地区等)进行分区,并确保查询尽可能通过过滤条件来限制扫描的数据量。
  • 在读取操作中,尤其是涉及聚合操作时,考虑在合适的情况下使用物化视图来提高查询性能。
7. 适当使用缓存
  • Azure Synapse会根据查询执行计划自动决定缓存策略,对于频繁查询的数据,可以使用Azure Synapse提供的Result Set Caching来减少数据读取延迟。
8. 避免并行度过高
  • 虽然高并行度可以加速查询,但在读取操作时,过高的并行度可能会导致资源争用。你可以通过 MAXDOP 来限制查询的并行度:
    SET MAXDOP = 4;
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735,目前主流的版本都适用(V1R5~V2R1的就不在列了,版本太老了,界面完全不一样,这里调试线接的console口,电脑的网络接在ETH口) 「模拟器、工具合集」复制整段内…

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后,在IDEA中创建的项目中建立一个lib目录,然后把刚刚下载好的jar包拷贝进去,然后右键刚刚添加的jar包,点击‘添…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题(Proposition):是一个陈述句,它要么是真的(true),要么是假的(false),但不能同时为真和假。例如…

【Linux篇】权限管理 - 用户与组权限详解

一. 什么是权限? 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员,几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#,普通用…

【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法

C4.5 是由 Ross Quinlan 提出的决策树算法,是对 ID3 算法的改进版本。它在 ID3 的基础上,解决了以下问题: 处理连续型数据:支持连续型特征,能够通过划分点将连续特征离散化。处理缺失值:能够在特征值缺失的…

2023年MathorCup高校数学建模挑战赛—大数据竞赛B题电商零售商家需求预测及库存优化问题求解全过程文档及程序

2023年MathorCup高校数学建模挑战赛—大数据竞赛 B题 电商零售商家需求预测及库存优化问题 原题再现: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库,电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策&…

cocotb pytest

打印python中的print , 应该使用 pytest -s pytest --junitxmltest_report.xml --htmlreport.html

【Linux】进程间关系与守护进程

🌎进程间关系与守护进程 文章目录: 进程间关系与守护进程 进程组     会话       认识会话       会话ID       创建会话 控制终端     作业控制       作业(job)和作业控制(Job Control)       作业号及作业过程…

QT5.14 QML串口助手

基于 QML的 串口调试助手 这个代码有缺失,补了部分代码 ASCII HEX 工程共享, Qt版本 5.14.1 COM_QML 通过百度网盘分享的文件:COM_QML.zip 链接:https://pan.baidu.com/s/1MH2d6gIPDSoaX-syVWZsww?pwd5tge 提取码:…

IOS ARKit进行图像识别

先讲一下基础控涧,资源的话可以留言,抽空我把它传到GitHub上,这里没写收积分,竟然充值才能下载,我下载也要充值,牛! ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…

C语言第十五周课——课堂练习

目录 1.输出特定图形 2.求三个数的最小值 3.思考题 1.输出特定图形 要求&#xff1a;输出下面形状在控制台 * * * * * * * * * * * * * * * #include <stdio.h> int main() {int i, j;// 外层循环控制行数for (i 1; i < 5; i){// 内层循环控制每行的星号个数for (…

数据结构 (20)二叉树的遍历与线索化

一、二叉树的遍历 遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。二叉树的遍历方式主要有四种&#xff1a;前序遍历、中序遍历、后序遍历…

sscanf与sprintf函数

本期介绍&#x1f356; 主要介绍&#xff1a;sscanf()、sprintf()这对输入/输出函数&#xff0c;并详细讲解了这两个函数的应用场景。 概述&#x1f356; 在C语言的输出和输入库中&#xff0c;有三对及其相似的库函数&#xff1a;printf()、scanf()、fprintf()、fscanf()、spri…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题&#xff0c;在Anaconda Prompt里输入jupyter notebook后可以打开浏览器&#xff0c;但打开具体项目后就会显示“服务器错误&#xff1a;Forbidden”&#xff0c;终端出现&#xff1a; tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…

【掩体计划——DFS+缩点】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10; vector<vector<int>> g; bool st[N]; int ans 1e9; bool dfs(int f, int u, int dis) {bool is 1;for (auto j : g[u]){if (j f)continue;is & dfs(u, j, dis (g[u].…