私は2つの異なるクエリの相対的なパフォーマンスを判断しようとしていますが、これを測定する2つの方法があります:
1。両方を実行し、各クエリを実行します
2。両方を実行し、実際の実行計画から「クエリコスト」を取得します
クエリの時間を計るために実行するコードは次のとおりです...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
私が得るものは次のとおりです:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
実行時間の結果はクエリコストの結果と直接矛盾しますが、「クエリコスト」が実際に何を意味するかを判断するのは困難です。私の最良の推測は、読み取り/書き込み/ CPU_Time /などの集合であるため、いくつか質問があると思います。
この尺度の意味を説明する決定的な情報源はありますか?
他にどのような「クエリパフォーマンス」の指標が使用されていますか?また、それらの相対的なメリットは何ですか?
これは中規模のSQL Serverであり、複数のプロセッサと100人以上の同時ユーザーを備えたMS Server 2003 Enterprise EditionでMS SQL Server 2005を実行していることに注意することが重要です。
編集:
面倒な後、私はそのSQL Serverでプロファイラーアクセスを取得し、追加情報を提供できます(実行時間自体ではなく、システムリソースに関連するクエリコストをサポートしています...)
Stored_Proc CPU Reads Writes Duration
test_1a 1313 3975 93 1386
test_1b 2297 49839 93 1207
より多くの読み取りでより多くのCPUを使用するのにかかる時間が短くなることは印象的です:)
プロファイラートレースは、それをパースペクティブにします。
クエリBは並列処理を使用しています:CPU>期間。たとえば、クエリは2つのCPUを使用し、それぞれ平均1.15秒
クエリAはおそらくそうではありません:CPU <期間
これにより、バッチに関連するコストが説明されます。シンプルな非並列クエリプランの17%です。
オプティマイザーは、クエリBの方が余分な労力を必要としますが、クエリBの方が高価であり、並列処理の恩恵を受けることがわかります。
ただし、クエリBは2 CPUの100%(4 CPUの場合は50%)を1秒程度使用することに注意してください。クエリAは、1つのCPUの100%を1.5秒間使用します。
クエリAのピークは低くなりますが、期間が長くなります。 1人のユーザーで、誰が気にしますか? 100では、おそらく違いが生じます...
SET STATISTICS TIME ON
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
SET STATISTICS TIME OFF;
そして、メッセージタブを見て、それは次のようになります:
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 10 ms.
(778 row(s) affected)
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
実行時間の結果はクエリコストの結果と直接矛盾しますが、「クエリコスト」が実際に何を意味するかを判断するのは困難です。
Query cost
は、オプティマイザーがクエリの所要時間を考えるものです(合計バッチ時間に対して)。
オプティマイザは、クエリとデータの統計を確認し、いくつかの実行プランを試し、それらの中で最もコストの低いものを選択することにより、最適なクエリプランを選択しようとします。
Here これをどのようにしようとするのかについて詳しく読むことができます。
ご覧のとおり、これは実際に得られるものと大きく異なる場合があります。
実際のクエリパフォーマンスメトリックは、もちろん、クエリに実際にかかる時間です。
つかいます SET STATISTICS TIME ON
クエリの上。
結果タブの近くに、メッセージタブが表示されます。そこで時間を見ることができます。
古い質問だと理解していますが、コストは同じであるが、あるクエリが他のクエリよりも優れている例を追加したいと思います。
質問で見たように、実行計画に表示される%は、最適なクエリを決定する唯一の尺度ではありません。次の例では、同じタスクを実行する2つのクエリがあります。実行計画では、両方とも同等に優れていることが示されています(それぞれ50%)。今、私はSET STATISTICS IO ON
を使用してクエリを実行しました。これは明らかな違いを示しています。
次の例では、クエリ1はseek
を使用しますが、クエリ2はテーブルLWManifestOrderLineItemsでscan
を使用します。ただし、実際に実行時間を確認すると、クエリ2の方がうまく機能していることがわかります。
シークがシークではない場合 ポール・ホワイト
[〜#〜] query [〜#〜]
---Preparation---------------
-----------------------------
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
SET STATISTICS IO ON --IO
SET STATISTICS TIME ON
--------Queries---------------
------------------------------
SELECT LW.Manifest,LW.OrderID,COUNT(DISTINCT LineItemID)
FROM LWManifestOrderLineItems LW
INNER JOIN ManifestContainers MC
ON MC.Manifest = LW.Manifest
GROUP BY LW.Manifest,LW.OrderID
ORDER BY COUNT(DISTINCT LineItemID) DESC
SELECT LW.Manifest,LW.OrderID,COUNT( LineItemID) LineCount
FROM LWManifestOrderLineItems LW
WHERE LW.Manifest IN (SELECT Manifest FROM ManifestContainers)
GROUP BY LW.Manifest,LW.OrderID
ORDER BY COUNT( LineItemID) DESC
統計IO
実行計画
クエリ実行時間:
DECLARE @EndTime datetime
DECLARE @StartTime datetime
SELECT @StartTime=GETDATE()
` -- Write Your Query`
SELECT @EndTime=GETDATE()
--This will return execution time of your query
SELECT DATEDIFF(MILLISECOND,@StartTime,@EndTime) AS [Duration in millisecs]
クエリ出力は次のようになります。
クエリコストを最適化するには:
SQL Management Studioをクリックします
クエリを実行し、クエリ結果の[メッセージ]タブの横にある[実行プラン]をクリックします。あなたは次のように表示されます