我有 2 个表要加入,比如 A 和 B。A 较小,有 10k 条记录,B 有几百万条记录。连接在 Aa = Bb a 和 b 都没有索引。我可以在较小的桌子上进行更改,但不能在大桌子上进行更改。而且我需要为连接转换 Bb 的数据类型。查询需要很长时间才能运行。有什么办法可以提高性能吗?
问问题
548 次
2 回答
1
最有可能获得最佳性能的连接方法是哈希连接,因此不会使用索引。
要转换的列将是较小表中的连接列,但这仅仅是因为这可能需要更少的 CPU 周期。
只要从较小的表构建的哈希表适合 PGA 内存,查询应该花费与两个表的全表扫描大致相同的时间——在查询执行期间检查 v$sql_workarea_active 以监控表以及它是否溢出到临时表空间。
于 2013-06-28T20:20:53.393 回答
0
如果可能的话,我建议在较小的表上进行转换并向较大的表添加索引(因为转换无论如何都会阻止使用索引)。
如果您由于某种原因无法执行此操作,或者您想返回较大表的大部分(例如超过 15% 以上),则全表扫描可能是最有效的选择。更多关于这里的细节(http://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:9422487749968)。
如果从上面你得出的结论是全表扫描是可以的(或只是必要的),那么如果你有硬件,查询中的并行提示可能会有所帮助:
select /*+ parallel(B,default) */ <columns here> ...
在上面的代码中,B 是您希望将并行提示应用于(大)的表的别名,默认是要使用的核心数,如果您愿意,可以在此处指定一个数字。
在没有看到查询语法的情况下,我无法建议是否还有其他收获。
于 2013-06-28T19:12:05.110 回答