I/Oパフォーマンスを改善する
Improving Your I/O Performance – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。
SQL ServerのI/Oパフォーマンスを改善する場合、通常はストレージを調整し、RAIDを構成し、tempdbのファイル数を増やしたりします。しかし、SQL Azureのようにファイルストレージを変更できない場合、I/Oパフォーマンスをどのように改善したら良いのでしょうか、クエリを改善しI/Oを減らすことに集中することになります。I/O数の高いクエリを探し、I/Oパフォーマンスを改善する方法を説明します。
I/Oの使用が高いクエリを探す
次のTransact-SQLは、遅いクエリを25個取得します。
SELECT TOP 25 q.[text], (total_logical_reads/execution_count) AS avg_logical_reads, (total_logical_writes/execution_count) AS avg_logical_writes, (total_physical_reads/execution_count) AS avg_phys_reads, Execution_count FROM sys.dm_exec_query_stats cross apply sys.dm_exec_sql_text(plan_handle) AS q ORDER BY (total_logical_reads + total_logical_writes) DESC
クエリの実行結果は次のようになります。
最も大量にデータを読み込むクエリ
データを読み込むクエリでI/Oga大量に発生するもので、あなたが使用すべきでない代表例が下のクエリです。
SELECT * FROM [Table]
このクエリは、[Table]から全ての列と全ての行を読み込みます。これは、次のようにして改善することができます。
- where句を使用して、クエリの使用目的に応じた必要な行のみを読み込むようにします。
- テーブルから必要な列のみを取得するように、明確に列名を指定するようにします。
カバードインデックスを作成する
カバードインデックスを使用することでI/Oを減らせます。
カバードインデックスとは、where句とselect使用としているカラムを、非クラスタインデックスに含んでいるインデックスです。
複数テーブルを結合している場合に威力を発揮します。
まとめ
I/Oを改善するには、クエリのパフォーマンスを向上させることに集中させます。SQL Serverのクエリの最適化に関するMSDNに掲載されているテックニックを参考にできます。
ストレージ部分はマイクロソフトが最適化をしていますので、ユーザはクエリの改善に集中することになります。