我在Oracle10中有一个表,结构如下
Create Table Bookmarks(
BOOKMARKID NUMBER(10,0) NOT NULL PRIMARY KEY,
URL VARCHAR2(4000 CHAR) NOT NULL UNIQUE
)URL有一个唯一的约束集,因此是一个唯一的索引。这个表中大约有一百万条记录。我必须频繁地检查表中是否已经存在书签。我发出以下查询
Select bookmarkid from Bookmarks where URL='<some url>'问题是,随着记录数量的增加,性能也会下降。现在返回书签id的时间要长得多,特别是当查询URL很长的时候。在Explain Plan中,查询对URL列使用唯一索引。有什么改进响应时间的建议吗?
发布于 2009-05-29 13:07:48
为此,您通常会使用散列索引。在mssql中,我会创建一个类似CRC(url)的持久化计算列。然后,当您想要检查是否存在时,可以查找WHERE crc(‘某些url') = PersistedCrcColumn和url=’某些url‘。
您必须将原始检查包括在crc检查中,因为有时会出现CRC冲突。
编辑-将上面的描述从“散列查找”更改为“散列索引”,以避免混淆。一些数据库将散列索引作为一级索引,我不相信oracle有(我也知道mssql没有)。如果本质上不支持,则可以使用上面的方法手动实现。
发布于 2009-05-29 13:25:28
创建包含bookmarkid列的索引。如下所示:
create IX on bookmarks (url, bookmarkid);发布于 2009-05-29 13:18:20
计算URL的MD4索引,并在触发器中分配它:
:new.HASH := DBMS_CRYPTO.hash(UTL_RAW.cast_to_raw(:new.url), 1)在此列上创建索引并按散列值进行搜索。
不要忘记在DBMS_CRYPTO上向拥有触发器的用户发送GRANT EXECUTE。
MD4是最快的哈希算法,这就是为什么它被广泛应用于密码强度不重要的地方。
https://stackoverflow.com/questions/925836
复制相似问题