我有一个简单的查询(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'
执行计划
| 身份证|操作|姓名|行|字节|费用|时间|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 0|SELECT语句||1|二百八十|二十三|00:00:01|
| * 1|哈希连接||1|二百八十|二十三|00:00:01|
| 二|按索引行访问表|表1|1|五十七|1|00:00:01|
| * 三|索引唯一扫描|PK_TABLE1_ID|1||0|00:00:01|
| 四|远程|一些观点|二|四四六|二十二|00:00:01|
运行时间太长。TABLE 1的行数少于100行,字段ID是主键。
但是查询
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 R.ID = 'some PID'
身份证 | 操作 | 姓名 | 行 | 字节 | 费用 | 时间 |
---|---|---|---|---|---|---|
0 | SELECT语句 | 1 | 二百七十四 | 二十五 | 00:00:01 | |
* 1 | 哈希连接 | 1 | 二百七十四 | 二十五 | 00:00:01 | |
二 | 远程 | 一些观点 | 1 | 二百二十三 | 二十二 | 00:00:01 |
* 三 | 表访问已满 | 表1 | 1 | 五十一 | 三 | 00:00:01 |
很完美我不明白为什么
2条答案
按热度按时间ccgok5k51#
在第一个查询中,您将从本地表返回一行,并将其与整个远程视图进行比较。您无法了解该视图的构造方式、远程数据库的工作负载或资源,或者在通过网络推送数据所带来的所有延迟的情况下正在处理的数据量。
在第二个查询中,您只从远程视图返回了一行,这一行显然处理得非常快,并将其与本地表进行比较,本地表也被快速访问。我不能肯定,因为您没有包含更多的细节,但我怀疑远程视图在处理多行数据时不能很好地扩展;也许它有很多嵌入式内联SQL函数?
mwngjboj2#
您的本地数据库选择在本地表和远程表上使用散列连接。由于您的第一个查询没有将任何 predicate 应用到远程表,因此它必须处理100%的数据并通过网络将其返回到本地数据库。只有这样才会发生散列连接,并且由于本地表上的 predicate 过滤器,您可以过滤到您想要的结果。
第二个查询是将 predicate 应用到远程表。这是将 predicate 推送到视图中,并允许该视图更有效地获取所需的数据,并仅返回感兴趣的数据。
如果你总是要处理
TABLE1
中的一行,那么你可能需要强制一个嵌套循环: