アクセスカウンタ

テーマ「SQL Server」の記事 help リーダーに追加 RSS

トップへ  |  テーマトップへ  |  テーマランキング一覧へ


SQL Server のなかみ

2008/07/10 18:53

Ichikawaさんに勧められて インサイド SQL Server 2005 クエリチューニング&最適化編 を読み始めました。
今の会社に入るまではずっと Oracle ばかり触っていて SQL Server には疎かったんでちょうどいいタイミングでした。
パフォーマンスチューニングを行うためにはどうしたらいいのかがかなり詳しく書かれています。

まだ3章の途中なんだけれど、特にこのあたりは知りたいことがしっかり載っていてうれしい。

・どうやったらインデックスを使ったSQLを組むためにはどうするか、
・パフォーマンスカウンタの読み方
・実行プランの読み方

SQL Server の実行計画ってグラフィカルなのは良いんだけれど、大きなSQLを書いたときに全体がわからなかったんですよね。
Oracle のようにテキストで出せたらいいな〜と思っていたら、こんな感じでテキスト出力できるとのこと。


こんなSQLを実行すると、
SET SHOWPLAN_TEXT ON
GO
SET SHOWPLAN_ALL ON
GO
select m.name, s.definition
 from sys.sql_modules s
     join sys.procedures m
       on s.object_id = m.object_id

StmtText
-----------------------
SET SHOWPLAN_TEXT ON

(1 row(s) affected)

StmtText
----------------------
SET SHOWPLAN_ALL ON

(1 row(s) affected)

StmtText
---------------------------------------------------------------------------------------------------------------------------

select m.name, s.definition
 from sys.sql_modules s
     join sys.procedures m
       on s.object_id = m.object_id

(1 row(s) affected)

