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

SQLMesh 系列教程4- 详解模型特点及模型类型

SQLMesh 作为一款强大的数据建模工具,以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型,帮助读者快速了解其强大功能。我们将深入探讨不同模型类型(如增量模型、全量模型、SCD Type 2 等)的适用场景和优势,并通过实际示例展示如何利用这些模型高效加载数据。无论你是数据工程师还是数据科学家,SQLMesh 都能为你提供强大的支持。让我们一起探索 SQLMesh 的魅力,解锁高效数据处理的新可能!

SQLMesh 模型特点

SQLMesh 支持的数据模型具有以下特点,这些特点使得 SQLMesh 在数据建模和数据处理方面非常灵活且高效:

1. 灵活性

  • 多种模型类型:SQLMesh 支持多种模型类型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEYFULLVIEWSCD_TYPE_2 等),每种模型类型都有其特定的用途和适用场景。这种多样性使得用户可以根据数据的特性和业务需求选择最合适的数据加载和处理方式。
  • 可配置性:每种模型类型都可以通过配置参数(如时间列、唯一键、分区键等)进行定制,以满足特定的业务逻辑和性能要求。

2. 增量处理能力

  • 增量加载:SQLMesh 的增量模型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEY)能够根据时间范围或唯一键进行增量处理,只处理新增或更新的数据,从而显著节省计算资源和时间。
  • 动态时间范围:增量模型支持动态时间范围过滤(通过 @start_date@end_date 等宏变量),能够自动处理时间范围内的数据,减少不必要的计算。

3. 高效性和性能优化

  • 增量更新:增量模型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_PARTITION)通过只处理缺失或更新的数据,避免了全量数据的重新计算,从而提高了处理效率。
  • 分区支持:某些模型类型(如 INCREMENTAL_BY_PARTITION)支持分区键,能够按分区键批量处理数据,进一步优化性能。
  • 自动优化:SQLMesh 会自动在模型查询中添加时间范围过滤器,防止数据泄漏,并减少不必要的数据处理。

4. 数据一致性和准确性

  • 时间列管理:SQLMesh 强调时间列的重要性,要求时间列使用 UTC 时间,以确保与调度器和宏变量的正确交互。这种标准化的时间管理方式有助于避免时区相关错误。
  • 幂等性:对于某些模型类型(如 INCREMENTAL_BY_TIME_RANGE),SQLMesh 推荐确保查询的幂等性,以避免数据重述时出现意外结果。
  • 数据版本管理:SCD Type 2 模型通过 valid_fromvalid_to 列记录数据的历史版本,支持对数据变更的跟踪和回溯,确保数据的完整性和准确性。

5. 易用性和可维护性

  • SQL 优先:SQLMesh 使用标准 SQL 语法定义模型,使得数据工程师可以使用熟悉的 SQL 语言进行建模,而无需学习新的语言或框架。
  • 模块化和重用EMBEDDED 模型允许将公共逻辑作为子查询注入到其他模型中,提高了代码的复用性和可维护性。
  • 自动管理:SQLMesh 自动处理模型的依赖关系和执行顺序,减少了手动维护的复杂性。

6. 支持复杂业务逻辑

  • 自定义逻辑:SQLMesh 支持复杂的 SQL 查询和自定义逻辑(如 when_matched 表达式),能够满足复杂的业务需求。
  • 动态过滤:通过 merge_filter 等特性,用户可以动态地过滤数据,避免全表扫描,进一步优化性能。

7. 与主流数据库和引擎的兼容性

  • 广泛支持:SQLMesh 支持多种数据库和计算引擎(如 BigQuery、Databricks、Snowflake、Postgres、Redshift 等),并且针对不同引擎提供了优化的实现。
  • 适应性强:SQLMesh 的模型定义和配置方式能够适应不同数据库的语法和特性,提供了良好的跨平台兼容性。

8. 数据历史和变更管理

  • SCD Type 2 支持:SQLMesh 提供了强大的 SCD Type 2 模型支持,能够记录数据的历史变更,支持按时间查询特定版本的数据,满足数据仓库中对历史数据管理的需求。
  • 硬删除处理:SCD Type 2 模型支持硬删除的处理逻辑,用户可以根据需求选择是否记录删除的时间点,从而在数据历史中保留或忽略删除操作。

9. 可扩展性和可定制性

  • 扩展性:SQLMesh 的模型定义和执行机制支持大规模数据处理和复杂的 ETL 流程。
  • 可定制性:用户可以通过自定义宏、配置参数和模型类型来扩展 SQLMesh 的功能,以满足特定的业务需求。

10. 数据安全和完整性

  • 数据重述保护:某些模型类型(如 INCREMENTAL_BY_UNIQUE_KEYSCD_TYPE_2)默认禁用部分数据重述,以防止意外数据丢失。
  • 数据完整性检查:SQLMesh 提供了机制来确保数据在加载和更新过程中的完整性,避免数据丢失或重复。

这些特点使得 SQLMesh 成为一个强大且灵活的数据建模工具,能够满足从简单到复杂的数据处理需求,同时优化性能和资源使用。

SQLMesh 模型类型

SQLMesh 支持以下几类模型,每种模型都有其特定的用途和配置方式。以下是模型的分类及示例说明:
在这里插入图片描述

1. INCREMENTAL_BY_TIME_RANGE

  • 用途:基于时间范围增量加载数据,适用于事件、日志或事务等不可变数据。

  • 特点:仅处理缺失的时间区间,节省时间和成本。

  • 要求:必须指定时间列(time_column),并且查询中需要包含 WHERE 子句以过滤时间范围。

  • 示例

    sql复制

    MODEL (name db.events,kind INCREMENTAL_BY_TIME_RANGE (time_column event_date)
    );
    SELECTevent_date::TEXT as event_date,event_payload::TEXT as payload
    FROM raw_events
    WHEREevent_date BETWEEN @start_ds AND @end_ds;
    

2. INCREMENTAL_BY_UNIQUE_KEY

  • 用途:基于唯一键增量加载数据,适用于需要根据唯一键更新或插入数据的场景。

  • 特点:新数据会根据唯一键进行插入或更新,支持复合键。

  • 示例

    sql复制

    MODEL (name db.employees,kind INCREMENTAL_BY_UNIQUE_KEY (unique_key name)
    );
    SELECTname::TEXT as name,title::TEXT as title,salary::INT as salary
    FROM raw_employees;
    

3. FULL

  • 用途:每次运行时完全刷新数据,适用于较小的数据集或无需保留历史记录的聚合表。

  • 特点:简单易用,但不适合大数据集,因为每次运行都会重新计算所有数据。

  • 示例

    sql复制

    MODEL (name db.salary_by_title_agg,kind FULL
    );
    SELECTtitle,AVG(salary)
    FROM db.employees
    GROUP BY title;
    

4. VIEW

  • 用途:创建虚拟视图,不存储实际数据。

  • 特点:每次引用时都会重新计算,适合轻量级查询。

  • 示例

    sql复制

    MODEL (name db.highest_salary,kind VIEW
    );
    SELECTMAX(salary)
    FROM db.employees;
    

5. EMBEDDED

  • 用途:共享公共逻辑,不创建实际的数据资产。

  • 特点:作为子查询注入到下游模型中。

  • 示例

    sql复制

    MODEL (name db.unique_employees,kind EMBEDDED
    );
    SELECT DISTINCTname
    FROM db.employees;
    

6. SEED

  • 用途:用于静态 CSV 数据集,作为种子数据加载到项目中。
  • 特点:适合初始化数据或静态数据。
  • 示例:无具体 SQL 示例,但可以通过配置文件指定 CSV 文件路径。

7. SCD_TYPE_2_BY_TIME

  • 用途:支持基于时间戳的慢变维度(SCD Type 2),用于跟踪记录的历史变更。

  • 特点:通过 valid_fromvalid_to 列记录历史版本。

  • 示例

    sql复制

    MODEL (name db.menu_items,kind SCD_TYPE_2_BY_TIME (unique_key id)
    );
    SELECTid::INT,name::STRING,price::DOUBLE,updated_at::TIMESTAMP
    FROM stg.current_menu_items;
    

