Oracle:使用动态值的基于函数的索引

时间:2013-04-03 10:36:49

标签: performance oracle function indexing dynamic-data

我有一个复杂的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是一个输入参数,我在创建索引时不知道它可能包含的值。如何解决此方案中的性能问题?任何提示/想法将不胜感激。如果您需要更多信息,请告诉我。 感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

有关更多信息,请阅读Jason Price撰写的“Oracle Database 11g SQL”。

另请阅读Oracle文档herehere以及优化提示here