问题描述
你好,
如果我只对uud进行相等的比较,索引uud的最佳方法是什么?
我gess哈希索引更好,但我不确定。
问候
斯特凡·吉纳
如果我只对uud进行相等的比较,索引uud的最佳方法是什么?
我gess哈希索引更好,但我不确定。
问候
斯特凡·吉纳
专家解答
“最佳” 总是主观的。为了帮助您找到最适合您的 “最佳”,我们需要一些可以衡量的客观标准。
在大多数情况下,常规的唯一B树索引可以解决问题。如果你已经将UUID定义为主键或唯一键,你已经有一个!
当涉及到哈希索引时,您可能会想到不同的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。所以我怀疑你是否有能力使用它!
还有另一个基于哈希的数据结构已经存在了一段时间:
(单表) 哈希簇。
但是这些都有一些警告。例如,为了减少哈希冲突的机会 (从而确保快速查询),您需要能够对表将存储的最大行数做出合理的猜测。这对于许多表来说是不可行的。
但是,如果可以的话,它们使数据库能够使用哈希查找行:
在以下位置阅读有关此的更多信息:
https://docs.oracle.com/en/database/oracle/oracle-database/18/admin/managing-hash-clusters.html
在大多数情况下,常规的唯一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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




