我正在尝试根据一个函数的结果创建一个索引,该函数应用了一个我必须提取数字的列。
Example String: ...someText...&idDocunet=799493...someText...
[799493] <- Note the number
The function: replace(regexp_substr(parametros, '&idDocunet=\d+'), 'idDocunet=', NULL)
The index: create index example on MY_TABLE (replace(regexp_substr(parametros, '&idDocunet=\d+'), 'idDocunet=', NULL));
但是当我运行这个查询时:
SELECT *
FROM my_table
WHERE replace(regexp_substr(parametros, '&idDocunet=\d+'), 'idDocunet=', NULL) IS NOT NULL.
或者这个
SELECT *
FROM my_table
WHERE replace(regexp_substr(parametros, '&idDocunet=\d+'), 'idDocunet=', NULL) = 799493
或者加入...
不使用索引,每次都会执行全表扫描。我相信索引是确定性的,因为它总是会返回数字或 null 但我不知道表达式是否太复杂而无法使用。我也尝试将代码移动到函数中,但它是相同的。我相信关键在于这个确定性的事情(我做错了吗?)和/或原始列上具有空值的表。如何确保使用索引?这是功能:
create or replace function extraer_doc_id(viParam VARCHAR2) return varchar2 is
begin
RETURN replace(regexp_substr(viParam, '&idDocunet=\d+'), 'idDocunet=', NULL);
end extraer_doc_id;
我也执行了这个
ANALYZE TABLE my_table COMPUTE STATISTICS;
但这似乎无关紧要。