2697レコードのSQL Server 2012テーブルがあり、テーブルにインデックスが付けられていません。データは将来的に最大10万レコードまで増加します。レコードを取得するために、このテーブルに他のテーブルを結合していません。最初に、テーブルからレコードを取得するためのユーザー定義関数を作成しました。
後で、ユーザー定義関数よりもビューの方が高速であることを知ったので、そのテーブルのビューを作成しました。
クエリのパフォーマンスを知るために、以下のコードを含めて、UDF、VIEW、およびダイレクトSQLステートメントのCPU時間と経過時間を取得しました。
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
選択クエリを使用してテーブルから直接データをプルすると、以下のCPU時間と経過時間を取得しました
SELECT [CollegeName]
,[CandidateID]
,[age]
,[race]
,[sex]
,[ethnic]
,[arm]
,[Weeknum]
,[siteid]
,[country]
,[Region]
,[SubRegion]
,[SNAME]
,[UID]
FROM [testdata]
----結果
Scan count 1, logical reads 1338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 31 ms, elapsed time = 4381 ms.
VIEWを使用すると、CPU時間と経過時間を次のように取得しました
CREATE VIEW vw_testdata
AS
SELECT [CollegeName]
,[CandidateID]
,[age]
,[race]
,[sex]
,[ethnic]
,[arm]
,[Weeknum]
,[siteid]
,[country]
,[Region]
,[SubRegion]
,[SNAME]
,[UID]
FROM [testdata]
-結果
Scan count 1, logical reads 1324, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 15 ms, elapsed time = 5853 ms.
そして、私のUDFは
CREATE FUNCTION [dbo].[fn_DocApproval] (@collegename nvarchar(30) = NULL)
RETURNS TABLE
AS
RETURN
(
SELECT [CollegeName]
,[CandidateID]
,[age]
,[race]
,[sex]
,[ethnic]
,[arm]
,[Weeknum]
,[siteid]
,[country]
,[Region]
,[SubRegion]
,[SNAME]
,[UID]
FROM [testdata] WHERE CollegeName = ISNULL(@collegename, collagename)
)
-結果
Scan count 1, logical reads 1338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 203 ms, elapsed time = 785 ms.
UDFは、直接SQLおよびビューよりも経過時間が非常に短いですが、CPU時間は長くなります。
ただし、直接SQLおよびUDFと比較した場合、CPU時間はビューで少なくなります。
クエリのパフォーマンスを判断するために注意する必要があるものを知りたいです。
また、毎回同じクエリを実行すると、CPU時間と経過時間の両方が変化するのはなぜですか?
私のスキーマとサンプルデータ フィドル
現在2697行ありますが、フィドルでそれらをすべてロードすることができません。
記事のとおり SQLクエリパフォーマンスチューニング
SQL Serverの解析とコンパイル時間:SQLサーバーにクエリを送信して実行する場合、構文エラーを解析してコンパイルする必要があり、オプティマイザは実行に最適な計画を作成する必要があります。 SQL Serverの解析とコンパイル時間は、この実行前の手順を完了するのにかかる時間を指します。2回目の実行の出力を調べると、SQL Serverの解析とコンパイル時間のセクションでCPU時間と経過時間が0になっています。これは、SQLサーバーがクエリの解析とコンパイルに時間を費やさなかったことを示しています。これは、実行プランがキャッシュですぐに利用できるためです。 CPU時間はCPUに費やされた実際の時間を指し、経過時間は解析とコンパイルの完了に要した合計時間を指します。 CPU時間と経過時間の差は、CPUサイクルを取得するためにキュー内で待機するか、IO完了を待機していた可能性があります。これは、値としてのパフォーマンスチューニングではそれほど重要ではありません。このセクションで一貫した値を取得している場合は、再コンパイルオプションを指定してプロシージャを実行している可能性があります。
SQL Server実行時間:これは、SQLサーバーがコンパイルされたプランの実行を完了するのにかかる時間を指します。 CPU時間とは、CPUで費やした実際の時間を指します。経過時間は、信号の待機時間、完了までの待機時間、IO操作と転送にかかる時間を含みます。クライアントへの出力。CPU時間は、パフォーマンスチューニングのベースラインとして使用できます。この値は、クエリまたはデータを変更しない限り、実行ごとに大きく変わることはありません。サーバーの負荷がこの値に大きく影響することはありません。表示される時間はミリ秒単位であることに注意してください。CPU時間の値は、同じクエリで同じデータを使用して実行ごとに異なる場合がありますが、100秒単位であり、1秒の一部にすぎません。経過時間は、多くの要因に依存します。サーバーの負荷のように、IO load、サーバーとクライアント間のネットワーク帯域幅。したがって、パフォーマンスの調整を行うときは、常にベースラインとしてCPU時間を使用してください。
計画内の論理読み取りの数が少ないほど、クエリの効率は高くなります。
最新のサーバーを使用している場合は、常に「CPU時間」ではなく「経過時間」を確認してください。高速マルチコアプロセッサ、マルチプロセッサボードなどの時代では、プロセッサではなく、高速応答を調整する他のすべての要因が重要です。複雑なクエリでは、CPU時間の表示が合計時間の5倍になることがあります(「実行計画」を確認してください-並列処理が多くなります)。