当前位置: 首页 > news >正文

稳定运行的以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;
    

相关文章:

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

在Azure Synapse Dedicated SQL Pool(以前称为SQL Data Warehouse)的ETL性能变差时,可以通过以下方法和步骤来提高性能: 1. 分析和监控性能瓶颈 查看执行计划:使用SQL的SET STATISTICS IO ON和SET STATISTICS TIME O…...

可供参考的GitHub国内镜像

在配置了本地hosts文件和魔法后仍存在无法访问的问题 针对如上问题,可以使用国内的镜像地址做替换 例如: https://github.com/bubbliiiing/detr-pytorch改成 https://hub.nuaa.cf/bubbliiiing/detr-pytorch推荐使用的镜像 https://hub.yzuu.cf/ https://hub.nua…...

统计中间件稳定性指标

目前订单业务域涉及中间件:MySQL、Redis、TiDB、MQ、ES。(遗漏项请补充) 一、RDS 资源使用率 实例ID实例名称规格maxCPUavgCPUmaxDISKmaxIOPSavgIOPS活跃会话maxTPSavgTPSmaxQPSavgQPS实例风险 慢查询 慢查询会消耗大量的系统资源&#x…...

Qt Quick开发基础+实战(持续更新中…)

最近更新日期:2024/12/4 一、Qt Quick简介 写在前面: 本篇文章虽然只是作为我的学习笔记,但也作为我日后复习之用,所以会认真并详细记录,但会分重点。 1.3 新建Qt Quick Application工程 这节主要讲2个知识点&#x…...

FPGA Xilinx维特比译码器实现卷积码译码

FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)_matlab仿真后代码-CSDN博客 MATLAB 仿真…...

数据结构初阶1 时间复杂度和空间复杂度

本章重点 算法效率时间复杂度空间复杂度常见时间复杂度以及复杂度OJ练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1;return Fib(N-1) Fib(N-2); }斐…...

基于Matlab计算机视觉的车道线识别与前车检测系统研究

随着自动驾驶技术的发展&#xff0c;车道线识别和前车检测成为智能驾驶系统中的核心技术之一。本实训报告围绕基于计算机视觉的车道线识别与前车检测系统展开&#xff0c;旨在通过处理交通视频数据&#xff0c;实时检测车辆所在车道及其与前车的相对位置&#xff0c;从而为车道…...

刷蓝桥杯历年考题(更新至15届~)

第十五届 CA组省赛 AcWing5980.训练士兵 方法一&#xff1a;树状数组:O(nlogn) self-complete /*先枚举组团&#xff0c;后分析每个士兵&#xff0c;有一个特点&#xff0c;组团费用是固定的&#xff0c;那当然是让所有士兵一块训练&#xff0c;训练完的士兵也不会有损失当还…...

Stream API来提取两个字符串字段

如果您有一个包含对象的List&#xff0c;并且想要使用Java 8的Stream API来提取两个字符串字段&#xff0c;然后将这些字段的值连接成一个以逗号隔开的单个字符串或者集合List&#xff0c;您可以按照以下步骤操作&#xff1a; 假设您有一个Person类&#xff0c;其中包含两个字…...

《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因?“找不到d3dcompiler_43.dll文件”如何解决?

《无畏契约》运行时提示“d3dcompiler_43.dll丢失”是什么原因&#xff1f;“找不到d3dcompiler_43.dll文件”如何解决&#xff1f; 作为一位软件开发从业者&#xff0c;我深知在游戏运行过程中&#xff0c;遇到各种文件丢失、文件损坏和系统报错等问题是多么令人头疼。今天&a…...

社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机

摘要&#xff1a;本文聚焦于社群分享在商业领域的重要性&#xff0c;阐述其作为干货诱饵在引流方面的关键意义。详细探讨了提供有价值干货的多种方式&#xff0c;包括文字分享、问题解答以及直播分享等&#xff0c;并分析了直播分享所需的条件。同时&#xff0c;以自身经历为例…...

芯食代冻干科技研究院:创新与品质并重,推动家用冻干机高质量发展

11月25日,芯食代首届食品冻干前沿与智能化升级创新大会在江苏常州成功举办。本次大会由芯食代冻干科技研究院(江苏)有限公司与芯食代(上海)科技发展有限公司联合主办,云集学界专家教授、商界企业精英,共议家用冻干机的未来创新发展。作为创新大会,芯食代冻干科技研究院也在本次…...

【C++】栈和队列的模拟实现(适配器模式)

不论是C语言还是C&#xff0c;我们都用其对应的传统写法对栈和队列进行了模拟实现&#xff0c;现在我们要用新的方法模拟实现栈和队列&#xff0c;这个新方法就是适配器模式。 C语言传统写法&#xff1a; C语言模拟实现栈 C传统写法&#xff1a;C模拟实现栈 1.容器适配器 …...

