Oracle 如何给大表添加带有默认值的字段

news2024/11/17 8:44:02

一、讲故事

你是否遇到过开发人员添加字段,导致数据库锁表问题?
但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢? 为什么呢?
询问得知,**加的慢时候是带上了default默认值,如果表的数据量很大,那么会花费很长时间。在加字段期间,表上还会加6级锁,连select都会被阻塞。**这在生产系统是不可接受的。
所以,任何DDL操作,都应该询问DBA是否有风险。

从11g开始,这种情况有了明显的改善。Oracle 11g引入了元数据唯一默认值的概念。如果增加的列符合default+not null这两个条件的话,它只会去更新数据字典,不会去更新物理行,所以操作可以很短的时间完成,且不会对生产产生影响。读取列数据的时候优化器重写新列的查询,以确保结果与默认定义一致。
注意:这两个条件(列符合default且not null)缺一不可,否则还是会很慢。

从Oracle 12c更进一步,允许元数据默认值not null 可选,因此,在现有表中添加带有默认子句的新列将被作为一个元数据来处理,而不管该列是否被定义not null,两种方式操作都很快。

二、讲实战

1. 模拟大表

SQL> drop table test1; #执行这个sql前,需要确认test1表是不是能删除。表名可以自己换成别的表。

Table dropped.

SQL> create table test as select * from dba_objects;

Table created.

SQL> insert into test1 select * from test;

79699 rows created
.....
SQL> insert into test1 select * from test;

1275200 rows created.

SQL> commit;

Commit complete.

--11g 环境下表初始大小:
SQL> select bytes from user_segments where segment_name='TEST1';

  BYTES
----------
 301989888
 
 --19c 环境下表初始大小:
 SQL> select bytes from user_segments where segment_name='TEST1';

 BYTES
----------
 739246080


2. 11g 环境下测试

2.1 增加字段

情况1:只有default值
-- 不加not null约束
SQL> alter table test1 add a varchar2(100) default 'aa';

Table altered.

Elapsed: 00:00:42.62

SQL> select count(*) from test1 where a='aa';

  COUNT(*)
----------
   2550400
Elapsed: 00:00:00.24

SQL> select bytes from user_segments where segment_name='TEST1';

  BYTES
----------
 578813952
 
Elapsed: 00:00:00.01


情况2:default+not null
--加上not null 约束   
SQL> alter table test1 add b varchar2(100) default 'bb' not null;

Table altered.

Elapsed: 00:00:00.04

SQL> select count(*) from test1 where b='bb';

  COUNT(*)
----------
   2550400

Elapsed: 00:00:00.23

SQL> select bytes from user_segments where segment_name='TEST1';

  BYTES
----------
 578813952
 
Elapsed: 00:00:00.01


可以看到:

1.default+not null 的执行时间远小于只有default值的情况。

2.default+not null 表的大小也没有变化,说明表并没有实际去更新物理行,只是更新了数据字典。

这是11g对新增一个not null字段带有默认值进行了优化,默认值以及对应的表信息、列信息一起存储在一个新增数据字典表ecol$中 。

2.2 查询test1表中添加的默认值

SQL> select object_id from dba_objects where object_name = 'TEST1' and owner='SXC';

 OBJECT_ID
----------
  97662
     
     
SQL> set line222
SQL> select colnum,binarydefval from ecol$ where tabobj#= 97662;

    COLNUM BINARYDEFVAL
---------- ----------------------------------
        17 6262
SQL> desc ecol$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABOBJ#                                           NUMBER
 COLNUM                                            NUMBER
 BINARYDEFVAL                                        BLOB
 
-- 注意:binarydefval 是blob 类型,所有实际存储的值并不是数值6262,可以通过下面的存储过程查看真实存储的值是bb 
SQL> SET SERVEROUT ON
SQL> 
SQL> DECLARE
  2    V_BLOB VARCHAR2(32767) DEFAULT '6262';
  3    BEGIN
  4    FOR I IN 1..LENGTH(V_BLOB)/2 LOOP
  5    DBMS_OUTPUT.PUT(CHR(TO_NUMBER(SUBSTR(V_BLOB, (I-1) * 2 + 1, 2), 'XXX')));
  6    END LOOP;
  7    DBMS_OUTPUT.NEW_LINE;
  8    END;
  9    /
bb

PL/SQL procedure successfully completed.     


2.3 对比执行计划

如果我们从表中检索对应的列时候,我们对比一下执行计划:

情况1:只有default值
SQL> select count(*) from test1 where a='aa';

  COUNT(*)
