1

SQL Server 2008 R2で次のクエリを実行した場合、count(*)集計はOUTER SELECTクエリに対して1回だけ決定されますか、それともOUTER SELECTのすべてのレコードに対して繰り返されますか?

SQL Serverは、同じ計算が繰り返されていることを確認するのにインテリジェントであるため、最適化の目的でこの計算を1回だけ実行すると推測していました。以下のinqueryの値はTotalCount、外部クエリのすべての行で同じになります。

SELECT 
    p.ProductId, p.ProductName,
    (select count(*) from Products p1) as TotalCount 
FROM Products p
4

1 に答える 1

1

いいえ、SQL Server に期待しすぎています。また、クエリプロセッサは、この値が時間の経過とともに変化しないことを実際に確認できないため、これを実際に「最適化」することはできません。

1 行ごとに、このサブクエリが 1 回実行されます。

したがって、SELECTステートメントが 1,000 万行を返す場合、このカウントは 1,000 万回決定されます。

それが望ましくない場合は、いつでもselect count(*)..クエリの前に 1 回実行し、値を SQL 変数に格納して、クエリでその変数を選択できます。

DECLARE @TableCount INT

SELECT @TableCount = COUNT(*) FROM Products

SELECT 
    p.ProductId, p.ProductName, @TableCount
FROM 
    Products p
于 2012-11-24T19:15:05.597 に答える