Sybaseでクエリチューニングの情報収集
Sybaseでクエリチューニングの情報収集
0.更新履歴
1.はじめに
このドキュメントでは,Sybase ASE11.9.2を使って,パフォーマンスについて調査する方法を示す.
ここで説明する方法は,すべてisqlを使って接続した状態で行っている.
2.実行計画を調べる(set showplan)
- set showplan onを実行すると,実行計画の表示モードになる.
1> set showplan on
2> go
1> use master
2> go
Message empty.
文 1 (1 行目) のクエリ・プラン。
Message empty.
Message empty.
STEP 1
クエリのタイプは USE DATABASE です。
Message empty.
1>
|
1> select * from test_table
2> go
Message empty.
文 1 (1 行目) のクエリ・プラン。
Message empty.
Message empty.
STEP 1
クエリのタイプは SELECT です。
グループ化されていない COUNT AGGREGATE を評価します。
Message empty.
FROM TABLE
test_table
ネストした繰り返し
インデックス: idx_test_table
前方スキャン
インデックスの最初に位置付けます。
インデックスは必要なカラムをすべて含んでいます。ベース・テーブルは読み込まれません。
インデックス・リーフ・ページに対して I/O サイズ 4 キロバイトを使用しています。
インデックス・リーフ・ページに対する MRU でのバッファ置換方式
Message empty.
STEP 2
クエリのタイプは SELECT です。
Message empty.
-----------
178315
(1 row affected)
1> set showplan off
2> go
Message empty.
文 1 (1 行目) のクエリ・プラン。
Message empty.
Message empty.
STEP 1
クエリのタイプは SET OPTION OFF です。
Message empty.
1>
|
- この場合,次のようなことがわかる.
- 条件(where)は何も設定していないが,インデックスをい使った検索となっている.
- インデックスはidx_test_tableが選ばれている.
- データは,インデックスの最初から読み込まれる.
- 結果は178315件となる.
- 次は,条件を設定して実行計画を表示してみる.
1> select item_cd,depart_dt from test_table where item_cd = 'AAAA'
2> go
Message empty.
文 1 (1 行目) のクエリ・プラン。
Message empty.
Message empty.
STEP 1
クエリのタイプは SELECT です。
Message empty.
FROM TABLE
test_table
ネストした繰り返し
インデックス: idx_test_table
前方スキャン
キーによって位置付けます。
インデックスは必要なカラムをすべて含んでいます。ベース・テーブルは読み込まれません。
キー:
item_cd ASC
インデックス・リーフ・ページに対して I/O サイズ 2 キロバイトを使用しています。
インデックス・リーフ・ページに対する LRU でのバッファ置換方式
Message empty.
item_cd depart_dt
---------------- --------------------------
(0 rows affected)
1>
|
- この場合,次のようなことがわかる.
- インデックスidx_test_tableを使用した検索.
- キーによって対象データを特定している.
- ベーステーブルは読み込まれません. つまり,テーブルフルスキャンしないということか?
- キーはitem_cdを使っており,Asending(昇順)で読み込まれる.
- 対象データは0件である.
3.現在誰かが行っている処理の実行計画を見る
- 現在の接続ユーザのセッションの実行計画を調べる.
- 実行計画を調べるために,次のようなsp_showplanを実行する.
sp_showplanのサンプル
declare @batch int
declare @context int
declare @statement int
exec sp_showplan SPID, @batch output, @context output, @statement output
|
- 実施するためには,spidをパラメータとして与える必要がある.
- sp_whoを使って,現在接続中のユーザ一覧を表示し,spidを取得する.
1> sp_who
2> go
fid spid status loginame
origname hostname blk
dbname cmd
------ ------ ------------ ------------------------------
------------------------------ ---------- -----
------------------------------ ----------------
0 2 sleeping NULL
NULL 0
master NETWORK HANDLER
0 3 sleeping NULL
NULL 0
master DEADLOCK TUNE
0 4 sleeping NULL
NULL 0
master MIRROR HANDLER
0 5 sleeping NULL
NULL 0
master SHUTDOWN HANDLER
0 6 sleeping NULL
NULL 0
master CHECKPOINT SLEEP
0 7 sleeping NULL
NULL 0
master HOUSEKEEPER
0 30 running sa
sa WEB1 0
master SELECT
0 31 send sleep sa
sa WEB2 0
TEST SELECT
0 35 recv sleep test
(25 rows affected)
(return status = 0)
1>
|
- ここでは,spidの31番が行っているSELECT文の実行計画を表示する.
1> declare @batch int
2> declare @context int
3> declare @statement int
4> exec sp_showplan 31, @batch output, @context output, @statement output
5> go
Message empty.
文 1 (1 行目) のクエリ・プラン。
Message empty.
Message empty.
STEP 1
クエリのタイプは SELECT です。
Message empty.
FROM TABLE
test_table
ネストした繰り返し
テーブル・スキャンです。
前方スキャン
テーブルの最初に位置付けます。
データ・ページに対して I/O サイズ 4 キロバイトを使用しています。
データ・ページに対する MRU でのバッファ置換方式
Message empty.
(return status = 0)
Return parameters:
----------- ----------- -----------
5318060 0 1
(1 row affected)
1>
|
- この結果により,次のようなことがわかる.
- 全表走査(フルスキャン)が行われている.
- 順番はテーブルに格納されている順となっている.
4.物理I/Oと論理I/Oの統計値レポート(set statistics io)
- set statistics ioを設定すると,物理・論理I/Oに関する情報やテーブルのアクセス回数が表示される.
1> set statistics io on
2> go
このコマンドの書き込み合計: 0
1> select count(*) from test_table
2> go
-----------
176105
テーブル:test_table スキャン数 1、論理読み込み:(通常=4131 apf=0 合計=4131)、物理
読み込み:(通常=0 apf=0 合計=0)、使用 apf IOs=0
このコマンドの書き込み合計: 0
(1 row affected)
1> select count(*) from test_table where item_cd = 'AAAA'
2> go
-----------
0
テーブル:test_table スキャン数 1、論理読み込み:(通常=4 apf=0 合計=4)、物理読み込
み:(通常=0 apf=0 合計=0)、使用 apf IOs=0
このコマンドの書き込み合計: 0
(1 row affected)
1> set statistics io off
2> go
1>
|
項目 |
説明 |
通常(Regular) |
クエリが必要とするページがキャッシュで見つかった回数. |
APF |
APFで要求取得されたクエリがキャッシュ内に存在した回数. |
合計(Total) |
通常とAPFの合計 |
apf IOs |
APFによって入力されたバッファ数. クエリ中で1つ以上のページが使用されたもの. |
5.実行時間のチェック(set statistics time on)
- time onを指定すると,コマンド(SQL文等)の解析と,コマンドの実行に必要な時間を表示する.
1> set statistics time on
2> go
実行時間 0
SQL Server cpu time: 0 ms. SQL Server elapsed time: 63634596 m
1> select count(*) from test_table
2> go
解析およびコンパイル時間 0
SQL Server cpu time: 0 ms.
-----------
176105
実行時間 2
SQL Server cpu time: 200 ms. SQL Server elapsed time: 250 ms.
(1 row affected)
1> select count(*) from test_table where item_cd = 'AAAA'
2> go
解析およびコンパイル時間 0
SQL Server cpu time: 0 ms.
-----------
0
実行時間 0
SQL Server cpu time: 0 ms. SQL Server elapsed time: 0 ms.
(1 row affected)
1>
|