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