我应该在Oracle中连接表之后或之前应用字符串操作

时间:2013-11-04 06:11:30

标签: oracle oracle11g inner-join substr

我有两个表需要内连接,一个表与另一个表相比具有相对较少的记录数。我需要对较小的表应用一些字符串操作,我的问题是我可以在连接后应用字符串函数,还是应该在子查询中应用它们然后将子选择加入到更大的表中?

一个例子是这样的:

选项1:

SELECT SUBSTR("SMALL_TABLE"."COL_NAME",x,y) "NEW_COL" FROM "BIG_TABLE"
JOIN "SMALL_TABLE" ON ...

选项2:

SELECT "NEW_COL"
FROM "BIG_TABLE"
JOIN 
(
SELECT SUBSTR("SMALL_TABLE"."COL_NAME",x,y) "NEW_COL" FROM "SMALL_TABLE"
) "T"
ON ...

对于性能选项1或2哪个更好? 我正在使用oracle 11g。

2 个答案:

答案 0 :(得分:3)

无论您如何构建查询,Oracle的优化器都可以在连接之前或之后自由评估函数。假设字符串操作仅作为投影步骤的一部分完成(即它仅在SELECT子句中完成,并且不用作WHERE子句中的谓词),我希望Oracle如果你使用任何一个公式,那么在加入表之前会应用SUBSTR因为它必须将函数应用于更少的行(尽管它可以将SUBSTR视为确定性调用并缓存结果它在连接后应用函数)。

与任何查询优化问题一样,第一步始终是生成查询计划,并查看不同的查询是否实际产生了不同的计划。我希望这些计划是相同的,因此,性能是相同的。但是,鉴于优化程序统计信息,初始化参数等,有两个选项中的一个可能会在您的系统上产生不同的计划。

答案 1 :(得分:-1)

最好在执行连接之前应用操作,然后加入并查询最终结果。这称为查询优化。 通过这样做你的问题,你将在“加入”时执行较少的操作,因为你将事先消除无用的行。
这里有很多例子:http://beginner-sql-tutorial.com/sql-query-tuning.htm
这是我能找到的最好的一个:http://www.cse.iitb.ac.in/~sudarsha/db-book/slide-dir/ch14.ppt