我有一个简单的查询(Oracle 19)
SELECT T.ID, T.PID, R.MESS, R.REMOTE_USR, R.COMMENT
FROM TABLE1 T
JOIN SOME_VIEW@REMOTE R ON R.ID = T.PID
WHERE T.ID = 'some ID'
执行计划
在第一个查询中,您从本地表返回一行,并将其与整个远程视图进行比较。您无法了解该视图是如何构建的,远程数据库的工作负载或资源,或者在那里处理了多少数据,以及通过网络推送这些数据所带来的所有延迟。
在第二个查询中,您只从远程视图返回单行,显然处理得非常快,并将其与本地表比较,本地表也被快速访问。我不能肯定地说,因为你还没有包括任何更多的细节,但我怀疑远程视图在处理多行数据时不能很好地扩展;也许它有很多嵌入式的内联SQL函数?
本地数据库选择在本地表和远程表上使用散列连接。由于您的第一个查询没有对远程表应用任何谓词,因此它必须处理100%的数据,并通过网络将其返回给本地数据库。只有这样哈希连接才会发生,并且由于本地表上的谓词过滤器,您可以过滤到您想要的结果。
第二个查询将谓词应用到远程表。这就是将谓词推入视图,并允许该视图更有效地获取您想要的数据并只返回感兴趣的数据。
如果你总是使用TABLE1
的单行,那么你可能想要强制嵌套循环:
SELECT /*+ LEADING(t) USE_NL(R) */ T.ID, T.PID, R.MESS, R.REMOTE_USR, R.COMMENT
FROM TABLE1 T
JOIN SOME_VIEW@REMOTE R ON R.ID = T.PID
WHERE T.ID = 'some ID'