我正在使用SQL SERVER 2008 R2

我刚刚在SQL中遇到了APPLY,并且很喜欢它如何解决很多情况下的查询问题,

我使用的许多表2左联接可以得到结果,我可以在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,parent_gid,child_gid,LOB,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


这是带有外部Apply的查询

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 


/>

#1 楼


谁能说说应用程序如何工作以及如何影响超大数据的性能。


SQL标准)。像任何逻辑构造一样,它对性能没有直接影响。原则上,我们应该能够使用任何逻辑上等效的语法编写查询,并且优化程序会将我们的输入转换为完全相同的物理执行计划。

当然,这将需要优化程序知道每个可能的转换,并有时间考虑每个。这个过程可能需要比当前的宇宙时代更长的时间,因此大多数商业产品都不采用这种方法。因此,查询语法可能而且经常确实会影响最终性能,尽管很难就哪个更好以及为什么做一般性陈述。

APPLY的特定形式最有可能产生在关联的嵌套循环中加入SQL Server的当前版本,因为优化器不包含将这种模式转换为等效LATERAL JOIN的逻辑。如果外部输入很大,内部输入没有索引,或者所需的页面尚未在内存中,则相关的嵌套循环联接可能无法很好地执行。此外,优化程序成本模型的特定元素意味着相关的嵌套循环联接比语义相同的OUTER APPLY ( SELECT TOP ... )不太可能产生并行执行计划。


我能够做到相同单左联接和row_number()查询


在一般情况下,这可能会更好,也可能不会更好。您将需要使用代表性数据对这两种选择进行性能测试。 JOINJOIN当然具有提高效率的潜力,但这取决于所选择的精确查询计划形状。影响此方法效率的主要因素是索引的可用性,以覆盖所需的列并提供LEFT JOINROW_NUMBER子句所需的顺序。第二个因素是表格的大小。如果查询触及相关表的一小部分,则高效且索引良好的PARTITION BY可以胜过ORDER BY的最佳索引。需要测试。

评论


这是外部应用的很好的讨论。为此,有人对NOT IN,NOT EXISTS和OUTER APPLY的不同版本进行了一些性能测试。

–yeOldeDataSmythe
20年6月1日在15:24

#2 楼

第一个查询可能只对SQL Server发出一个请求来并行运行。
它获取了所有记录并根据过滤条件提供输出。

但是第二个查询则逐行运行和
将对Table2的每一行进行扫描并附加到结果中。

如果外部查询的记录较少,则第二个记录更好(适用外部)。
但是如果第一个查询可能会获得更多数据,那么您应该使用第一个。