1

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

一个例子是这样的:

选项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。

4

2 回答 2

3

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

与任何查询优化问题一样,第一步始终是生成查询计划并查看不同的查询是否实际产生不同的计划。我希望计划是相同的,因此性能是相同的。但是,考虑到您的优化器统计信息、初始化参数等,这两个选项之一可能会在您的系统上产生不同的计划有很多原因。

于 2013-11-04T06:56:28.190 回答
-1

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

于 2013-11-04T06:44:32.477 回答