【发布时间】:2016-10-31 01:36:23
【问题描述】:
我有一个在数据库列中填充了字符串的表。我正在使用绑定变量计算列的汉明距离,然后使用单独的语句输出所有字符串值,例如,汉明距离小于或等于 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;
【问题讨论】:
-
你到底在比较什么?带有变量的列?一列与该列的所有其他实例?另外,你能给我们一些关于价值观的信息吗?它们总是具有相同的长度吗?如果不是,那么我假设函数或查询需要抛出不同长度的值。 “小于等于3”是静态的,还是要比较不同的值?
-
您是否使用 PL/SQL 函数来计算汉明距离?如果是,请显示此功能的源代码。可能是您主要受 SQL-PL/SQL 上下文切换的影响。
标签: oracle indexing plsql oracle11g query-performance