----------
   2550368

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  b91qrsffc9t3d, child number 0
-------------------------------------
select count(*) from test1 where a='aa'

Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time      |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |       |       |  9972 (100)|    |
|   1 |  SORT AGGREGATE    |       |     1 |    52 |           |   |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| TEST1 |  2886K|   143M|  9972   (1)| 00:02:00 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("A"='aa')

Note
-----
   - dynamic sampling used for this statement (level=2)

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

23 rows selected.


结论:采用filter(“A”=‘aa’) 过滤的方式,直接读取列数据。

情况2:default+not null
SQL> select count(*) from test1 where b='bb';

  COUNT(*)
----------
   2550368

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  9xurwt6ytwjf0, child number 0
-------------------------------------
select count(*) from test1 where b='bb'

Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |       |       |  9974 (100)|   |
|   1 |  SORT AGGREGATE    |       |     1 |    52 |          |    |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| TEST1 |  2886K|   143M|  9974   (1)| 00:02:00 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(NVL("B",'bb')='bb')

Note
-----
   - dynamic sampling used for this statement (level=2)

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

23 rows selected.


结论:采用filter(NVL(“B”,‘bb’)=‘bb’)方式过滤,读取列数据,但是oracle认为default+not null 的方式添加的列是空列,所以用nvl函数做了一次转换。

※思考?
1、如果我们在列上建索引呢?
SQL> create index idx1 on test1 (b);

Index created.

SQL> select count(*) from test1 where b='bb';

  COUNT(*)
----------
   2550368

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  9xurwt6ytwjf0, child number 0
-------------------------------------
select count(*) from test1 where b='bb'

Plan hash value: 325870156

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |       |       |  1391 (100)|          |
|   1 |  SORT AGGREGATE       |      |     1 |    52 |            |          |

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------
|*  2 |   INDEX FAST FULL SCAN| IDX1 |  2886K|   143M|  1391   (1)| 00:00:17 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(NVL("B",'bb')='bb')

Note
-----
   - dynamic sampling used for this statement (level=2)

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------

23 rows selected.


结论:虽然从全表扫描变成索引扫描,但是一样是NVL(“B”,‘bb’)='bb’方式过滤数据。

2、后续新增加的数据呢?
-- 增加2行数据,一个用默认值,一个不用默认值。
SQL> select * from test1 where owner='T';

no rows selected

SQL> insert into test1 (owner,b) values ('T',default);

1 row created.

SQL> insert into test1 (owner,b) values ('T','bbb');

1 row created.

SQL> commit;

Commit complete.

--访问默认值,查看执行计划
SQL> select owner,b from test1 where  owner='T' and b='bb';

OWNER    B
----------------------------------------
T      bb

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  dyd1zgs10jr16, child number 0
-------------------------------------
select owner,b from test1 where  owner='T' and b='bb'

Plan hash value: 4122059633

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |       |       |  9974 (100)|    |
|*  1 |  TABLE ACCESS FULL| TEST1 |   287 | 19803 |  9974   (1)| 00:02:00  |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(("OWNER"='T' AND NVL("B",'bb')='bb'))

Note
-----
   - dynamic sampling used for this statement (level=2)

22 rows selected.


--访问非默认值,查看执行计划
SQL> select owner,b from test1 where  owner='T' and b='bbb';

OWNER    B
----------------------------------------
T      bbb

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5mbna21dqafdw, child number 0
-------------------------------------
 select owner,b from test1 where  owner='T' and b='bbb'

Plan hash value: 2734693028

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time      |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |       |       |     9 (100)  |   |
|*  1 |  TABLE ACCESS BY INDEX ROWID| TEST1 |   287 | 19803 |     9   (0)| 00:00:01      |

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN          | IDX1  |   403 |       |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OWNER"='T')
   2 - access(NVL("B",'bb')='bbb')

Note
-----

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------
   - dynamic sampling used for this statement (level=2)

24 rows selected.


结论:新增的数据,执行计划中一样都是采用NVL(“B”,‘bb’)='bb’方式。

2.4 表压缩后限制

1. 添加列报错

表压缩之后,default+not null是可以操作的;但是只有default是不行的。

SQL> alter table test1 compress;

Table altered.

SQL> alter table test1 add c number default 3 not null;

Table altered.

SQL> alter table test1 add d number default 4;
alter table test1 add d number default 4
                      *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


解决办法:但是这种方法,只有之后新插入的行才是有值的,之前已经存在的行是没有的,还是空,所以需要找时间批量提交修改。

SQL> alter table test1 add d number;

