Pra*_*uka 41 join sql-server cross-apply
我正在使用 SQL SERVER 2008 R2
我刚刚在 SQL 中遇到 APPLY 并且喜欢它如何解决如此多情况下的查询问题,
我使用 2 个左连接来获得结果的许多表,我能够获得 1 个外部应用。
我的本地数据库表中有少量数据,部署后代码应该在至少 20 倍大的数据上运行。
我担心对于大量数据,外部应用可能需要比 2 个左连接条件更长的时间,
谁能告诉我 apply 究竟是如何工作的,以及它如何影响非常大数据的性能,如果可能的话,每个表的大小有一些比例关系,比如与 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
Run Code Online (Sandbox Code Playgroud)
这是带有外部应用的查询
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
Run Code Online (Sandbox Code Playgroud)
Pau*_*ite 49
谁能说出 apply 的工作原理以及它将如何影响非常大的数据中的性能
APPLY是相关LATERAL JOIN联接(在某些产品和 SQL 标准的较新版本中称为 a )。与任何逻辑结构一样,它对性能没有直接影响。原则上,我们应该能够使用任何逻辑上等效的语法编写查询,并且优化器会将我们的输入转换为完全相同的物理执行计划。
当然,这需要优化器了解每一种可能的转换,并有时间考虑每一种转换。这个过程很可能比当前宇宙的年龄需要更长的时间,所以大多数商业产品不采用这种方法。因此,查询语法可以而且经常确实对最终性能产生影响,尽管很难对哪个更好以及为什么更好做出一般性陈述。
的特定形式OUTER APPLY ( SELECT TOP ... )最有可能在当前版本的 SQL Server 中导致相关的嵌套循环连接,因为优化器不包含将此模式转换为等效JOIN. 如果外部输入很大且内部输入未编入索引,或者所需的页面尚未在内存中,则相关嵌套循环连接可能无法很好地执行。此外,优化器成本模型的特定元素意味着相关的嵌套循环连接比语义相同的不太可能JOIN产生并行执行计划。
我能够使用单个左连接和 row_number() 进行相同的查询
在一般情况下,这可能会更好,也可能不会更好。您将需要使用代表性数据对这两种替代方案进行性能测试。在LEFT JOIN与ROW_NUMBER肯定有潜力成为更有效,但它取决于所选择的精确查询计划形状。影响此方法效率的主要因素是索引的可用性以覆盖所需的列,并提供PARTITION BYandORDER BY子句所需的顺序。第二个因素是桌子的大小。如果查询涉及相关表的相对较小的部分,则高效且索引良好的索引APPLY可以胜过ROW_NUMBER具有最佳索引的索引。需要测试。
| 归档时间: |
|
| 查看次数: |
84379 次 |
| 最近记录: |