用于计算汉明距离的索引访问

弗朗西斯(Francis)

我有一个在数据库列中填充有字符串的表。我正在使用绑定变量计算列的汉明距离,然后使用单独的语句输出所有字符串值,例如汉明距离小于或等于3。

由于字符串值是绑定的,因此我无法在期望的结果上使用虚拟列,因为据我所知,这要求函数具有静态参数。另外,由于我的输出是派生列,因此无法使用基于函数的索引。

是否有替代解决方案,可以在不执行全表扫描的情况下优化查询?目前,扫描需要5到7秒,我想将其减少到300毫秒。谢谢你。

这是一些源代码:

CREATE OR REPLACE FUNCTION HAMMING_DIS(string1 IN varchar2, string2 IN varchar2)
RETURN number IS
distance number := 0;
BEGIN
   FOR counter IN 1..length(string1) LOOP
      IF substr(string1, counter, 1) = substr(string2, counter, 1) THEN
        distance:= distance + 1;
      END IF;
   END LOOP;
RETURN distance;
END;

SELECT * FROM
(SELECT FULL_NM AS FULL_NAME, HAMMING_DIS(FIRST_NM,'&A') AS HAMMING_DISTANCE 
 FROM STRINGS_OF_NAMES
 )
WHERE HAMMING_DISTANCE > 3;
马修·麦克佩克(Matthew McPeak)

感谢您的澄清...我将删除其他答案。

如果...而且这些都是很大的...

  • A)您始终想查找汉明距离<3的字符串(例如,有时不是<3,而有时不是<5),并且
  • B)您的表足够静态以允许使用BITMAP索引,

那么您可以利用以下事实:对您的查询的任何答案都必须在前4个字符中至少包含2个匹配项。

所以,

CREATE TABLE matt1 ( id number, str varchar(30) );

INSERT INTO matt1 SELECT rownum, dbms_random.string('U', dbms_random.value(1,30)) from dual connect by rownum <= 10000;

CREATE BITMAP INDEX i1 ON matt1 ( substr(rpad(str,4,' '),1,1) );
CREATE BITMAP INDEX i2 ON matt1 ( substr(rpad(str,4,' '),2,1) );
CREATE BITMAP INDEX i3 ON matt1 ( substr(rpad(str,4,' '),3,1) );
CREATE BITMAP INDEX i4 ON matt1 ( substr(rpad(str,4,' '),4,1) );


SELECT m.*, hamming_dis(str,:input) FROM matt1 m WHERE 
(
(substr(rpad(str,4,' '),1,1) = substr(rpad(:input,4,' '),1,1) AND 
substr(rpad(str,4,' '),2,1) = substr(rpad(:input,4,' '),2,1))
OR
(substr(rpad(str,4,' '),1,1) = substr(rpad(:input,4,' '),1,1) AND 
substr(rpad(str,4,' '),3,1) = substr(rpad(:input,4,' '),3,1))
OR
(substr(rpad(str,4,' '),1,1) = substr(rpad(:input,4,' '),1,1) AND 
substr(rpad(str,4,' '),4,1) = substr(rpad(:input,4,' '),4,1))
OR
(substr(rpad(str,4,' '),2,1) = substr(rpad(:input,4,' '),2,1) AND 
substr(rpad(str,4,' '),3,1) = substr(rpad(:input,4,' '),3,1))
OR
(substr(rpad(str,4,' '),2,1) = substr(rpad(:input,4,' '),2,1) AND 
substr(rpad(str,4,' '),4,1) = substr(rpad(:input,4,' '),4,1))
OR
(substr(rpad(str,4,' '),3,1) = substr(rpad(:input,4,' '),3,1) AND 
substr(rpad(str,4,' '),4,1) = substr(rpad(:input,4,' '),4,1))
)
AND hamming_dis(str,:input) <= 3;

您应该看到带有许多BITMAP ORBITMAP AND操作的执行计划

这可能会更快,因为您将限制实际需要计算确切汉明距离的行数。

注意:我看到您想要<= 3,而不是<3。该方法应该可以扩展到一定程度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

快速计算汉明距离

来自分类Dev

如何计算CRC码的汉明距离

来自分类Dev

汉明距离的倒数

来自分类Dev

汉明距离总和

来自分类Dev

有效使用python计算汉明距离

来自分类Dev

如何计算两个short int的汉明距离?

来自分类Dev

在VBA Excel中计算汉明重量和/或距离

来自分类Dev

使用`dplyr`计算有效汉明距离

来自分类Dev

确定最小汉明距离

来自分类Dev

汉明距离与 powershell 的比较

来自分类Dev

简单快速的方法来计算二进制整数到0的汉明距离?

来自分类Dev

我应该如何存储和计算二进制代码之间的汉明距离?

来自分类Dev

计算字符串和一组字符串之间的最小汉明距离

来自分类Dev

用C语言计算8位二进制值的汉明距离

来自分类Dev

计算两个整数矩阵/数据帧的所有行之间的成对汉明距离

来自分类Dev

计算c中布隆过滤器的汉明距离?

来自分类Dev

(速度挑战)根据通用汉明距离,有没有更快的方法来计算距离矩阵?

来自分类Dev

古代Microsoft DBMS中的汉明距离

来自分类Dev

MSSQL BIT_COUNT(汉明距离)

来自分类Dev

NetLogo:删除给定汉明距离的乌龟

来自分类Dev

选择汉明距离为零的读数

来自分类Dev

用python解释汉明距离速度

来自分类Dev

FLANN比赛之间的OpenCV汉明距离

来自分类Dev

优化的CUDA矩阵汉明距离

来自分类Dev

优化的CUDA矩阵汉明距离

来自分类Dev

根据两个数据帧之间的汉明距离,计算为匹配行而设置为1的位数

来自分类Dev

mysql两汉字之间的汉明距离

来自分类Dev

查找具有特定汉明距离LINQ的琴弦

来自分类Dev

对一组测试最小汉明距离的算法?