web-dev-qa-db-ja.com

クエリパフォーマンスの測定:「実行計画のクエリコスト」と「所要時間」

私は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 /などの集合であるため、いくつか質問があると思います。

  1. この尺度の意味を説明する決定的な情報源はありますか?

  2. 他にどのような「クエリパフォーマンス」の指標が使用されていますか?また、それらの相対的なメリットは何ですか?


これは中規模の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を使用するのにかかる時間が短くなることは印象的です:)

48
MatBailie

プロファイラートレースは、それをパースペクティブにします。

  • クエリA:1.3秒のCPU、1.4秒の期間
  • クエリB:2.3秒のCPU、1.2秒の期間

クエリ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では、おそらく違いが生じます...

34
gbn
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.
12
Aditya Acharya

実行時間の結果はクエリコストの結果と直接矛盾しますが、「クエリコスト」が実際に何を意味するかを判断するのは困難です。

Query costは、オプティマイザーがクエリの所要時間を考えるものです(合計バッチ時間に対して)。

オプティマイザは、クエリとデータの統計を確認し、いくつかの実行プランを試し、それらの中で最もコストの低いものを選択することにより、最適なクエリプランを選択しようとします。

Here これをどのようにしようとするのかについて詳しく読むことができます。

ご覧のとおり、これは実際に得られるものと大きく異なる場合があります。

実際のクエリパフォーマンスメトリックは、もちろん、クエリに実際にかかる時間です。

5
Quassnoi

つかいます SET STATISTICS TIME ON

クエリの上。

結果タブの近くに、メッセージタブが表示されます。そこで時間を見ることができます。

4
NMK

古い質問だと理解していますが、コストは同じであるが、あるクエリが他のクエリよりも優れている例を追加したいと思います。

質問で見たように、実行計画に表示される%は、最適なクエリを決定する唯一の尺度ではありません。次の例では、同じタスクを実行する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

enter image description here

実行計画

enter image description here

2
Lijo

クエリ実行時間:

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] 

クエリ出力は次のようになります。

enter image description here

クエリコストを最適化するには:

SQL Management Studioをクリックします

enter image description here

クエリを実行し、クエリ結果の[メッセージ]タブの横にある[実行プラン]をクリックします。あなたは次のように表示されます

enter image description here

1
atik sarker