sql-server – 外部应用vs左毗连机能
我正在行使SQL SERVER 2008 R2 我方才在SQL中碰着了APPLY,而且喜好它办理了许多环境下的查询题目, 我正在行使的很多表格左边插手以得到功效,我可以或许得到1个外部申请. 我在当地数据库表中有少量数据,在陈设之后,代码应该在至少20倍的数据上运行. 我担忧外部应用也许必要比大量数据的2个左毗连前提更长的时刻, 任何人都可以汇报详细应用的事变道理以及它怎样影响很是大的数据的机能, 这是带有2个左毗连的查询 select EC.*,DPD.* from Table1 eC left join ( select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2 group by member_id,group_gid ) DPD2 on DPD2.parent_gid = Ec.parent_gid AND DPD2.child_gid = EC.child_gid AND DPD2.member_id = EC.member_id AND DPD2.LOB = EC.default_lob AND DPD2.group_gid = EC.group_gid left join Table2 dpd on dpd.parent_gid = dpd2.parent_gid and dpd.child_gid = dpd2.child_gid and dpd.member_id = dpd2.member_id and dpd.group_gid = dpd2.group_gid and dpd.LOB = dpd2.LOB and dpd.table2_sid = dpd2.mdsid 这是带有外部申请的查询 select * from Table1 ec OUTER APPLY ( select top 1 grace_begin_date,retroactive_begin_date,Isretroactive from Table2 DPD where DPD.parent_gid = Ec.parent_gid AND DPD.child_gid = EC.child_gid AND DPD.member_id = EC.member_id AND DPD.LOB = EC.default_lob AND DPD.group_gid = EC.group_gid order by DPD.table2_sid desc ) DPD 办理要领
APPLY是一个相干联接(在某些产物和SQL尺度的较新版本中称为LATERAL JOIN).与任何逻辑布局一样,它对机能没有直接影响.原则上,我们应该可以或许行使任何逻辑上等效的语法编写查询,而且优化器会将输入转换为完全沟通的物理执行打算. 虽然,这必要优化器知道每个也许的转换,并偶然刻思量每个转换.这个进程也许必要比此刻的宇宙年数更长的时刻,因此大大都贸易产物都不回收这种要领.因此,查询语法也许而且凡是会对最终机能发生影响,但很难对哪个更好以及为什么做出一样平常性告诉. OUTER APPLY(SELECT TOP …)的特定情势最有也许导致SQL Server当前版本中的相干嵌套轮回毗连,由于优化器不包括将此模式转换为等效JOIN的逻辑.假如外部输入很大,而且内部输入未编入索引,可能所需页面尚未在内存中,则相干嵌套轮回毗连也许无法正常执行.另外,优化措施的本钱模子的特定元素意味着相干的嵌套轮回毗连比语义沟通的JOIN更不行能天生并行执行打算.
在一样平常环境下,这也许会或也许不会更好.您必要行使代表性数据对两种备选方案举办机能测试. LEFT JOIN和ROW_NUMBER必定有也许更高效,但它取决于所选择的准确查询打算外形.影响此要领服从的首要身分是索引的可用性,以包围所需的列,并提供PARTITION BY和ORDER BY子句所需的次序.第二个身分是表的巨细.假如查询触及相干表的相对较小的部门,则有用且索引精采的APPLY可以优于具有最佳索引的ROW_NUMBER.必要举办测试. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |