首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Oracle 10密集唯一索引上的SELECT查询

优化Oracle 10密集唯一索引上的SELECT查询
EN

Stack Overflow用户
提问于 2009-05-29 12:59:15
回答 4查看 1.3K关注 0票数 1

我在Oracle10中有一个表,结构如下

代码语言:javascript
复制
Create Table Bookmarks(  
    BOOKMARKID NUMBER(10,0) NOT NULL PRIMARY KEY,
    URL VARCHAR2(4000 CHAR) NOT NULL UNIQUE
)

URL有一个唯一的约束集,因此是一个唯一的索引。这个表中大约有一百万条记录。我必须频繁地检查表中是否已经存在书签。我发出以下查询

代码语言:javascript
复制
Select bookmarkid from Bookmarks where URL='<some url>'

问题是,随着记录数量的增加,性能也会下降。现在返回书签id的时间要长得多,特别是当查询URL很长的时候。在Explain Plan中,查询对URL列使用唯一索引。有什么改进响应时间的建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-29 13:07:48

为此,您通常会使用散列索引。在mssql中,我会创建一个类似CRC(url)的持久化计算列。然后,当您想要检查是否存在时,可以查找WHERE crc(‘某些url') = PersistedCrcColumn和url=’某些url‘。

您必须将原始检查包括在crc检查中,因为有时会出现CRC冲突。

编辑-将上面的描述从“散列查找”更改为“散列索引”,以避免混淆。一些数据库将散列索引作为一级索引,我不相信oracle有(我也知道mssql没有)。如果本质上不支持,则可以使用上面的方法手动实现。

票数 3
EN

Stack Overflow用户

发布于 2009-05-29 13:25:28

创建包含bookmarkid列的索引。如下所示:

代码语言:javascript
复制
create IX on bookmarks (url, bookmarkid);
票数 3
EN

Stack Overflow用户

发布于 2009-05-29 13:18:20

计算URLMD4索引,并在触发器中分配它:

代码语言:javascript
复制
:new.HASH := DBMS_CRYPTO.hash(UTL_RAW.cast_to_raw(:new.url), 1)

在此列上创建索引并按散列值进行搜索。

不要忘记在DBMS_CRYPTO上向拥有触发器的用户发送GRANT EXECUTE

MD4是最快的哈希算法,这就是为什么它被广泛应用于密码强度不重要的地方。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/925836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档