【发布时间】:2013-03-24 23:37:35
【问题描述】:
我有一个复杂的 SQL 查询。查询的一个简单部分如下所示:
Query 1:
SELECT *
FROM table1 t1, table2 t2
WHERE t1.number = t2.number
AND UPPER(t1.name) = UPPER(t2.name)
AND t1.prefix = p_in_prefix;
Query 2:
SELECT *
FROM table1 t1, table2 t2
WHERE t1.number = t2.number
AND UPPER(t1.name) = UPPER(p_in_prefix || t2.name)
AND t1.prefix = p_in_prefix;
我在 table1 上有基于函数的索引为 (number, UPPER(name))。我的 table2 上有基于函数的索引为 (number, UPPER(NAME))。 p_in_prefix 是一个输入参数(基本上是一个数字)。
由于这些索引,我的查询 1 运行效率很高。但查询 2 存在性能问题,如查询 2 中,'t2.name' 以 p_in_prefix 为前缀。
我无法为查询 2 创建基于函数的索引,因为 p_in_prefix 是一个输入参数,我在创建索引时不知道它可能包含哪些值。在这种情况下如何解决性能问题?任何提示/想法将不胜感激。如果您需要更多信息,请告诉我。 谢谢。
【问题讨论】:
-
p_in_prefix中的值是否与 TABLE2 中的任何字段对应?它还显示 TABLE1.NAME 中的数据设置不正确 - 您有一个单独的 PREFIX 字段,但 PREFIX 似乎预先添加到 NAME 的某些值。您可以尝试将查询 2 重写为SELECT * FROM table1 t1, table2 t2 WHERE t1.number = t2.number AND UPPER(t1.name) = UPPER(t1.prefix || t2.name) AND t1.prefix = p_in_prefix。不知道这能买多少钱,但值得一试。分享和享受。
标签: performance oracle function indexing dynamic-data