为什么使用Remote View的查询执行时间太长?



我有一个简单的查询(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'

执行计划

0SELECT STATEMENT* 1散列连接2TABLE ACCESS BY INDEX ROWIDTABLE1* 3INDEX UNIQUE SCANPK_TABLE1_ID000:00:01

在第一个查询中,您从本地表返回一行,并将其与整个远程视图进行比较。您无法了解该视图是如何构建的,远程数据库的工作负载或资源,或者在那里处理了多少数据,以及通过网络推送这些数据所带来的所有延迟。

在第二个查询中,您只从远程视图返回单行,显然处理得非常快,并将其与本地表比较,本地表也被快速访问。我不能肯定地说,因为你还没有包括任何更多的细节,但我怀疑远程视图在处理多行数据时不能很好地扩展;也许它有很多嵌入式的内联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'

相关内容

  • 没有找到相关文章

最新更新