暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 索引uuid的最佳方法

askTom 2018-04-17
758

问题描述

你好,

如果我只对uud进行相等的比较,索引uud的最佳方法是什么?

我gess哈希索引更好,但我不确定。

问候

斯特凡·吉纳

专家解答

“最佳” 总是主观的。为了帮助您找到最适合您的 “最佳”,我们需要一些可以衡量的客观标准。

在大多数情况下,常规的唯一B树索引可以解决问题。如果你已经将UUID定义为主键或唯一键,你已经有一个!

create table t (
  uuid raw(16) not null constraint pk primary key
);

select index_name, uniqueness, index_type 
from   user_indexes
where  table_name = 'T';

INDEX_NAME   UNIQUENESS   INDEX_TYPE   
PK           UNIQUE       NORMAL   
复制


当涉及到哈希索引时,您可能会想到不同的RDBMS。Oracle数据库中没有!

...

好吧,好吧,18c引入了记忆优化的行数。它基于memoptimized池中的主键构建哈希索引。

https://docs.oracle.com/en/database/oracle/oracle-database/18/tgdba/tuning-system-global-area.html#GUID-9752E93D-55A7-4584-B09B-9623B33B5CCF

但这需要18c。和Exadata。所以我怀疑你是否有能力使用它!

还有另一个基于哈希的数据结构已经存在了一段时间:

(单表) 哈希簇。

但是这些都有一些警告。例如,为了减少哈希冲突的机会 (从而确保快速查询),您需要能够对表将存储的最大行数做出合理的猜测。这对于许多表来说是不可行的。

但是,如果可以的话,它们使数据库能够使用哈希查找行:

create cluster single_table_hash (
  uuid raw(16)
) single table hashkeys 10000; -- expect at most 10,000 rows in the table

drop table t cascade constraints purge;
create table t (
  uuid raw(16) not null constraint pk primary key
) cluster single_table_hash ( uuid ) ;

set serveroutput off
var v varchar2(16);
select * from t
where  uuid = hextoraw(:v);

select * 
from   table(dbms_xplan.display_cursor);

PLAN_TABLE_OUTPUT                                            
SQL_ID  favx4nmam2n8u, child number 0                        
-------------------------------------                        
select * from t where  uuid = hextoraw(:v)                   
                                                             
Plan hash value: 671594591                                   
                                                             
----------------------------------------------------------   
| Id  | Operation         | Name | Rows  | Bytes | Cost  |   
----------------------------------------------------------   
|   0 | SELECT STATEMENT  |      |       |       |     1 |   
|*  1 |  TABLE ACCESS HASH| T    |  8174 | 81740 |       |   
----------------------------------------------------------   
                                                             
Predicate Information (identified by operation id):          
---------------------------------------------------          
                                                             
   1 - access("UUID"=HEXTORAW(:V))
复制


在以下位置阅读有关此的更多信息:

https://docs.oracle.com/en/database/oracle/oracle-database/18/admin/managing-hash-clusters.html
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论