分布式数据库查询中 DRIVING_SITE 的疑问

本文详细解释了Oracle中的DRIVING_SITE提示如何改变分布式查询的执行位置,并探讨了其在优化大表连接时的作用。文中还讨论了在不使用此提示时Oracle如何决定数据传输的方向。
[i=s] 本帖最后由 tolywang 于 2011-12-8 15:56 编辑

Oracle 10.2.0.4 ,   Oracle 9.2.0.8   


DRIVING_SITE
The DRIVING_SITE hint forces query execution to be done at a different site than that selected
by Oracle. This hint can be used with either rule-based or cost-based optimization.  

For example:
SELECT /*+DRIVING_SITE(departments)*/  *  
FROM     employees,     [url=mailto:departments@rsite]departments@rsite[/url]
WHERE   employees.department_id = departments.department_id;   

If this query is executed without the hint,  then rows from departments are sent to
the local site, and the join is executed there. With the hint, the rows from employees
are sent to the remote site, and the query is executed there, returning the result to
the local site. This hint is useful if you are using distributed query optimization.

大概意思 :


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-712963/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-712963/

SELECT HSSI.ID AS id, HSSI.INVOICE_HEADER_ID AS invoiceHeaderId, HSSI.ISSUE_NUMBER AS issueNumber, HSSI.SITE_ID AS siteId, HSSI.COMPANY_NAME AS companyName, CASE WHEN HSSI.TAXPAYER_NATURE = 1 THEN '一般纳税人' ELSE '小规模' END AS taxpayerNatureString, CASE WHEN HSSI.TAXPAYER_NATURE = 1 THEN '数电专票' ELSE '数电普票' END AS invoiceType, HSSI.SITE_CODE AS siteCode, HSSI.SITE_NAME AS siteName, COALESCE(SUM(DISTINCT tax_sum.openedTax), 0) AS openedTax, COALESCE(SUM(DISTINCT tax_sum.openedExcludeTax), 0) AS openedExcludeTax, COALESCE(SUM(DISTINCT tax_sum.openedTaxPercent), 0) AS openedTaxPercent, CASE WHEN COALESCE(SUM(DISTINCT tax_sum.openedTax), 0) >= COALESCE(MAX(should_sum.itemAmount), 0) THEN '已开票' WHEN COALESCE(SUM(DISTINCT tax_sum.openedTax), 0) = 0 THEN '未开票' WHEN COALESCE(SUM(DISTINCT tax_sum.openedTax), 0) > 0 AND COALESCE(SUM(DISTINCT tax_sum.openedTax), 0) < COALESCE(MAX(should_sum.itemAmount), 0) THEN '开票中' ELSE '' END AS invoiceStatus, COALESCE(MAX(should_sum01.itemAmount), 0) AS materialShouldTax, COALESCE(MAX(should_sum02.itemAmount), 0) AS summaryShouldTax, COALESCE(SUM(red_sum.flushRedAmount), 0) AS flushRedAmount, HSSI.WORK_CODE AS workCode FROM HS_SITE_SHOULD_INVOICE HSSI LEFT JOIN ( SELECT ISSUE_NUMBER, SITE_ID, LISTAGG(WORK_CODE, ',') WITHIN GROUP (ORDER BY WORK_CODE) AS ADVANCE_WORK_CODES FROM HS_SITE_ADVANCE_INVOICE WHERE INVOICE_STATUS = 'INVOICE' GROUP BY ISSUE_NUMBER, SITE_ID ) advance_sum ON advance_sum.ISSUE_NUMBER = HSSI.ISSUE_NUMBER AND advance_sum.SITE_ID = HSSI.SITE_ID LEFT JOIN ( SELECT work_code, NVL(SUM(TOTAL_PRICE_TAX), 0) AS openedTax, NVL(SUM(TOTAL_AMOUNT), 0) AS openedExcludeTax, NVL(SUM(TOTAL_TAX), 0) AS openedTaxPercent FROM HS_TAX_ELECTRON_INVOICE WHERE PUSH_STATUS = 'INVOICE' AND ACCEPT_MESSAGE = '上传成功' GROUP BY work_code ) tax_sum ON tax_sum.work_code = HSSI.WORK_CODE OR (advance_sum.ADVANCE_WORK_CODES IS NOT NULL AND INSTR(',' || advance_sum.ADVANCE_WORK_CODES || ',', ',' || tax_sum.work_code || ',') > 0) LEFT JOIN ( SELECT ISSUE_NUMBER, BIZ_ID, NVL(SUM(AMOUNT), 0) AS itemAmount FROM HS_SITE_SHOULD_INVOICE_ITEM WHERE ITEM_TYPE IN ('MATERIAL', 'SUMMARY') AND EXTEND_TYPE IN ('TOTAL_AMOUNT', 'CONTAIN_TAX') GROUP BY ISSUE_NUMBER, BIZ_ID ) should_sum ON should_sum.ISSUE_NUMBER = HSSI.ISSUE_NUMBER AND should_sum.BIZ_ID = HSSI.ID LEFT JOIN ( SELECT ISSUE_NUMBER, BIZ_ID, NVL(SUM(AMOUNT), 0) AS itemAmount FROM HS_SITE_SHOULD_INVOICE_ITEM WHERE ITEM_TYPE = 'MATERIAL' AND EXTEND_TYPE = 'TOTAL_AMOUNT' GROUP BY ISSUE_NUMBER, BIZ_ID ) should_sum01 ON should_sum01.ISSUE_NUMBER = HSSI.ISSUE_NUMBER AND should_sum01.BIZ_ID = HSSI.ID LEFT JOIN ( SELECT ISSUE_NUMBER, BIZ_ID, NVL(SUM(AMOUNT), 0) AS itemAmount FROM HS_SITE_SHOULD_INVOICE_ITEM WHERE ITEM_TYPE = 'SUMMARY' AND EXTEND_TYPE = 'CONTAIN_TAX' GROUP BY ISSUE_NUMBER, BIZ_ID ) should_sum02 ON should_sum02.ISSUE_NUMBER = HSSI.ISSUE_NUMBER AND should_sum02.BIZ_ID = HSSI.ID LEFT JOIN ( SELECT HSIL_INNER.INVOICE_HEADER_ID, HSIL_INNER.ISSUE_NUMBER, NVL(SUM(HTEI_INNER.TOTAL_PRICE_TAX), 0) AS flushRedAmount FROM HS_SITE_INVOICE_INFO_LOG HSIL_INNER JOIN HS_TAX_ELECTRON_INVOICE HTEI_INNER ON HSIL_INNER.INVOICE_NUMBER = HTEI_INNER.INVOICE_NUMBER WHERE HSIL_INNER.BIZ_TYPE = 'RED_FLUSH' AND HTEI_INNER.PUSH_STATUS = 'INVOICE' GROUP BY HSIL_INNER.INVOICE_HEADER_ID, HSIL_INNER.ISSUE_NUMBER ) red_sum ON red_sum.INVOICE_HEADER_ID = HSSI.INVOICE_HEADER_ID AND red_sum.ISSUE_NUMBER = HSSI.ISSUE_NUMBER <include refid="dynamicDetailWhere"/> GROUP BY HSSI.ID, HSSI.INVOICE_HEADER_ID, HSSI.ISSUE_NUMBER, HSSI.SITE_ID, HSSI.COMPANY_NAME, HSSI.TAXPAYER_NATURE, HSSI.SITE_CODE, HSSI.SITE_NAME, HSSI.WORK_CODE ORDER BY HSSI.ID DESC, HSSI.SITE_ID DESC帮我优化一下
09-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值