0

実行しているクエリの一部をここに示します。

SELECT SUM(ParentTable.Field1),
       (SELECT SUM(ChildrenTable.Field1)
       FROM ChildrenRable INNER JOIN
           GrandChildrenTable ON ChildrenTable.Id = GrandChildrenTable.ChildrenTableId INNER JOIN
           AnotherTable ON GrandChildrenTable.AnotherTableId = AnotherTable.Id
       WHERE ChildrenTable.ParentBaleId = ParentTable.Id
       AND AnotherTable.Type=1),
       ----
FROM ParentTable
WHERE some_conditions

関係:

ParentTable -> ChildrenTable = 1-to-many
ChildrenTable -> GrandChildrenTable = 1-to-many
GrandChildrenTable -> AnotherTable = 1-to-1

Type 条件のみを変更しながら、このクエリを 3 回実行しています。結果は次のとおりです。

返されるレコード数:

Condition   Total execution time (ms)
Type = 1 :            973
Type = 2 :          78810
Type = 3 :         648318

内部結合クエリのみを実行すると、結合されたレコードの数は次のようになります。

SELECT p.Type, COUNT(*)
FROM CycleActivities ca INNER JOIN
     CycleActivityProducts cap ON ca.Id = CAP.CycleActivityId INNER JOIN
 Products p ON cap.ProductId = p.Id
GROUP BY p.Type

Type 
---- -----------
1     55152
2     13401
4    102730

では、Type = 1 条件のクエリは、4 倍の結果セット (Type は tinyint) をクエリしているのに、Type = 2 条件のクエリよりもはるかに高速に実行されるのはなぜでしょうか?

4

1 に答える 1

0

クエリの記述方法により、SQL ServerJOINは、出力のすべての行に対してサブクエリを実行するように指示されます。

あなたが何を望んでいるかを正しく理解していれば、この方法はより速くなるはずです(更新):

with cte_parent as (
   select 
      Id,
      SUM (ParentTable.Field1) as Parent_Sum
from ParentTable
group by Id
), 

cte_child as (
    SELECT
       Id,
       SUM (ChildrenTable.Field1) as as Child_Sum
    FROM ChildrenRable 
       INNER JOIN
           GrandChildrenTable ON ChildrenTable.Id = GrandChildrenTable.ChildrenTableId 
       INNER JOIN
           AnotherTable ON GrandChildrenTable.AnotherTableId = AnotherTable.Id
    WHERE 
           AnotherTable.Type=1
       AND
           some_conditions
    GROUP BY Id
)

select cte_parent.id, Parent_Sum, Child_Sum
from parent_cte 
join child_cte on parent_cte.id = child_cte.id
于 2013-06-22T21:45:15.723 に答える