SQL Serverクエリが7 MB /秒を超えるディスクI / Oを使用しないのはなぜですか


11

IOmeterテストを使用して、200 MB /秒を超えるパフォーマンスを示すSSDを持っています。しかし、ローカルマシンからSQLクエリを実行すると、Windowsリソースモニターに7MB /秒を超えるディスクIOが表示されません。これは、実行に2分以上かかるクエリでも当てはまります。SSDから7MB /秒しか使用していないことがボトルネックになるのは何ですか?

私は走っています:

  • Windows Server 2012スタンダード
  • SQL Server 2008 R2
  • Intel i7 3820
  • 32GBのRAM
  • sandisk SSD

2
おそらく、データはすでにRAMにあり、ディスクアクセスは必要ありません。
gbn 2013年

1
@DeanMacGregor-どのように結果を消費していますか?SSMSの場合、結果を破棄するオプションを試してみてください。何か変化はありますか?またsys.dm_os_waiting_tasks、クエリの実行中に、他の待機タイプがあるかどうかを確認することもできます。
マーティン・スミス

1
ランダムアクセス読み取り(4 KBブロックのランダム読み取り)の200 MB /秒ですか?これはデータベースが通常行うことだと思います。クエリはディスク(一時ファイル、一時結果セットまたはテーブル)に書き込みますか?

2
@DeanMacGregor-方程式からそれを取り除くために、結果をスカラー変数に割り当てることができます(クエリ例)。DECLARE @Name VARCHAR(10), @High int; SELECT @Name=name, @High = high FROM master..spt_values。したがって、結果はクライアントに送り返されませんが、計画とIOは同じままです。
マーティン・スミス

4
ASYNC_NETWORK_IOの待機が問題がネットワークに関連していることを意味すると解釈していると仮定しますか?それは(通常)そうではありません。@MartinSmithが示唆したように(2回)、SSMSまたは使用しているアプリケーションは、SQLがサービスを提供しているのと同じ速さで結果を消費していません。行の消費を省略する提案された方法のいずれかを実行すると、最大IOスループットのtrue(r)の図が得られます。
Mark Storey-Smith

回答:


7

コメントチェーンから、ASYNC_NETWORK_IO待機が問題がネットワークに関連していることを意味すると解釈しているようです。それは(通常)そうではありません。

@MartinSmithが(2回)をほのめかしたように、その最も可能性の高い説明はSSMSまたは使用しているアプリケーションであり、SQL Serverがサービスを提供しているのと同じ速さで結果を消費していません。提案された方法のいずれかに従って、測定から行の消費を削除すると、最大IOスループットのtrue(r)の図が得られます。

まだ行っていない場合に備えてDBCC DROPCLEANBUFFERS、データがバッファーキャッシュではなくディスクから実際に読み取られるようにする必要があることは明らかです。「テスト時のみ、アクティブなライブ環境ではこれを行わない」などの通常の注意事項が適用されます。

他のいくつかのコメントに磨きをかける:

900万行を返すクエリを実行している間、CPU使用率は約13%にとどまり、9%はsqlserverに起因します...すべてのデータがRAMにある場合、3分よりも速く結果が返されませんか?

ここで正確に何をテストしていますか、その方法と理由は?900万行のクエリがa以外の場合、SELECT * FROM dbo.SomeTable生のIOスループットだけでなく、1001の要素が関係します。

お使いのインテルI7-3820は 4コアプロセッサです。テストクエリで並列プランが生成されない場合、システムのCPU使用率が20%を超えてスラッシュする可能性があるとは驚きます。

900万行を返すための3分は非常に疑わしいものであり、テストの全体像を把握していないことを示しています。私の推測では、これは最適ではない(並列ではない)クエリプランのケースであり、ネストされたループ演算子でいっぱいになり、何百万行もプルされますSELECT

私は提案します:

  1. SELECT *SQL Serverを介してIO のみをテストします。
  2. クエリがIOを飽和させない理由を掘り下げたい場合は、クエリの実行プランに関する新しい質問。

実際には、dbo.sometableから*を選択するだけです。申し訳ありませんが、それについてもっと早くは触れませんでした。つまり、どのテーブルからでもクエリを実行できるということです。私の質問の起源は、ディスクIOが単純な "大量のデータを取得する"クエリからでも予想よりもはるかに少ないことに気付いたということでした。私の主な懸念は、ディスクIOが非常に低い場合、ディスクIOの低下の根本的な原因が根絶されれば、パフォーマンスが向上することでした。
ディーンマクレガー2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.