CSS过渡练习-进度条(12)

该进度条先需要一个大盒子和一个小盒子&#xff0c;然后给大盒子与小盒子加style&#xff0c;看进度到多少就是百分之多少&#xff1b;如果要进度条从百分之五十到满格的话就加一个hover的样式&#xff08;鼠标移到链接上时添加的特殊样式&#xff09;&#xff0c;然后是想要进…...

青动CRM系统PHP+Uniapp

全面解决企业销售团队的全流程客户服务难题,旨在助力企业销售全流程精细化、数字化管理&#xff0c;全面解决企业销售团队的全流程客户服务难题&#xff0c;帮助企业有效盘活客户资源、量化销售行为&#xff0c;合理配置资源、建立科学销售体系&#xff0c;提升销售业绩。 青动…...

word如何快速创建目录?

文章目录 1&#xff0c;先自己写出目录的各级标题。2、选中目标标题&#xff0c;然后给它们编号3、给标题按照个人需求开始分级4、插入域构建目录。4.1、利用快捷键插入域构建目录4.2、手动插入域构建目录 听懂掌声&#xff01;学会了吗&#xff1f; 前提声明&#xff1a;我在此…...

【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART&#xff08;Classification and Regression Tree&#xff09; CART&#xff08;分类与回归树&#xff09;是一种用于分类和回归任务的决策树算法&#xff0c;提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集&#xff0c;从而构建一棵树。CART …...

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象&#xff0c;要将之释放掉&#xff0c;否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…...

C++:std::fstream详细介绍

std::fstream 是 C 标准库中的一个类&#xff0c;用于处理文件的输入输出操作。它可以同时进行文件的读和写操作&#xff0c;因此被称为“文件流”&#xff08;File Stream&#xff09;。它是 C 输入输出流库 iostream 的一部分&#xff0c;继承了 std::istream 和 std::ostrea…...

ndp协议简介

在IPv6中&#xff0c;ARP&#xff08;地址解析协议&#xff09;被替代为邻居发现协议&#xff08;Neighbor Discovery Protocol&#xff0c;NDP&#xff09;。NDP是IPv6网络中用于发现邻居节点&#xff08;相邻设备&#xff09;的协议&#xff0c;类似于IPv4中的ARP。但与ARP不…...

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…...

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

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

JWT 在 SaaS 系统中的作用与分布式 SaaS 系统设计的最佳实践

在现代 SaaS&#xff08;软件即服务&#xff09; 系统中&#xff0c;随着服务规模的扩大和用户需求的多样化&#xff0c;如何高效、安全地进行用户身份验证、权限控制以及租户隔离&#xff0c;成为了系统架构中的核心问题之一。**JWT&#xff08;JSON Web Token&#xff09;**作…...

docker更换容器存储位置

一&#xff1a;原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了&#xff0c;进入服务器查看发现服务运行正常&#xff0c;但是就是无法使用&#xff0c;然后我这边准备将docker服务重新启动下看看&#xff0c;发现docker服务无法重启&#xff0c;提示内存已满…...

gitlab-cicd部署安装与具体操作

一、安装 本例中是用安装包直接在ubuntu下安装的&#xff0c;也可以用docker镜像。 curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpmrpm -i gitlab-runner_amd64.rpm 安装runner后&#xff0c;需要跟在runner所在服务器安装…...

基于MFC实现的人机对战五子棋游戏

基于MFC实现的人机对战五子棋游戏 1、引言 此报告将详细介绍本次课程设计的动机、设计思路及编写技术的详细过程&#xff0c;展现我所学过的C知识以及我通过本次课程设计所学到例如MFC等知识。在文档最后我也会记录我所编写过程遇到的问题以及解决方案。 1.1 背景 五子棋是…...

mac电脑多个ssh keys共存

一、同一台电脑&#xff0c;不同域名的git仓库为什么要设置不同的ssh keys&#xff1f; 每个git仓库通常要求使用唯一的ssh key&#xff0c;以防止权限冲突和安全问题。 权限控制&#xff1a;每个git仓库的权限是独立的&#xff0c;使用不同的ssh keys可以更好的管理权限&…...

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…...

【Java-数据结构篇】Java 中栈和队列:构建程序逻辑的关键数据结构基石

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 一、引言 1. 栈与队列在编程中的角色定位 栈和队列作为两种基本的数据结构&#xff0c;在众多编程场景中都有着独特的地位。它们为数据的有序…...

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…...

URDF 发布者

URDF 发布者 #! /usr/bin/env python3 import rclpy from rclpy.node import Node import rclpy.parameter from sensor_msgs.msg import JointState from rcl_interfaces.msg import SetParametersResultimport threading import timeclass RotateWheelNode(Node):def __init…...

