SELECT /*+DRIVING_SITE(departments)*/ *
FROM employees, [url=mailto:departments@rsite]departments@rsite[/url]
WHERE employees.department_id = departments.department_id;
DRIVING_SITE 提示强制在和Oracle选择不同的一端执行语句, 这个Hint可以用在
rule-based及cost-based 优化模式下。
如果上面的语句没有 /*+DRIVING_SITE(departments)*/ 提示, 远端的表 departments
的行要被传输到local site , 在local site 执行连接语句, 如果有这个提示, 那么
本地的 employees 表的行会被传到远端site, 查询在远端site执行, 然后返回结果到
本地, 这个 hint 在分布式查询优化中还是有用的 。
问题 :
很多时候我们做分布式数据库查询的时候,基本都是本地远端都是大表, 较少用到一个是很小
的配置表, 一个是所谓的detail 大表, 那么在都是几千万的大表的情况下 , 不管是本地传输到
远端 , 还是远端传输到本地 , 表的 rows 传输都是一个大的资源消耗 , 这时我们一般会选择
默认的 , 即不使用hint, 让远端表行传输到本地运行, 直接出结果, 省了使用Hint最后还需要从
远端传结果这一 步 .
1. 确认一下,不使用任何hint 的情况下 , 一定是远端的表数据行传输到本地来联合执行 ?
还是说有 cost 比较来决定, 如果是 cost 比较决定, 好像也不现实 , 远端表的rows
传输过来 , 统计信息没有过来, 咋整 ? 还有, 难不成Oracle 把可能的情况 都试一遍 ,
" 都在本地 " 或" 都在远端 " 分别计算Cost ?但这成本太高 . 尝试使用SQL trace
来跟踪查询SQL , 没有看到有用的信息 。
2. 远端传输到本地的 rows 是远端整张表的所有行 ? 他们都临时一次性存储在本地库的
data buffer cache ? 还是其他地方 ?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-735977/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-735977/
本文深入探讨了在分布式数据库环境中,如何通过使用HINT(如/*+DRIVING_SITE(departments)*/)优化查询性能,特别是在面对大量数据传输时的策略。讨论了在本地与远程表数据传输过程中的成本考量,以及HINT如何影响查询执行路径和资源消耗。
1076

被折叠的 条评论
为什么被折叠?



