跨 dblink 选择并插入
我在 Oracle 10 中通过 dblink 进行 select into insert 时遇到了一些麻烦。我使用以下语句:
INSERT INTO LOCAL.TABLE_1 ( COL1, COL2)
SELECT COL1, COL2
FROM REMOTE.TABLE1@dblink s
WHERE COL1 IN ( SELECT COL1 FROM WORKING_TABLE)
当我运行该语句时,以下是针对 DB Link 上的远程服务器运行的内容:
SELECT /*+ OPAQUE_TRANSFORM */ "COL1", "COL2"
FROM "REMOTE"."TABLE1" "S"
如果我运行仅选择而不执行插入到以下运行中:
SELECT /*+ */ "A1"."COL1"
, "A1"."COL2"
FROM "REMOTE"."TABLE1" "A1"
WHERE "A1"."COL1" =
ANY ( SELECT "A2"."COL1"
FROM "LOCAL"."TABLE1"@! "A2")
问题是在插入情况下,整个表正在通过 dblink 拉出,然后限制本地,考虑到表大小,这需要相当多的时间。添加插入物是否有任何原因会以这种方式改变行为?
I am having a bit of trouble with a select into insert across a dblink in oracle 10. I am using the following statement:
INSERT INTO LOCAL.TABLE_1 ( COL1, COL2)
SELECT COL1, COL2
FROM REMOTE.TABLE1@dblink s
WHERE COL1 IN ( SELECT COL1 FROM WORKING_TABLE)
When I run the statement the following is what gets run against the remote server on the DB Link:
SELECT /*+ OPAQUE_TRANSFORM */ "COL1", "COL2"
FROM "REMOTE"."TABLE1" "S"
If I run the select only and do not do the insert into the following is run:
SELECT /*+ */ "A1"."COL1"
, "A1"."COL2"
FROM "REMOTE"."TABLE1" "A1"
WHERE "A1"."COL1" =
ANY ( SELECT "A2"."COL1"
FROM "LOCAL"."TABLE1"@! "A2")
The issue is in the insert case the enitre table is being pulled across the dblink and then limited localy which takes a fair bit of time given the table size. Is there any reason adding the insert would change the behavior in this manner?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可能想要使用 Driving_site 提示。这里有一个很好的解释:
http://www.dba-oracle.com/t_sql_dblink_performance.htm
You may want to use the driving_site hint. There is a good explanation here:
http://www.dba-oracle.com/t_sql_dblink_performance.htm
当涉及到DML时,oracle选择忽略任何drive_site提示并在目标站点执行该语句。所以我怀疑你是否能够改变这一点(即使使用上述方法)。一种可能的解决方法是您可以在远程数据库上创建 LOCAL.TABLE1 的同义词,并在 INSERT 语句中使用相同的同义词。
When it comes to DML, oracle chooses to ignore any driving_site hint and executes the statement at the target site. So I doubt if you would be able to change that (even using WITH approach described above). A possible workaround is you can create a synonym for LOCAL.TABLE1 on the remote database and use the same in your INSERT statement.
利用WITH子句可以优化工作集的检索:
Leveraging the WITH clause could optimize your retrieval of your working set:
Oracle 将忽略插入语句的 Driving_site 提示,因为 DML 始终在本地执行。执行此操作的方法是使用驱动站点提示创建一个游标,然后使用bulkcollect/forall循环游标并插入到目标本地表中。
Oracle will ignore the driving_site hint for insert statements, as DML is always executed locally. The way to do this is to create a cursor with the driving site hint, and then loop through the cursor with a bulkcollect/forall and insert into the target local table.
WORKING_TABLE 有多大?
如果它足够小,您可以尝试从 work_table 中选择到一个集合中,然后将该集合的元素作为 IN 列表中的元素传递。
How big is WORKING_TABLE ?
If it is small enough, you could try selecting from work_table into a collection, and then passing the elements of that collect as elements in an IN list.
插入 zith 基数提示似乎在 11.2 中有效
Insert into zith cardinality hint seems to work in 11.2