8. SCD_TYPE_2_BY_COLUMN

  • 用途:支持基于列值变更的慢变维度(SCD Type 2),适用于没有时间戳的表。

  • 特点:通过指定列的值变化来检测记录的变更。

  • 示例

    sql复制

    MODEL (name db.menu_items,kind SCD_TYPE_2_BY_COLUMN (unique_key id,columns [name, price])
    );
    SELECTid::INT,name::STRING,price::DOUBLE
    FROM stg.current_menu_items;
    

9. INCREMENTAL_BY_PARTITION

  • 用途:基于分区键增量加载数据,适用于需要按分区键批量更新数据的场景。

  • 特点:新数据会根据分区键插入或替换现有分区数据。

  • 示例

    sql复制

    MODEL (name db.events,kind INCREMENTAL_BY_PARTITION,partitioned_by region
    );
    SELECTevent_date::TEXT as event_date,event_payload::TEXT as payload
    FROM raw_events
    WHEREregion = @region;
    

10. EXTERNAL

  • 用途:用于指定外部表的元数据,不直接存储数据。
  • 特点:适合引用外部数据源。
  • 示例:无具体 SQL 示例,但可以通过配置文件定义外部表。

11. MANAGED

  • 用途:由底层数据库引擎管理数据生命周期。
  • 特点:适合需要底层引擎优化的场景。
  • 示例:无具体 SQL 示例,但可以通过配置文件定义。

这些模型类型提供了丰富的选择,可以根据具体的数据处理需求选择合适的模型种类。

SQLMesh模型加载数据示例

使用 SQLMesh 进行数据加载涉及以下几个关键步骤:定义模型(Models)配置数据加载逻辑执行计划(Plan)**和**应用到目标数据库(Apply)。以下是详细的步骤说明和示例,帮助你快速上手 SQLMesh 的数据加载流程。

1. 安装 SQLMesh

在开始之前,确保你已经安装了 SQLMesh。可以通过以下命令安装:

bash复制

pip install sqlmesh

2. 定义模型(Models)

SQLMesh 使用 SQL 文件来定义模型,每个模型文件对应一个数据表或视图。模型文件中包含模型的元数据(如模型类型、分区键等)和 SQL 查询。

示例:定义一个增量模型

假设我们有一个日志数据表 raw_events,我们希望按时间范围增量加载数据到 db.events 表中。

  1. 创建模型文件:在项目目录下创建一个 .sql 文件,例如 models/events.sql

  2. 定义模型

    sql复制

    MODEL (name db.events,kind INCREMENTAL_BY_TIME_RANGE (time_column event_date)
    );SELECTevent_date::TEXT AS event_date,event_payload::TEXT AS payload
    FROM raw_events
    WHERE event_date BETWEEN @start_ds AND @end_ds;
    
    • MODEL 块定义了模型的元数据,包括模型名称和类型。
    • INCREMENTAL_BY_TIME_RANGE 表示这是一个基于时间范围的增量模型。
    • @start_ds@end_ds 是 SQLMesh 提供的宏变量,用于动态过滤时间范围内的数据。

3. 配置 SQLMesh 项目

SQLMesh 使用 sqlmesh.yaml 文件来配置项目的基本信息,例如数据库连接、环境设置等。

示例:sqlmesh.yaml 配置文件

yaml复制

default_environment: dev
environments:dev:dialect: postgresconnection: postgresql://username:password@localhost:5432/dev_db
  • default_environment 指定了默认环境。
  • environments 定义了不同环境的数据库连接信息。

4. 执行计划(Plan)

在定义好模型和配置文件后,需要生成一个执行计划。计划会根据模型定义和目标数据库的状态,生成需要执行的 SQL 语句。

示例:生成计划

在项目根目录下运行以下命令:

bash复制

