加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 外部应用vs左毗连机能

发布时间:2021-05-24 02:55:22 所属栏目:编程 来源:网络整理
导读:我正在行使SQL SERVER 2008 R2 我方才在SQL中碰着了APPLY,而且喜好它办理了许多环境下的查询题目, 我正在行使的很多表格左边插手以得到功效,我可以或许得到1个外部申请. 我在当地数据库表中有少量数据,在陈设之后,代码应该在至少20倍的数据上运行. 我担忧外部应用

我正在行使SQL SERVER 2008 R2

我方才在SQL中碰着了APPLY,而且喜好它办理了许多环境下的查询题目,

我正在行使的很多表格左边插手以得到功效,我可以或许得到1个外部申请.

我在当地数据库表中有少量数据,在陈设之后,代码应该在至少20倍的数据上运行.

我担忧外部应用也许必要比大量数据的2个左毗连前提更长的时刻,

任何人都可以汇报详细应用的事变道理以及它怎样影响很是大的数据的机能,
假如也许的话,与每个表的巨细成比例相关,譬喻与n1 ^ 1或n1 ^ 2 …成比例,个中n1是表1中的行数.

这是带有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

办理要领

Can anyone tell how exactly apply works and how will it effect the performance in very large data

APPLY是一个相干联接(在某些产物和SQL尺度的较新版本中称为LATERAL JOIN).与任何逻辑布局一样,它对机能没有直接影响.原则上,我们应该可以或许行使任何逻辑上等效的语法编写查询,而且优化器会将输入转换为完全沟通的物理执行打算.

虽然,这必要优化器知道每个也许的转换,并偶然刻思量每个转换.这个进程也许必要比此刻的宇宙年数更长的时刻,因此大大都贸易产物都不回收这种要领.因此,查询语法也许而且凡是会对最终机能发生影响,但很难对哪个更好以及为什么做出一样平常性告诉.

OUTER APPLY(SELECT TOP …)的特定情势最有也许导致SQL Server当前版本中的相干嵌套轮回毗连,由于优化器不包括将此模式转换为等效JOIN的逻辑.假如外部输入很大,而且内部输入未编入索引,可能所需页面尚未在内存中,则相干嵌套轮回毗连也许无法正常执行.另外,优化措施的本钱模子的特定元素意味着相干的嵌套轮回毗连比语义沟通的JOIN更不行能天生并行执行打算.

I was able to make same query with single left join and row_number()

在一样平常环境下,这也许会或也许不会更好.您必要行使代表性数据对两种备选方案举办机能测试. LEFT JOIN和ROW_NUMBER必定有也许更高效,但它取决于所选择的准确查询打算外形.影响此要领服从的首要身分是索引的可用性,以包围所需的列,并提供PARTITION BY和ORDER BY子句所需的次序.第二个身分是表的巨细.假如查询触及相干表的相对较小的部门,则有用且索引精采的APPLY可以优于具有最佳索引的ROW_NUMBER.必要举办测试.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读