Sql 性能嵌套存在与交叉应用
我想知道与交叉应用相比,exists联接的嵌套和/或表中的数据量是否会影响性能?我一直在努力关注连接,但我从未注意到在Axapta中使用exists和cross-apply之间存在巨大差异。在我测试的几乎所有案例中,exists连接都要快几毫秒 是否存在我希望避免在Axapta中使用exist联接的情况 提供相同结果的示例X++语句及其“已翻译”SQL查询:Sql 性能嵌套存在与交叉应用,sql,sql-server,microsoft-dynamics,x++,dynamics-ax-2012,Sql,Sql Server,Microsoft Dynamics,X++,Dynamics Ax 2012,我想知道与交叉应用相比,exists联接的嵌套和/或表中的数据量是否会影响性能?我一直在努力关注连接,但我从未注意到在Axapta中使用exists和cross-apply之间存在巨大差异。在我测试的几乎所有案例中,exists连接都要快几毫秒 是否存在我希望避免在Axapta中使用exist联接的情况 提供相同结果的示例X++语句及其“已翻译”SQL查询: SELECT FirstOnly FROM A EXISTS JOIN B WHERE B.RefRecId == A.RecId
SELECT FirstOnly FROM A
EXISTS JOIN B
WHERE B.RefRecId == A.RecId
EXISTS JOIN C
WHERE C.RefRecId == B.RecId;
SELECT TOP 1 T1.*
FROM TableA T1
WHERE T1.DataAreaId = ?
AND T1.Partition = ?
AND EXISTS (
SELECT TOP 1 'x'
FROM TableB T2
WHERE T2.Partition = ?
AND T2.DataAreaId = ?
AND T2.RefRecId = T1.RecId
AND EXISTS (
SELECT TOP 'x'
FROM TableC T3
WHERE T3.Partition = ?
AND T3.DataAreaId = ?
AND T3.RefRecId = T2.RecId
)
)
VS
比较执行计划和时间。我比较了跟踪数据库发现的不同查询的计划,结果有所不同。我正在寻找具体的查询构造,希望在其中避免存在联接。我通常会避免存在联接,并用常规联接内部联接替换它们,只要您可以保证该联接上有0或1条记录,否则结果集行数将更改,在这种情况下,需要存在联接
SELECT FirstOnly FROM A
JOIN RecId from B
WHERE B.RefRecId == A.RecId
JOIN RecId from C
WHERE C.RefRecId == B.RecId;
SELECT TOP 1 T1.*, T2.RecId, T2.Partition, T2.DataAreaId, T3.RecId, T3.Partition, T3.DataAreaId
FROM TableA T1
CROSS APPLY TableB T2
CROSS APPLY TableC T3
WHERE T1.Partition = ?
AND T1.DataAreaId = ?
AND T2.RefRecId = T1.RecId
AND T2.PARTITION = ?
AND T2.DataAreaId = ?
AND T3.RefRecId = T2.RecId
AND T3.PARTITION = ?
AND T3.DataAreaId = ?