Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 性能嵌套存在与交叉应用_Sql_Sql Server_Microsoft Dynamics_X++_Dynamics Ax 2012 - Fatal编程技术网

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

我想知道与交叉应用相比,exists联接的嵌套和/或表中的数据量是否会影响性能?我一直在努力关注连接,但我从未注意到在Axapta中使用exists和cross-apply之间存在巨大差异。在我测试的几乎所有案例中,exists连接都要快几毫秒

是否存在我希望避免在Axapta中使用exist联接的情况

提供相同结果的示例X++语句及其“已翻译”SQL查询:

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 = ?