Table altered.

SQL> alter table test1 modify d number default 4;

Table altered.

SQL> select count(*) from test1 where d=4;

  COUNT(*)
----------
      0
      
-- 可以批量更改
SQL> update test1 set d=4 where d is null;

2550368 rows updated.

SQL> commit;

Commit complete.


2. 删除列报错
-- 直接drop column报错
SQL> alter table test1 drop column c;
alter table test1 drop column c
                              *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


-- 尝试先把列设成unused方式,再删除一样报错
SQL> alter table test1 set unused column c;

Table altered.

SQL> alter table test1 drop unused columns;
alter table test1 drop unused columns
*
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


结论:根据Doc ID 1574318.1 描述,暂时没有好的解决方法,只能针对oltp compress 方式可以删除列。

SQL> alter table t2 compress for oltp;  --加上for oltp

Table altered.

SQL> alter table t2 drop column id;

Table altered.

SQL> alter table t2 compress;

Table altered.

SQL> alter table t2 drop column T1_ID;
alter table t2 drop column T1_ID
                           *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


官方文档:
在这里插入图片描述

3. 在Oracle19C 环境下测试

3.1 增加字段

情况1:只有default值
-- 不加not null约束
SQL> alter table test1 add a varchar2(100) default 'aa';

Table altered.

Elapsed: 00:00:00.02

SQL> select count(*) from test1 where a='aa';

  COUNT(*)
----------
   4643072

Elapsed: 00:00:01.05

SQL> select bytes from user_segments where segment_name='TEST1';

  BYTES
----------
 739246080
 
Elapsed: 00:00:00.01


情况2:default+not null
--加上not null 约束   
SQL> alter table test1 add b varchar2(100) default 'bb' not null;

Table altered.

Elapsed: 00:00:00.06

SQL> select count(*) from test1 where b='bb';

  COUNT(*)
----------
   4643072

Elapsed: 00:00:00.23

SQL> select bytes from user_segments where segment_name='TEST1';

  BYTES
----------
 739246080
 
Elapsed: 00:00:00.01


可以看到:

1.和11g不一样,default+not null 和只加default 速度一样快。

2.两种方式表的大小都没有变化,说明表都没有实际去更新物理行,都只是更新了数据字典。

3.2 查询test1表中添加的默认值

SQL> select object_id from dba_objects where object_name = 'TEST1' and owner='SXC';

 OBJECT_ID
----------
  73797
     
     
SQL> set line222
SQL> select colnum,binarydefval from ecol$ where tabobj#= 73797;

    COLNUM BINARYDEFVAL
---------- -----------------------
        28 6161
        29 6262

-- 比11g 多出一行,不管是否有加上not null 条件,都被存储到了ecol$表中。

SQL> SET SERVEROUT ON
SQL> DECLARE
  2    V_BLOB VARCHAR2(32767) DEFAULT '6161';
  3    BEGIN
  4    FOR I IN 1..LENGTH(V_BLOB)/2 LOOP
  5    DBMS_OUTPUT.PUT(CHR(TO_NUMBER(SUBSTR(V_BLOB, (I-1) * 2 + 1, 2), 'XXX')));
  6    END LOOP;
  7    DBMS_OUTPUT.NEW_LINE;
  8    END;
  9    /
aa

SQL> DECLARE
  2    V_BLOB VARCHAR2(32767) DEFAULT '6262';
  3    BEGIN
  4    FOR I IN 1..LENGTH(V_BLOB)/2 LOOP
  5    DBMS_OUTPUT.PUT(CHR(TO_NUMBER(SUBSTR(V_BLOB, (I-1) * 2 + 1, 2), 'XXX')));
  6    END LOOP;
  7    DBMS_OUTPUT.NEW_LINE;
  8    END;
  9    /
bb

PL/SQL procedure successfully completed.     


3.3 对比执行计划

如果我们从表中检索对应的列时候,我们对比一下执行计划:

情况1:只有default值
SQL> select count(*) from test1 where a='aa';

  COUNT(*)
----------
   4643072

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  12bwjcp0zanhm, child number 0
-------------------------------------
 select count(*) from test1 where a='aa'

Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |       |       |   394 (100)|   |
|   1 |  SORT AGGREGATE    |       |     1 |     3 |            |  |
|*  2 |   TABLE ACCESS FULL| TEST1 | 72548 |   212K|   394   (1)| 00:00:01  |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00027$",0)),NULL,NVL("
              A",'aa'),'0',NVL("A",'aa'),'1',"A")='aa')


20 rows selected.

