3

我有一个复杂的 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 是一个输入参数(基本上是一个数字)。

由于这些索引,我的 Query 1 运行效率很高。但是查询 2 有一个性能问题,就像在查询 2 中一样,'t2.name' 以 p_in_prefix 为前缀。

我无法为查询 2 创建基于函数的索引,因为 p_in_prefix 是一个输入参数,我不知道在创建索引时它可能包含什么值。在这种情况下如何解决性能问题?任何提示/想法将不胜感激。如果您需要更多信息,请告诉我。谢谢。

4

1 回答 1

0

使用AND UPPER(t1.name) = UPPER(p_in_prefix) || UPPER(t2.name).

由于您有一个基于函数的索引UPPER(NAME)table2因此您应该在查询中有一个具有相同表达式的操作数,以便使用基于函数的索引。

UsingUPPER(p_in_prefix || t2.name)不会使用基于函数的索引,因为它与函数表达式不匹配UPPER(NAME)。请注意,使用UPPER(t2.name)不会导致任何问题,因为t2它只是列别名。

除此之外,您还可以在查询中传递优化器提示,以指示优化器使用索引。

有关更多信息,请阅读 Jason Price 的“Oracle 数据库 11g SQL”。

另请阅读此处此处的Oracle 文档以及此处的优化器提示。

于 2013-04-03T18:11:57.543 回答