UJP - 技術情報

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

     

Sybaseでクエリチューニングの情報収集

Sybaseでクエリチューニングの情報収集


0.更新履歴

  • 2001.11.06 新規作成

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つ以上のページが使用されたもの.

  • APFってなんだろう?わかんない.

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>



広告スペース
Google