Elapsed: 00:00:14.13


结论:和11g 不一样,这里即采用了nvl函数转化,也多了一个隐藏列SYS_NC00027$,通过下面的SQL可以查询到。这个隐藏列是在添加default的列的时候增加的,添加default+not null 的列没有。

SQL> select column_name,column_id,hidden_column,virtual_column from dba_tab_cols where table_name='TEST1' and owner='SXC';

COLUMN_NAME                     COLUMN_ID HIDDEN VIRTUA
---------------------------------------- ------ ------------------
OWNER                          1      NO      NO
...
MODIFIED_VSNID                    26     NO      NO
SYS_NC00027$                            YES     NO    -- 隐藏列
A                             27      NO     NO
B                             28      NO     NO


情况2:default+not null
SQL> select count(*) from test1 where b='bb';

  COUNT(*)
----------
   4643072

SQL> select * from table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  9xurwt6ytwjf0, child number 0
-------------------------------------
select count(*) from test1 where b='bb'

Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |       |       |   394 (100)|   |
|   1 |  SORT AGGREGATE    |       |     1 |     3 |        |      |
|*  2 |   TABLE ACCESS FULL| TEST1 | 72548 |   212K|   394   (1)| 00:00:01  |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(NVL("B",'bb')='bb')

19 rows selected.

Elapsed: 00:00:01.22


结论:和11g 方式一样,都是采用filter(NVL(“B”,‘bb’)=‘bb’)过滤,读取列数据,并且使用了nvl函数。

※思考?
1、如果我们在列上建索引呢?
2、后续新增加的数据呢?

结论:测试下来,大体结果和11g 一样。 都会使用隐藏列SYS_NC00027$和NVL函数转化。

3.4 表压缩后限制

1. 添加列
SQL> alter table test1 compress;

Table altered.

SQL> alter table test1 add c number default 3 not null;

Table altered.

SQL> alter table test1 add d number default 4;

Table altered.


结论:和11g不一样,19c表compress之后, 两种方式都能添加列 。

但是,在12c环境下,表compress之后, 两种方式都不能添加列 。

SQL> create table T1 ( a number, b varchar2(10) ) compress ;

Table created.

SQL> alter table T1 add c varchar2(20) default 'test' not null ;
alter table T1 add c varchar2(20) default 'test' not null
                   *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables

SQL> alter table T1 add c varchar2(20) default 'test' ;
alter table T1 add c varchar2(20) default 'test'
                   *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


2. 删除列报错
-- 直接drop column报错
SQL> alter table test1 drop column c;
alter table test1 drop column c
                              *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


-- 尝试先把列设成unused方式,再删除一样报错
SQL> alter table test1 set unused column c;

Table altered.

SQL> alter table test1 drop unused columns;
alter table test1 drop unused columns
*
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables


结论:和11g一样,暂时没有好的解决方法,只能针对oltp compress 方式可以删除列。

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

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

相关文章

提高软件缺陷探测率的5个重点

缺陷对软件项目的影响不言而喻,如果不重视缺陷的探测率和移除率,往往会对软件产品产生不可估量的破坏性影响,直接影响项目进度甚至项目交付。 因此我们需要高效提高软件缺陷探测率,一般来说有以下5个方面需要重点关注:…

Linux--线程地址空间

1.程序地址空间 先来就看这张图 这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况 编译结果: 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数…

深度丨Serverless + AIGC,一场围绕加速创新的升维布局

作者:褚杏娟 上图来源于基于函数计算部署 SD实现光影效果 前言: Serverless 在中国发展这些年,经历了高潮、低谷、现在重新回到大众视野。很多企业都非常感兴趣,部分企业开始大规模应用;也有一些企业对在生产环境真正…

VGG的结构:视觉几何组(Visual Geometry Group)

目录 1. VGG 的结构 2. VGG 的网络细节 3. VGG 的代码实现 1. VGG 的结构 牛津大学的视觉几何组(Visual Geometry Group)设计了 VGGNet(也称为 VGG),一种经典的卷积神经网络 (CNN) 架构。在 2014 年 ILSVRC 分类任务中,VGG 取…

回归分析扫盲:为什么非线性模型不能直接用最优子集选择法

最近有人给我发了篇文章: 一个问题有一堆变量,我们要选取哪些变量来建模呢?我们来看看这篇文章是怎么做的: 这个方法简单来说就是:对于这一堆变量,我们每次尝试剔除其中一个变量,然后用剩下的变…

字节流概述,及字节流写数据的三种方式

