Oracle--SQL性能优化与提升策略
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、导致性能问题的内在原因
系统性能问题的底层原因主要有三个方面:
- CPU占用率过高导致资源争用和等待
- 内存使用率过高导致内存不足并需要使用磁盘虚拟内存
- I/O占用率过高导致磁盘访问需要等待。
性能影响的优先级从高到低依次是CPU-->内存-->I/O。在PL/SQL性能优化中,重点是减少I/O瓶颈,即尽量减少对磁盘I/O的访问
根据上述分析,PL/SQL优化的核心思想可以总结为以下几点:
- 避免使用过多复杂的SQL脚本,以减少系统的解析过程
- 避免进行无用的计算,例如避免出现死循环等低效代码
- 避免浪费内存空间,例如避免执行不必要的SQL脚本,以免导致内存不足
- 充分利用内存中的计算和访问速度快的优势
- 尽可能减少磁盘的访问数据量
- 尽可能减少磁盘的访问次数,这是PL/SQL优化中的重要原则
二、如何进行SQL优化
1、选择最有效率的表名顺序
Oracle的解析器从右到左处理FROM子句中的表名,因此最后写的表(基础表 driving table)最先处理。在多表查询时,建议将记录最少的表作为基础表,以减少连接操作的数据量。Oracle会通过排序和合并方式连接表:先扫描并排序基础表,再扫描其他表并与基础表匹配。这种处理顺序对查询性能至关重要,建议按照此规则编写SQL语句。目前主要使用基于成本的优化器(CBO),它会自动评估最佳执行计划,但遵循上述规则有助于提升SQL效率。
--例如:员工表emp有16384条记录,而部门表dept有1条记录,选择dept作为基础表 select count(*) from emp,dept; --选择dept作为基础表耗时0.96sselect count(*) from dept,emp; --选择emp作为基础表耗时26.09s
2、WHERE子句中的连接顺序
ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前
--低效:select dept.deptno,emp.jobfrom emp.deptwhere emp.job='MANAGER' AND emp.deptno=dept.deptno;--优化后:select dept.deptno,emp.jobfrom emp.deptwhere emp.deptno=dept.deptno AND emp.job='MANAGER';
3、SELECT子句中避免使用'*'
在SELECT子句中使用动态SQL列引用“*”虽然方便,但效率低下。Oracle解析时会通过查询数据字典将“”转换为所有列名,这增加了额外的开销和时间成本。因此,建议在SELECT子句中尽量避免使用“”,而是明确列出所需的列名,以提高查询效率。
4、用EXITS 替代 IN
使用EXISTS替换IN效果有时不明显,但在基础表查询需联接另一表时,EXISTS通常提高效率,因EXISTS找到匹配即停止搜索
--低效select *from table_name1where column1 in(select column1 from table_name2where column2=str_column2and column3='xxxx');--优化后:select *from table_name1where exists(select 1 from table_name2where column1=table_name2.column1and column2=str_column2and column3='xxxx');
5、用 NOT EXISTS 替代 NOT IN
Oracle 10g前 NOT IN 效率低,10g 虽改进但仍存在问题。建议用 NOT EXISTS 替代 NOT IN ,因 NOT IN 对子查询表全表遍历且需内部排序合并,效率低。改写为 NOT EXISTS 可提升效率
--低效:select * from table_name1where column1 NOT IN(select column1 from table_name2where column3='xxxx');--优化后:select *from table_name1where not exists(select 1 from table_name2where column1=table_name2.column1and column3='xxxx');
6、用表连接替换 EXISTS
在子查询的表和主表查询是多对一的情况,一般采用表连接的方式比 EXISTS 更有效率
--低效:select table name1.*from table name1where exists (select 1 from table_name2where column1 =table name1.column1and column2='xxxx'and column3='xxxxxx');--优化后:SELECT table_name1.*FROM table namel,table name2 Wheretable_name1.column1=table_name2.column1and table_name2.column2='xxxx'and column3='xxxx';
7、减少对表的查询
该问题是我们编程中出现过的问题,请大家一定注意,并且该类问题优化可以带来较大性能的提升
--低效:cursor cur_table_lj1 isselect column1from table1where column1 = str_column1 and column2='1111';cursor cur_table1_lj2 isselect column1from table1where column1 =str_column1 and column2='2222';for rec_lj1 in cur_table1 loop业务逻辑1处理end loop;for rec_lj2 in cur_table2 loop业务逻辑2处理end loop;--优化后:cursor cur_tablel_lj1 isselect column1,column2from table1where column1 =str_columnl and column2 in ('11111','22222');for rec_ljl in cur_tablel lj1 loopif rec_lj1.column2='11111' then业务逻辑1处理.…..end if;if rec lj1.column2='22222' then业务逻辑2处理....end if,end loop;
高效的做法使用同样的条件(或者说是索引)只访问一次磁盘,低效的做法访问了2次磁盘,这样速度差 别将近2倍。
8、避免循环(游标)里面嵌查询
游标中不能有游标或update、delete等语句,只能有select语句,但在实际编程中难以完全避免,需尽量减少。优化方法是将游标循环中的查询语句提前到游标查询中一次性查询出来,减少磁盘访问次数,提升效率。如果无法避免游标中使用查询语句,要确保查询语句使用索引,提高查询速度。
9、尽量用 union all 替换 all
Union 会去掉重复的记录,会有排序的动作,会浪费时间。因此在没有重复记录的情况下或可以允许有重,复记录的话,要尽量采用 uoion all 来关联
10、group by 优化
Group by需要查询后分组,速度慢影响性能,如果查询数据量大,并且分组复杂,这样的査询语句在性能上是有问题的。采用 group by的也一定要进行优化
--低效:select table1.column1,table2.column2table2.column3,sum(column5),table1.column4from table1,table2where table1.column1=table2.column1and table1.column4='xxxxxx'group py table1.column1,table2.column2table2.column3,table2.column4--优化后:select table1.column1,table2.column2,table2.column3,gzze,table1.column4from(select column1,sum(column5) gzzefrom table1 group by column1) table1,table2where table1.column1=table2.column1and column4='xxxx';
11、尽量避免用 order by
使用 ORDER BY 会因查询后排序而拖慢速度,尤其数据量大时。尽管有时无法避免使用 ORDER BY ,但需注意排序列表应符合索引,这样能显著提升速度。
12、用where 子句替换Having 子句
避免使用HAVING子句,因为它会在检索完所有记录后才对结果集进行过滤,这个过程需要排序、总计等操作。如果能通过WHERE子句限制记录数量,就能减少这方面的开销。
--低效:select column1,count(1) from table1group by column1having column1 in ('1','2');--优化后:select column1,count(1) from table1where column1 in ('1','2')group by column1;
HAVING 中的条件一般用于对一些集合函数的比较,如 COUNT() 等等。除此而外,一般的条件应该写在 WHERE 子句中
13、使用表的别名(alias)
在SQL语句中连接多个表时,使用表的别名并将其前缀于每个列名,可减少解析时间及因列名歧义引发的语法错误。
14、COMMIT 使用
- 提交频率过高会浪费时间,尽管单次提交时间短。
- 提交可释放资源,在大量数据更新时需及时提交。
--cur_table1 有5000万数据n_count :=0For arec in cur_table1 loopInsert into table ...n_count := n_count + 1;If n_count = = 100000 then --10万一提交commit;n_count := 0End if;End loop;Commit;
15、减少多表关联
- 表关联越多,查询速度越慢,建议表关联不超过3个(子查询也算表关联)。
- 大数据量表关联会影响索引效率,可采用建立临时表的方法来提高速度。
三、索引使用优化
1、避免在索引列上使用函数或运算
在实际编程中要注意:在索引列上使用函数或运算,查询条件不会使用索引。
--不使用索引select * from table1where column1='xxx'and to_char(column2,'yyyymm')='200801';或者select * from table1where column1='xxx'and column2+1=sysdate;--使用索引select * from table1where column1='xxx'and column2=to_date('200801','yyyymm');或者select * from table1where column1='xxx'and column2=sysdate -1;
2、避免改变索引列的类型
索引列的条件如果类型不匹配,则不能使用索引。
3、避免在索引列上使用NOT
避免在索引列上使用 NOT , NOT 不会使查询条件使用索引。对于 != 这样的判断也不能使用索引,因为索引只能告诉你什么存在于表中,而不能告诉你什么不存在于表中。
--低效:select * from table1 where not column1='10';--优化后:select * from table1 where column1 in ('20','30');
4、用>=替代>
虽然效果不是特别明显,但建议采用这种方式
--低效:select * from table1 where column1 > '10';--优化后:select * from table1 where column >= '20';
特别说明:两者的区别在于,前者 DBMS 首先定位到 column1=10的记录并且向前扫描到第一个column1 大于 10 的记录,而后者 DBMS 将直接跳到第一个 column1 等于 20 的记录
5、避免在索引列上使用 IS NULL和IS NOT NULL
在Oracle中,索引列使用 IS NULL 或 IS NOT NULL 时不会利用索引,因为空值不存储于索引列。这会导致Oracle停用索引
--低效:select * from table1 where column1 is not null;--优化后:select * from table1 where column1 in ('10','20','30');
6、带通配符(%)的like语句
%在常量前面索引就不会使用。
--不使用索引:select * from table1 where column1 like '%210104';select * from table1 where column1 like '%210104%';--使用索引:select * from table1 where column1 like '210104%';
7、总是使用索引的第一个列
如果索引是建立在多个列上,只有在它的第一个列被 where 子句引用时,优化器才会选择使用该索引。
--如:table1的复合索引(column1,column2,column3)--低效(不会使用索引):select * from table1 where column2='110' and column3='200801';--优化后(会使用索引):select * from table1 where column1 = '10001000';
如果不使用索引第一列基本上不会使用索引,使用索引要按照索引的顺序使用,另外使用复合索引的列越多,查询的速度就越快
8、 关于索引建立
索引可大幅提升查询速度,但也占用空间。过多索引会影响 INSERT 、 DELETE 和 UPDATE 操作的速度,因这些操作会改变索引顺序,需Oracle调整,导致性能下降。因此,要合理创建有效索引,编程时符合索引规则,而非让索引适应编程。
示例:在某项目数据转换中,采用游标循环插入2000万条数据耗时4小时,因目标表索引过多。解决方法是先删除索引再执行转换脚本,不到1小时完成,重建所有索引仅需半小时。
四、对于千万级的大表应该怎么优化
1、制定优化方案
针对Oracle数据库千万级大表的读、写、计算优化,可采取以下措施:
优化读:
- 建立合适索引,使用索引覆盖查询避免全表扫描。
- 使用分区表,将大表拆分,查询时只需扫描部分数据。
- 增加内存,扩大数据库缓存区,减少磁盘I/O操作。
- 优化SQL语句,避免子查询、减少连接操作。
优化写:
- 使用并行写入,将数据写入多个表或节点。
- 采用批量写入,减少写入操作次数。
- 减少索引数量,避免过多索引影响写入性能。
- 避免使用触发器,减少额外的I/O操作。
优化计算:
- 使用分布式计算,分散计算任务到多个节点。
- 采用并行计算,将任务划分成多个子任务并行执行。
- 使用合适的数据结构,减少计算时间。
- 优化SQL语句,减少计算操作的数据量。
2、优化方案总结
总结优化方案的几种方法:
- 建立合适的索引:索引可提升查询速度,但过多或不合适的索引会影响数据库性能,需根据实际情况合理建立。
- 分区表:将大表分成多个小表,提高查询速度和维护效率。
- 优化SQL语句:减少数据库的I/O操作,提高查询效率。可采用优化查询语句、查询条件,避免使用子查询等方式。
- 增加内存:扩大数据库缓存区和内存,减少磁盘I/O操作,提高查询效率。
- 优化磁盘I/O:使用RAID技术、SSD硬盘等方式提升磁盘I/O速度,增强数据库性能。
学习永无止境,让我们共同进步!!
相关文章:
Oracle--SQL性能优化与提升策略
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面: CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…...
drupal7可以从测试环境一键部署到生产环境吗
Drupal 7 本身并没有“内建的一键部署功能”,所以“从测试环境一键部署到生产环境”不能完全自动化完成,尤其是涉及数据库、配置和文件系统时。但你可以通过一些工具和方法实现接近“一键部署”的效果 ✅ 🚧 为什么不能直接一键部署ÿ…...
vue项目中axios统一或单独控制接口请求时间
先说统一 这里将请求时间统一控制在12秒 // 使用由库提供的配置的默认值来创建实例 // 此时超时配置的默认值是 0 const axiosInstance axios.create()// 覆写库的超时默认值 // 现在,在超时前,所有请求时间统一控制在10秒 axiosInstance.defaults.ti…...
chromedp 反反爬设计方案
二、基础防护层实现 1. 浏览器特征伪装 opts : append(chromedp.DefaultExecAllocatorOptions[:],// 禁用自动化特征chromedp.Flag("disable-blink-features", "AutomationControlled"),chromedp.Flag("useAutomationExtension", false),// 随…...
OpenLDAP 管理 ELK 用户
文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射,所以需先创建几个以 ELK 的角色…...
深度解析MQTT源码架构与AIGC场景融合实战
一、结构体内存优化:支撑千万级设备连接 1.1 紧凑内存布局设计 classDiagramclass MQTTClient_message {char struct_id[4]int struct_versionvoid* payloadint payloadlenint qosint retainedint dupint msgidMQTTProperties properties}note for MQTTClient_mes…...
Node.js 操作 ElasticSearch 完整指南:从安装到实战
本文将手把手教你如何搭建 ElasticSearch 环境,并通过 Node.js 实现高效数据检索。包含 10 个可直接复用的代码片段,助你快速掌握搜索、聚合等核心功能! 环境搭建篇 1. ElasticSearch 安装要点 下载 es下载连接 下载下来后,进…...
Python+区块链:如何打造智能化资产管理系统?
Python+区块链:如何打造智能化资产管理系统? 在当今数字经济时代,区块链资产管理已成为金融科技、去中心化金融(DeFi)以及企业资金流转的关键应用。传统的资产管理往往依赖于中心化机构,存在数据透明度低、效率受限、管理成本高等问题,而区块链技术的出现,为资产管理提…...
Sentinel源码—8.限流算法和设计模式总结一
大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器:缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的,比如秒杀抢购。具体就是对并发请求进行限…...
SpringMVC入门
1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想,SpringMVC即是一种框架,也是一种思想,将前后端彻底分离,后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构,MVC是web开发…...
MYSQL之库的操作
创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...
并发设计模式实战系列(3):工作队列
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet 问题解决: 用爱思助手连接手机,点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧࿰…...
用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday
1、背景与动机 只要你的服务接收并回显用户生成内容(UGC)——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS(Cross‑Site Scripting)攻击风险。浏览器在解析 HTML 时会执行脚本;如果不做清理&#…...
MySQL基本查询与数据操作全面解析
目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询(慎用) 指定列查询 表达式查询 结果去重 3.2 条件查询(WHERE子句&#…...
《C++ 模板:泛型编程的核心》
C模板详解 模板是C中实现泛型编程的重要特性,它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...
Web3实战:从零开发你的ERC20代币合约
区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈,手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币,并部署到以太坊Sepolia测试网。以下是完整开发路线图: 一、ERC20代币的…...
简述大疆无人机对接
文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言,对接大疆的…...
docker-compose搭建kafka
1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...
FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载
FramePack 是斯坦福大学主导开发的视频生成框架,是一种用于视频生成的下一帧(下一帧部分)预测神经网络结构,可以逐步生成视频。FramePack 主要开发者之一,就是业内大名鼎鼎的张吕敏大佬,AI领域的“赛博佛祖…...
开发网页程序时预览时遇到跨域问题解决方法
CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...
【音视频】FFmpeg内存模型
FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候,有两种情况: 两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题;两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存…...
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式,在Web服务和应用程序中广泛使用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读…...
在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用
在视频处理的众多需求中,将视频转换为 AVI 格式是不少用户的刚需。小白工具网(https://www.xiaobaitool.net/videos/convert-to-avi/ )的在线视频转 AVI 功能,以其显著优势,多格式支持、便捷操作、数据安全保障以及广泛…...
【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础
引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...
L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制
一、为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在: 固定输出格式&am…...
Java集成Zxing和OpenCV实现二维码生成与识别工具类
Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库,实现二维码的生成和识别功能。识别方法支持多种输入形式,包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...
jenkins pipeline ssh协议报错处理
一、jenkins版本 jenkins:2.492.3 openssh:OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1:手动添加目标主机密钥到Jenk…...
当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?
在数字化的世界里,OCR(光学字符识别)技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型,一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下,当你拿着模糊的财务报表扫描件时ÿ…...
vue watch监听路由,第一次进入不触发解决办法
“第一次进入的时候没触发,第二次就触发了”非常典型,它印证了路由监听(无论是 watch $route 还是 beforeRouteUpdate)主要是为了监听变化,而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...
JVM考古现场(二十四):逆熵者·时间晶体的永恒之战
"警告!时间晶体正在吞噬GC日志!" 我腰间的太极八卦镜突然迸发出刺目的量子辉光,终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖! 楔子:时间晶体的觉醒 🕯️…...
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
spring中使用netty-socketio部署到服务器(SSL、nginx转发) 本文实现前端socket.io-client连接后端netty-socketio,并且部署到服务器上的示例,以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...
qt.tlsbackend.ossl: Failed to load libssl/libcrypto.
我的环境是windows,QT6.3.2(msvc2019_64/mingw_64) 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意,是其他方式安装过openssl,环境变量有,但是QT找不到的问题。…...
【Python爬虫基础篇】--3.cookie和session
目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。 例子࿱…...
uView的u-modal不显示问题
问题分析:在项目中,其他页面显示正常,在这个页面显示不正常。 问题解决: 一般的原因,诸如层级遮挡控制器true后,被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...
联易融科技:以科技赋能驱动经营反转与价值重估
行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示,截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...
Office文档图片批量提取工具
Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具,支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 343KB,无需安装即可运行,通过拖拽操作实现快速解析与导出,尤其适合需批量…...
Python 设计模式:回调模式
1. 什么是回调函数? 回调函数是指作为参数传递给另一个函数的函数。当这个函数执行到某个特定的点时,它会调用这个回调函数。回调函数通常用于处理异步操作、事件处理或在某些条件下执行特定的操作。 回调函数的特点: 作为参数传递&#x…...
DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册
一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…...
大数据学习(112)-HIVE中的窗口函数
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Hive学习
一、Hive 核心原理 1. Hive 架构与执行流程 Hive 是基于 Hadoop 的数据仓库工具,将 SQL 转化为分布式计算任务(MapReduce/Tez/Spark),核心组件如下: 元数据存储(Metastore):存储表…...
前端开发核心知识详解:Vue2、JavaScript 与 CSS
一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持,为每个属性定义getter和setter。getter用于收集依赖,当视图中使用到该属性时…...
仅追加KV数据库
仅追加KV数据库 6.1 我们将要做什么 在本章中,我们将创建一个基于文件的键值存储(KV Store),其核心是一个写时复制(Copy-on-Write, CoW)B 树。这种设计的目标是实现数据的持久性和原子性。 1. 设计概述 …...
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
在Java中,Vector、ArrayList和LinkedList均实现了List接口,但它们在线程安全、数据结构、性能特性及应用场景上存在显著差异。 1. Vector、ArrayList 和 LinkedList 的区别 Vector: 线程安全:Vector 是线程安全的动态数组&#…...
Git分支管理方案
成都众望智慧有限公司Git分支管理方案 采用 轻量级Git Flow 敏捷版本控制策略,在保证稳定性的同时提升开发效率。以下是优化后的方案: 1. 精简分支模型(相比6-8人团队减少分支层级) 分支类型作用生命周期devops生产环境代码&am…...
SQL Tuning Advisor
什么是SQL Tuning Advisor STA可以用来优化那些已经被发现的高负载SQL. 默认情况下, Oracle数据库在自动维护窗口中自动认证那些有问题的SQL并且执行优化建议,找寻提升高负载SQL执行计划性能的方法. ** 如何查看自动优化维护窗口产生的报告? ** SQL> set ser…...
联易融出席深圳链主企业供应链金融座谈会,加速对接票交所系统
近日,深圳市委金融办组织召开全市链主企业供应链金融高质量发展座谈会。联易融作为供应链金融企业代表,与虾皮信息科技、电子元器件和集成电路国际交易中心等代表性机构以及行业协会、金融机构参加了会议。 发展供应链金融是破解中小微企业融资难、融资…...
【前端记事】关于electron的入门使用
electron入门使用 背景how to start第一步 创建一个vite-vue3项目第二步 装各种依赖第三步 配置vite.config.jspackage.jsonelectron入口 启动重写关闭、隐藏、最大化最小化 背景 最近对electron比较感兴趣,折腾一段时间后有了点眉目,记录一下 how to …...
Qt绘制可选择范围的日历
【日历控件设计】 #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QCalendarWidget> #include <QHBoxLayout> #include <QSpinBox> #include <QPushButton> #include <QLabel> #include <Q…...
Pycharm(十五)面向对象程序设计基础
目录 一、定义类及使用类的成员 二、self关键字介绍 三、在类内部调用类中的函数 class 类名: 属性(类似于定义变量) 行为(类似于定义函数,只不过第一个形参要写self) 一、面向对象基本概述 属性&…...