StmtText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 |--Compute Scalar(DEFINE:([Expr1004]=object_definition([aspnetdb].[sys].[sysschobjs].[id] as [o].[id])))
      |--Nested Loops(Inner Join, OUTER REFERENCES:([o].[id]))
           |--Filter(WHERE:(has_access('CO',[aspnetdb].[sys].[sysschobjs].[id] as [o].[id])=(1)))
           |    |--Clustered Index Scan(OBJECT:([aspnetdb].[sys].[sysschobjs].[clst] AS [o]), WHERE:([aspnetdb].[sys].[sysschobjs].[nsclass] as [o].[nsclass]=(0) AND [aspnetdb].[sys].[sysschobjs].[pclass] as [o].[pclass]=(1) AND ([aspnetdb].[sys].[sysscho
           |--Filter(WHERE:([aspnetdb].[sys].[sysschobjs].[type] as [o].[type]='TR' AND has_access('TR',[aspnetdb].[sys].[sysschobjs].[id] as [o].[id],[aspnetdb].[sys].[sysschobjs].[pid] as [o].[pid],CONVERT_IMPLICIT(int,[aspnetdb].[sys].[sysschobjs].[nsc
                |--Clustered Index Seek(OBJECT:([aspnetdb].[sys].[sysschobjs].[clst] AS [o]), SEEK:([o].[id]=[aspnetdb].[sys].[sysschobjs].[id] as [o].[id]),  WHERE:([aspnetdb].[sys].[sysschobjs].[pclass] as [o].[pclass]<>(100)) ORDERED FORWARD)

(6 row(s) affected)


インサイドMicrosoft SQL Server 2005 クエリチューニング&最適化編 (マイクロソフト公式解説書)
日経BPソフトプレス
Kalen Delaney、Sunil Agarwal、Craig Freedman、Adam Machanic、Ron Talmage

amazon.co.jpで買う
Amazonアソシエイト by ウェブリブログ


記事へトラックバック / コメント


Sync Framework は SQLServer 2008 に含まれているようです。

2008/06/13 00:03

ここ数日なんとなくBetaな環境を作っているわけですが、今まで完全スルーだった SQL Server 2008 RC0 をインストールしてみた。途中インストール製品を選択する場所で気になったのが四角の部分

SQLServer 2008 RC0

少し前に話題になった Sync Framework がインストール一覧に存在します。

ってことは SQL Server と同時にリリースかー こっちはちょっと触ってみようかなー。

前にちょっと触った時の記事

記事へトラックバック / コメント


SQLServer の警告が取れない

2008/05/13 18:08

うーん、警告が取れない。
SQLServer 2005 で次のように集計対象の列にNULLが含まれる場合に警告が出る。

select count(a), count(b), count(c)
from (
  select           null a, null b, 3 c
  union all select null a, 2    b, 3 c
  union all select 1    a, 2    b, 3 c
) [t]

→ 結果として 1, 2, 3 がほしい。
結果は正しく取れるんだけれど次の警告が発生する。
「警告: NULL 値は集計またはその他の SET 演算で削除されました。」

どうやら NULL を含む列に対して集計関数をかけた場合に出るメッセージらしいんだけれど、count で NULL でない行を取得したいので今回は困る。
count をとる対象が 1 列だけならこれも検索条件ではじけばどうにかなるんだけれど、今回は複数だし。。。
まさか、case で case when a is null then 0 else 1 end とかして sum するのもどうかと思うし。。。
今回は時間切れ、とりあえず警告無視の方向で(汗

記事へトラックバック / コメント


ある文字列が含まれるプロシージャの一覧を取得

2008/03/21 03:00
SQLServer である文字列が含まれるプロシージャ一覧を取得したかった。
SQLServer 使い始めて日が浅いので、どんなディクショナリビューがあるのかから調べ始める。
各データベースの sys. から始まるやつなのね、sys.procedures にプロシージャの一覧を発見プロシージャの本体は...sys.sql_modules に定義を発見。object_id で紐づいていそうだからこんな風にするとこのユーザが持っている プロシージャがとれそうだ。

select m.name, s.definition
  from sys.sql_modules s
      join sys.procedures m
        on s.object_id = m.object_id


頭に all をつけるとこのユーザが参照可能なモジュールに対して検索できそうだ。
ディクショナリビューって面白いよね。Oracleだったらある程度わかるんだけれど、SQLServerはこれからだな。

MSDNのこのページが参考になった
SQL Server システム カタログに対するクエリに関してよく寄せられる質問
http://msdn2.microsoft.com/ja-jp/library/ms345522.aspx
記事へトラックバック / コメント


SQL サーバの全文検索について調べ中

2008/03/13 12:54
SQL Server 2005 で Full Text Search をちょっと調べてるのでメモ
全然まとまっていないし、間違っているかも。

全文検索
 → 文を分かち書きして、文節単位にしたものを検索する。
      → 例.今日は良い天気ですね。
         "今日", "良い", "天気"
         "は" や "。" はノイズとして検索結果には表れない。

 → 同じ単語が大量に偏ると遅くなる??
      → テスト中

 → ノイズを除去するために検索結果に対してランクを付ける。
      → ランク付けのアルゴリズムは非公開。
      → どんなものがランクが低くなる?

 → 高速化のために上位ランクのものを中心に検索させる。
      → 検索されない文脈も出てくる。

 → インデックスの作成
      → 更新直後検索に引っかかる。
           → 設定でデータの追跡を ON だと即時反映
      → インデックス作成のサイクルを指定できる。

LIKE 検索
 → 前後方一致で検索する場合はテーブルのフルスキャンを行う必要がある。
 → ノイズ語も検索してしまう。

CONTAINS 検索
 → WHERE 区で指定
 → ノイズは検索しない
 → RANK による絞り込みはできない。

CONTAINSTABLE 検索
 → 分節単語インデックステーブルから ID と RANK を検索
      → JOIN して使用
 → ノイズは検索しない
 → RANK による絞り込みができる。

TODO:

SQL Server がどの文脈にしたいしてどのようにランク付けしてるのかが気になる。
どこかにそんな資料がないか調査中。

ノイズに関してもう少し調べる。

そもそも 全文検索 ってそういうもんじゃね?的なものをもう少し調べる

分かち書きの結果文字が偏った場合のパフォーマンスはどうなる?


参考
フルテキスト検索
フルテキスト関数とフルテキスト述語の比較
パフォーマンスのチューニングと最適化 (フルテキスト検索)
SQL Server 2005 のフルテキスト検索機能 : 内部構造と強化機能について
SQL Server 2005 – フルテキスト検索
記事へトラックバック / コメント


トップへ  |  テーマトップへ  |  テーマランキング一覧へ