【问题标题】:Optimizing SELECT Query on Oracle 10 Dense Unique Index优化 Oracle 10 密集唯一索引上的 SELECT 查询
【发布时间】:2009-05-30 06:38:31
【问题描述】:

我在 Oracle 10 中有一个具有以下结构的表

Create Table Bookmarks(  
    BOOKMARKID NUMBER(10,0) NOT NULL PRIMARY KEY,
    URL VARCHAR2(4000 CHAR) NOT NULL UNIQUE
)

URL 具有唯一约束集,因此具有唯一索引。该表中大约有 100 万条记录。我必须经常检查表中是否已经存在书签。我发出以下查询

Select bookmarkid from Bookmarks where URL='<some url>'

问题在于,随着记录数量的增加,性能也在下降。现在,特别是当查询 URL 很长时,返回书签 ID 需要更长的时间。在解释计划中,查询确实使用 URL 列上的唯一索引。有什么改善响应时间的建议吗?

【问题讨论】:

    标签: sql oracle optimization


    【解决方案1】:

    您通常会为此使用哈希索引。在 mssql 中,我将创建一个类似于 CRC(url) 的持久计算列。然后,当您要检查是否存在时,查找 WHERE crc('some url') = PersistedCrcColumn AND URL='some url'

    您必须在 crc 检查中包含原始检查,因为您偶尔会遇到 CRC 冲突。

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

    【讨论】:

      【解决方案2】:

      创建包含 bookmarkid 列的索引。 像这样:

      create IX on bookmarks (url, bookmarkid);
      

      【讨论】:

      • 我投票赞成 Dmitry 的答案——以防不明显,在索引中包含 bookmarkid 列消除了 Oracle 访问表段块以检索信息的需要——只有索引是访问。如果 BOOKMARKS 表是相对静态的,那么将其创建为 IOT(索引组织表)将是一种类似的方法。
      【解决方案3】:

      检查执行计划是否在索引上使用 UNIQUE 扫描,而不是完整/快速完整/范围扫描。 您可能有很多以http://www 开头的URL。 (也许还有更多的领先值),这并不理想。如果可以,请在 ORA_HASH(url) 上创建基于非唯一函数的索引并将其添加到查询中。它将提供更小的索引值和更好的值分布。 如果无法更改查询,请尝试使用 REVERSE 重新创建索引。

      它对索引值的大小没有帮助,但可以更好地传播它。

      【讨论】:

        【解决方案4】:

        计算URLMD4 索引并将其分配到触发器中:

        :new.HASH := DBMS_CRYPTO.hash(UTL_RAW.cast_to_raw(:new.url), 1)
        

        在此列上创建索引并按哈希值搜索。

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

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

        【讨论】:

        • 需要触发器吗?为什么不是基于函数的索引?
        • @tuinstoel:UTL_RAW.cast_to_raw 不是确定性的。
        • 啊,它应该是确定性的,不是吗?
        • 您可以创建一个包装函数 myhash 来包装 dbms_crypto 并声明它是确定性的。这是一个丑陋的解决方案/解决方法,触发器更好。
        • 我会选择 ORA_HASH download.oracle.com/docs/cd/B19306_01/server.102/b14200/… 不确定哈希算法的性能,但避免在 PL/SQL 和 SQL 之间切换可能会更重要。
        猜你喜欢
        • 2012-05-08
        • 1970-01-01
        • 2023-01-12
        • 1970-01-01
        • 2019-08-27
        • 2011-12-15
        • 2014-11-04
        • 1970-01-01
        • 2012-08-05
        相关资源
        最近更新 更多