sqlmesh plan
  • SQLMesh 会根据模型定义和目标数据库的状态,生成一个执行计划。
  • 你可以通过 --start--end 参数指定计划的时间范围。

5. 应用计划到目标数据库(Apply)

生成计划后,需要将计划应用到目标数据库中,以实际执行数据加载。

示例:应用计划

bash复制

sqlmesh apply
  • 这个命令会将计划中的 SQL 语句应用到目标数据库中。
  • 数据将根据模型定义的逻辑(如增量加载)被加载到目标表中。

6. 其他常用操作

数据重述(Restate)

如果需要重新加载某个模型的数据(例如修复数据问题),可以使用 restatement 命令:

bash复制

sqlmesh plan --restate-model db.events
sqlmesh apply
回填数据(Backfill)

如果需要补全历史数据,可以指定时间范围:

bash复制

sqlmesh plan --start 2024-01-01 --end 2024-01-31
sqlmesh apply

7. 监控和维护

SQLMesh 提供了日志和监控功能,帮助你跟踪数据加载的进度和状态。你可以通过 SQLMesh 的日志文件或集成的监控工具(如 Prometheus)来监控数据加载过程。

示例总结

  1. 定义模型:在 .sql 文件中定义模型的元数据和 SQL 查询。
  2. 配置项目:通过 sqlmesh.yaml 文件配置数据库连接和环境。
  3. 生成计划:运行 sqlmesh plan 生成执行计划。
  4. 应用计划:运行 sqlmesh apply 将计划应用到目标数据库。
  5. 其他操作:根据需要进行数据重述或回填。

通过以上步骤,你可以使用 SQLMesh 高效地进行数据加载和管理。

最后总结

本文深入介绍了 SQLMesh 模型的特点和类型,并通过实际示例展示了如何利用这些模型高效加载数据。SQLMesh 提供的多种模型类型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEYSCD_TYPE_2 等)不仅满足了不同数据处理场景的需求,还通过增量处理和自动优化显著提升了数据加载的效率。希望本文的介绍和示例能帮助你更好地理解和使用 SQLMesh,从而在数据工程实践中实现更高效、更灵活的数据管理和加载。

相关文章:

SQLMesh 系列教程4- 详解模型特点及模型类型