1.IO流概述和分类 如果数据通过记事本打开,我们还可以读懂里面的内容就使用字符流,否则使用字节流。如果不知道使用哪种类型的流,就使用字节流。 2.字节流写数据 创建字节输出流的时候,一共做了三件事情。 调用系统功能创建了文…

Goland 配置go modules 环境变量

我的配置,仅供参考: GOPROXYhttps://goproxy.cn,direct;GO111MODULEon;GOSUMDBoff;GONOSUMDB*

spring整合mybatis教程(详细易懂)

一、引言 1、Spring整合MyBatis的目的是? 将两个框架结合起来,以实现更好的开发体验和效果。Spring提供了一种轻量级的容器和依赖注入的机制,可以简化应用程序的配置和管理。而MyBatis是一个优秀的持久层框架,可以方便地进行数据…

Mysql join加多条件与where的区别

最近在项目中遇到一个问题,感觉有点意思,在解决问题及查阅了相关资料后,打算写篇文章给朋友们分享一下。 问题现象: 问题是很常见的空指针问题,后端查询数据库数据,遍历进行相关业务处理时报空指针。通过…

stm32单片机实现电机的PID控制

PID控制应该算是非常古老而且应用非常广泛的控制算法了,小到热水壶温度控制,大到控制无人机的飞行姿态和飞行速度等等。在电机控制中,PID算法用得尤为常见。 一、位置式PID 1.计算公式 在电机控制中,我们给电机输出的是一个PWM占…

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强:Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法,和集中式计算是相对的。 随着计算技术的发展,有些应用需要非常巨大的计算能力才…

Boost电路实战详解!(高效率同步整流,PID闭环追踪)

文章目录 寄语什么是BOOST电路BOOST同步升压电路设计要求设计方案驱动电路电压采样电路 总体电路代码实物图总结 寄语 提示:若想实战演练,请先熟悉文章操作流程哦,不然会有危险!! 我建了一个群,分享我个人…

【业务功能篇82】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-进阶实战

四、ElasticSearch进阶 https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html 1.ES中的检索方式 在ElasticSearch中支持两种检索方式 通过使用REST request URL 发送检索参数(uri检索参数)通过使用 REST request body 来发送检索参数…

人力资源小程序的设计与开发步骤

在当前信息化时代,小程序成为了各行各业提升用户体验和服务效率的重要渠道。人力资源部门也可以通过定制开发人力资源小程序来提升招聘、培训、员工福利等方面的工作效率。接下来,我们将介绍人力资源小程序定制系统开发的具体流程。 首先,我们…

章节 1:入门React.js -《React.js手把手教程:从初学者到实战高手》- 第一部分:React.js基础

《React.js手把手教程:从初学者到实战高手》 第一部分:React.js基础 章节 1:入门React.js 了解React.js 在我们开始探索React.js的奇妙世界之前,让我们先来认识一下这个“人人都在谈论”的家伙。你可以把React.js想象成是一个全…

【校招VIP】产品思维分析之面试新的功能点设计

考点介绍: 这种题型是面试里出现频度最高,也是难度最大的一种,需要面试者对产品本身的功能、扩展性以及行业都有一定的了解。而且分析时间较短,需要一定的产品能力和回答技巧。 『产品思维分析之面试新的功能点设计』相关题目及解…

既简单又高效,一款新型软件开发利器来了,让编程门槛不再是障碍

软件开发现在已经成为各行各业不可或缺的一部分。 无论是大型企业还是小型团队,都需要依赖软件来提高工作效率、优化用户体验,甚至是推动业务的发展。然而,对于非专业程序员来说,开发一款自己的软件似乎是一项遥不可及的任务。 幸…

idea建立java maven javaweb项目,建立maven基本项目

1.创建maven项目 2.在src/main 目录下建立webapp/WEB-INF/web.xml文件 src/main/webapp/WEB-INF/web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w…

Java轻松开发自定义注解

注解开发 元注解 Target(ElementType) 修饰的这个注解的使用范围&#xff0c;即被描述的注解可以用在哪里。 Target(ElementType.TYPE)——接口、类、枚举、注解 Target(ElementType.FIELD)——字段、枚举的常量 Target(ElementType.METHOD)——方法 Target(ElementT…

antd5:图片上传接口参数

使用场景&#xff0c;后端给了一个上传文件的接口/api/file/upload,方法类型为post,参数为{file: binary,type:string}. 上传文件需要设置请求头content-type. 项目使用的是umi4antd5 请求拦截便在app.ts文件写。 export const request: RequestConfig {baseURL: /api,time…