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