SQLMesh 作为一款强大的数据建模工具,以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型,帮助读者快速了解其强大功能。我们将深入探讨不同模型类型(如增量模型、全量模型、SCD Type 2 等&#xff0…...

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息 1.…...

hbase合并队列超长问题分析

问题现象 hbase集群合并队列超长,有节点上合并任务已经运行超过1天未结束,合并队列总长不断增加。 问题分析 参数配置: 配置参数默认值含义hbase.hregion.memstore.flush.size128MMemStore达到该值会Flush成StoreFilehbase.hregion.memstore.block.multiplier4当region中…...

FPGA的星辰大海

编者按 时下风头正盛的DeepSeek,正值喜好宏大叙事的米国大统领二次上岗就业,OpenAI、软银、甲骨文等宣布投资高达5000亿美元“星际之门”之际,对比尤为强烈。 某种程度上,,是低成本创新理念的直接落地。 包括来自开源社区的诸多赞誉是,并非体现技术有多“超越”,而是…...

认识vue-admin

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最…...

STM32、GD32驱动TM1640原理图、源码分享

一、原理图分享 二、源码分享 /************************************************* * copyright: * author:Xupeng * date:2024-07-18 * description: **************************************************/ #include "smg.h"#define DBG_TAG "smg&…...

spring boot 对接aws 的S3 服务,实现上传和查询

1.aws S3介绍 AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能: 1.1. 对象存储 对象存储模型:S3使用…...

PH热榜 | 2025-02-12

1. FirstHR 2.0 with HR Copilot 标语:小型企业的一站式人力资源平台 介绍:对小型企业来说,FirstHR是一个人力资源平台,专注于招聘和团队发展,并融合了一点人工智能技术。 产品网站: 立即访问 Product …...

通过例子学 rust 个人精简版 1-1

1-1 Hello World fn main() {println!("Hello World!");// 动手试一试println!("Im a Rustacean!"); }Hello World! Im a Rustacean!要点1 :println 自带换行符 注释 fn main() {let x 5 /* 90 */ 5;println!("Is x 10 or 100? x …...

HTTP的前世今生:如何塑造现代互联网的交互方式?

一、关于HTTP 1.1 简介 “没有HTTP协议,就没有今天的互联网。” 从简单的文本传输到支撑全球数十亿设备的实时交互,HTTP协议始终是Web世界的核心纽带。本文将深入剖析其设计思想、演进历程及底层工作原理。 HTTP(HyperText Transfer Protoco…...

Flutter_学习记录_动画的简单了解

用AnimationController简单实现如下的效果图&#xff1a; 1. 只用AnimationController实现简单动画 1.1 完整代码案例 import package:flutter/material.dart;class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});overrideState<AnimationDe…...

【java】for (int num : numbers) { System.out.print(num + “ “); } for里的是什么意思

for (int num : numbers) 是 Java 中的一种 增强型 for 循环&#xff08;也称为 for-each 循环&#xff09;。它的作用是遍历数组或集合中的每一个元素&#xff0c;并对每个元素执行循环体中的操作。 1. 增强型 for 循环的语法 java Copy for (元素类型 变量名 : 数组或集合…...

内容中台驱动企业CMS架构优化与高效策略

内容概要 在数字化转型浪潮中&#xff0c;企业内容管理系统&#xff08;CMS&#xff09;正面临从单一内容存储向智能化、协同化方向演进的迫切需求。通过引入内容中台架构&#xff0c;企业能够有效整合元数据管理、版本控制与智能协作能力&#xff0c;从而优化传统CMS的底层逻…...

我用 Cursor 开发了一款个人小记系统

https://note.iiter.cn 项目背景 在日常工作和学习中,我们经常需要快速记录一些想法、收藏一些有用的链接或者保存一些重要的文本、图片内容。虽然市面上已经有很多笔记软件,但我想要一个更轻量、更简单的工具,专注于快速记录和智能检索。于是我开发了这款个人小记系统。 系统…...

百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中

百问网(100ask)提供的烧写工具的原理 具体的实现原理见链接 http://wiki.100ask.org/100ask_imx6ull_tool 为了防止上面这个链接失效&#xff0c;我还对上面这个链接指向的页面保存成了mhtml文件&#xff0c;这个mhtml文件的百度网盘下载链接&#xff1a; https://pan.baidu.c…...

doris:异步物化视图概述

物化视图作为一种高效的解决方案&#xff0c;兼具了视图的灵活性和物理表的高性能优势。 它能够预先计算并存储查询的结果集&#xff0c;从而在查询请求到达时&#xff0c;直接从已存储的物化视图中快速获取结果&#xff0c;避免了重新执行复杂的查询语句所带来的开销。 使用场…...

图像缩放的双线性插值实现方式

1、双线性插值概念 双线性插值是一种用于在二维网格上进行插值的方法&#xff0c;适用于图像处理、计算机图形学等领域。它通过利用四个邻近点的已知值&#xff0c;估算出任意点的值。双线性插值在两个方向&#xff08;通常是水平和垂直&#xff09;上分别进行线性插值&#x…...

深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石

深入剖析 Vue 的响应式原理&#xff1a;构建高效 Web 应用的基石 在前端开发的广阔天地里&#xff0c;Vue.js 凭借其简洁易用的特性和强大的功能&#xff0c;成为众多开发者的心头好。其中&#xff0c;响应式原理作为 Vue 的核心亮点之一&#xff0c;让数据与视图之间实现了高…...

40.日常算法

1.无重复字符的最长子串 题目来源 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 class Solution { public:int lengthOfL…...

CAS单点登录(第7版)11.SSO SLO

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; SSO & SLO 安装IDEA Download IntelliJ IDEA – The IDE for Professional Development in Java and Kotlin 安装Maven Download Apache Maven – Maven MAVEN_HOMED:\apache-maven…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...