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

本文深入探讨了在分布式数据库环境中,如何通过使用HINT(如/*+DRIVING_SITE(departments)*/)优化查询性能,特别是在面对大量数据传输时的策略。讨论了在本地与远程表数据传输过程中的成本考量,以及HINT如何影响查询执行路径和资源消耗。

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/

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
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值