首页 > 数据库 > Oracle > [20191225]主键使用uuid优缺点.txt
[20191225]主键使用uuid优缺点.txt
--//链接:https://www.cnblogs.com/jpfss/p/11506824.html
UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯
一的。通常平台会提供生成的API。换句话说能够在一定的范围内保证主键id的唯一性。
优点
出现数据拆分、合并存储的时候,能达到全局的唯一性
缺点
影响插入速度, 并且造成硬盘使用率低
uuid之间比较大小相对数字慢不少, 影响查询速度。
uuid占空间大, 如果你建的索引越多, 影响越严重
--//链接:https://blog.csdn.net/yinni11/article/details/79897696
现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。
优点:
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
在oracle做数据迁移的时候不会因为表的sequence不连续而出现问题
缺点:
比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
使用UUID后,URL显得冗长,不够友好。
下面针对上述UUID的缺点说说我的看法,比较占地方这个缺点我不是很在乎,现在最不值钱的就是硬盘了,略过此条缺点无妨,但需要注
意的一点数据在索引的时候效率会随着体积的增加而降低。至于说使用UUID后,URL显得不友好,我觉得这多少是你的INT情结造成的惯性
思维,其实,和INT类型相比,UUID才是最自然的主键选择,注意,我这里用的是自然这个形容词,仔细体会一下你能理解我的意思。另
外,很多时候,URL本身就不需要友好,比如,一个电子商务网站,按照INT友好的URL说法,她的订单URL大概是下面这个形式的:
/order.php/id/123,我要说明的是,这样是很友好,但是有些太友好了,友好的甚至不安全,比如说,我早晨下一个订单,发现URL是
/order.php/id/1000,晚上再下一个订单发现URL是/order.php/id/2000,那么我就可以估计出此网站一天的订单数大致是1000左右,甚
至能大体估计出它的销售额,而这些数据往往都是重要的商业秘密。使用UUID就没有这个顾虑。
--//我个人并不同意这个观点,最不值钱的就是硬盘,某种角度讲这个观点确实没错,但是对方明显没有考虑日志,归档,索引,表这些汇
--//总起来,增加确实很快的.而且实际上许多开发不会选择raw(16)类型,因为这样会存在隐式转换,编程很麻烦,而是更多的选择
--//varchar2(32)类型保存.
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
create table t ( a raw(16),b varchar2(32));
insert into t select sys_guid(), sys_guid() from dual ;
SCOTT@book> select * from t;
A B
-------------------------------- --------------------------------
9A7EBAE480254756E0534E64A8C05A8C 9A7EBAE480264756E0534E64A8C05A8C
~~~~~~~~~~~~
--//不仔细会以为2个一样,实际上仅仅下划线最后5存在不同.
SCOTT@book> select dump(a,16) c70 ,dump(b,16) c110 from t ;
C70 C110
---------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
Typ=23 Len=16: 9a,7e,ba,e4,80,25,47,56,e0,53,4e,64,a8,c0,5a,8c Typ=1 Len=32: 39,41,37,45,42,41,45,34,38,30,32,36,34,37,35,36,45,30,35,33,34,45,36,34,41,38,43,30,35,41,38,43
--//前者占用16字节,后者32字节.
SCOTT@book> select * from t where a='9A7EBAE480254756E0534E64A8C05A8C';
A B
-------------------------------- --------------------------------
9A7EBAE480254756E0534E64A8C05A8C 9A7EBAE480264756E0534E64A8C05A8C
SCOTT@book> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 71cgtup50d8p8, child number 0
-------------------------------------
select * from t where a='9A7EBAE480254756E0534E64A8C05A8C'
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
|* 1 | TABLE ACCESS FULL| T | 1 | 28 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(RAWTOHEX("A")='9A7EBAE480254756E0534E64A8C05A8C')
--//可以发现发生隐式转换,这样开发不会选择raw类型来保存生成的uuid.意味者需要更大的空间保存信息.
SELECT *
FROM ( SELECT table_name, COUNT (*)
FROM dba_tab_columns
WHERE owner = 'XXXXXX'
AND data_type = 'VARCHAR2'
AND data_length = 32
GROUP BY table_name
ORDER BY 2 DESC)
WHERE ROWNUM <= 8;
TABLE_NAME COUNT(*)
--------------------- --------
XXX_ITEM_HIS 27
XXX_ITEM 25
XXX_PAYBOOK 22
XXX_AGEN 22
XXX_PAYBOOK_BACK3040 21
XXX_BATCH_TASK_DETAIL 20
XXX_PAYBOOK_UNSIGN 20
XXX_ITEMSHARE_HIS 19
--//XXX_ITEM_HIS有27个,XXX_ITEM有25个varchar2(32)类型.可想而知如果这些都是uuid的编码,消耗空间有多大,出现行链接迁移的可能
--//性有多大.
set linesize 2000
column comments format a60
SELECT table_name, column_name, comments
FROM DBA_col_COMMENTS
WHERE owner = 'XXXXXX'
AND table_name = 'XXX_ITEM'
AND column_name IN (SELECT column_name
FROM dba_tab_columns
WHERE owner = 'XXXXXX'
AND table_name = 'XXX_ITEM'
AND data_type = 'VARCHAR2'
AND data_length = 32);
TABLE_NAME COLUMN_NAME COMMENTS
---------- ---------------- --------------------
XXX_ITEM XXXEMIDCODE 项目识别码
XXX_ITEM XXXITS 计量单位
XXX_ITEM XXXBID 收入科目Id
XXX_ITEM XXXERID 经办人ID
XXX_ITEM XXXAREDIRECTCODE 分成方向
XXX_ITEM XXXALTYPERCENT 滞纳金比例(%)
XXX_ITEM XXXDCODE 父级识别码
XXX_ITEM XXXTSTYLECODE 预算管理方式代码
XXX_ITEM XXXAGSORTCODE 全国项目分类
XXX_ITEM XXX 主键
XXX_ITEM XXXTERCODE 变更类型代码
XXX_ITEM XXXYMODECODE 缴库方式代码
XXX_ITEM XXXCOMESORTCODE 收入类别代码
XXX_ITEM XXXAGSORTCODE 地方项目分类
XXX_ITEM XXXNDSNATURE 资金性质内码
XXX_ITEM XXXNDSNATURECODE 资金性质代码
XXX_ITEM XXXTCHKRGNID 终审通过的区划ID
XXX_ITEM XXXDE 项目编码
XXX_ITEM XXXNID 维护区划ID
XXX_ITEM XXXEMCODE 项目业务码
XXX_ITEM XXXVELCODE 层次码
XXX_ITEM XXXRTCODE 项目分类代码
XXX_ITEM XXXPCODE 审批属性代码
XXX_ITEM XXXNITEMIDCODE 全国项目识别码
XXX_ITEM XXXTLVLCODE 项目使用级次
已选择 25 行。
--//仅仅3-4个字段(XXXITS,XXXAREDIRECTCODE,XXXALTYPERCENT,XXXVELCODE,XXXTLVLCODE)可能不是保存uuid编码.可想如果剩下全部保
--//存uuid信息,32*20=640,不是一点点而是大量的空间.
--//任何一项技术都有其优缺点,适用范围,如果滥用未必带来好的结果.适当的使用才能带来好处.而不是到处都用uuid保存主键信息.
--//你可以看如下链接的一些测试,对方还是使用raw(16)类型的,如果是varchar2(32)消耗更大.
https://dfitzjarrell.wordpress.com/2016/12/21/do-you-have-a-key/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2670513/ ,如需转载,请注明出处,否则将追究法律责任。