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