用于目标检测的集中式特征金字塔

摘要 https://arxiv.org/pdf/2210.02093 视觉特征金字塔在多种应用中已展现出其在有效性和效率方面的优越性。然而,现有方法过度关注层间特征交互,却忽略了经验证明有益的层内特征调节。尽管一些方法试图借助注意力机制或视觉变换器来学习紧凑的层内特征表示,但它们忽略了…...

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…...

大数据新视界 -- Hive 数据湖集成与数据治理(下)(26 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【基础数学二】整除,最大公约数约数,最小公倍数

整除 在数论中&#xff0c;一个整数 a a a 能够被另一个整数 d d d 整除&#xff0c;记做 d ∣ a d|a d∣a。 整除的性质&#xff1a; 如果 d ∣ a d | a d∣a&#xff0c;则对于任意整数 k k k 有 d ∣ k a d | ka d∣ka。如果 d ∣ a d|a d∣a 并且 d ∣ b d|b d∣…...

【lua语言基础(四)】IO模型以及补充知识

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:lua从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多lua语言的知识   &#x1f51d;&#x1f51d; lua语言基础 1. 简单的IO模型2…...

Python知识分享第十九天-网络编程

网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…...

【JuMP.jl】非线性规划

[JuMP] 03 非线性规划 非线性规划模型 非线性规划问题是线性规划问题的自然推广&#xff0c; 在实际的工程问题中&#xff0c;优化问题中的目标函数与约束不会总是线性函数&#xff0c;因此非线性规划的求解功能是必要的。 min ⁡ x ∈ R n f 0 ( x ) s.t. l j ≤ f j ( x ) ≤…...

网络(TCP)

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

40分钟学 Go 语言高并发:服务性能调优实战

服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标&#xff0c;确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…...

5092 星际争霸

逆序对排序&#xff1b; 字符串遍历&#xff1b; pair 特点&#xff1a; 两个值&#xff0c;第一个是字符串&#xff0c;第二个是逆序对数。而且没有重复的字符串。 #include<bits/stdc.h>using namespace std; typedef long long ll; const int N1e35; #define x f…...

AUTOSAR AP 汽车API知识点总结(Automotive API )R24-11

汽车API知识点总结 一、背景与目标 背景:智能互联汽车正逐步依赖远程诊断、软件更新等功能以确保行驶安全,并且用户已习惯于通过智能设备中的应用程序控制连接设备。虽然AUTOSAR标准支持车辆软件的可更新性,但尚未提供将AUTOSAR应用产生的数据和功能安全可靠地暴露给非AUTO…...

vue2:Cascader 级联选择器中加载两种不同的数据结构

前言 因UI调整,需要将el-tree控件更换为级联选择器,而在原树形控件中,加载了两种不同的数据结构,(参见vue2:树形控件el-tree中加载两种不同结构的数据_vue2 树形插件-CSDN博客)所以现在级联选择器中也需要加载这两种不同的数据结构。 问题 原本以为处理方式差不多,在…...

【xLSTM-Transformer序列分类】Pytorch使用xLSTM-Transformer对序列进行分类源代码

Python, Pytorch使用xLSTM-Transformer对序列进行分类源代码。xLSTM是不久前LSTM团队提出来的新模型&#xff0c;将xLSTM融入Transformer的Encoder中&#xff0c;创新型较强。另外&#xff0c;Transformer是完整的&#xff0c;即使用了Encoder、Decoder和Embedding所有模块。 …...

TDengine 签约安徽智质,助力海螺水泥智慧工厂升级

在当前制造业数字化转型的浪潮中&#xff0c;如何实现智能化、自动化与数据驱动的高效生产&#xff0c;成为企业提升竞争力的关键。尤其是在水泥、钢铁等传统行业&#xff0c;随着技术的不断进步&#xff0c;如何打破数据孤岛、提升生产管理效率&#xff0c;已经成为许多工厂亟…...

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…...

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…...

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树&#xff1f; AVL树是一种自平衡的二叉搜索树&#xff0c;其发明者是Adelson-Velsky和Landis&#xff0c;因此得名“AVL”。AVL树是首个自平衡二叉搜索树&#xff0c;通过对树的平衡因子进行控制&#xff0c;确保任何节点的左右子树高度差最多为1&…...

L15.【LeetCode笔记】相同的树

目录 1.题目 代码模板 2.分析 通过合理的if判断分类讨论两个根节点 1.首先,p和q都为NULL的情况最好排除 2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL 写法1 写法2 3.只剩下最后一种情况:p和q都不为NULL 3.代码 提交结果 1.题目 https…...

【算法】【优选算法】位运算(下)

目录 一、&#xff1a;⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算&#xff0c;异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、&#xff1a;⾯试题 01.01.判定字符是…...