連休最終日の5月6日、朝8時から10時にかけて、旧ブログに30件超のアクセスがあった。参照先投稿は2005年のもので、MCSE (Microsoft Certified System Engineer)受験対策にまとめた投稿だ。MCSE認定までの一環として、MCDBA (Microsoft Certified DataBase Administrator)を経由した。特にMCDBA対策としてのメモを記録していた。
MCSEはWindows server 2000、2003を対象としたもので、SQL serverも、当時メイン・ストリームとして流通していたヴァージョンだった。とはいえ、基本的な部分において、現在のヴァージョンと変わらない部分もあるのだろう。まだ需要があるのであれば、ということで、こちらへ移行することにした。
もともとは3つのメモとして投稿していたのだが、移行に際し1つに統合することにした。
- ネットワーク・ライブラリ
- DBオブジェクト
- アカウント管理
- パフォーマンス・チューニング
- パフォーマンス・ガイドライン
- DB移行
- リストア
- IIS仮想ディレクトリ経由の接続
- 障害復旧
- データ型
- 主キー、一意制約、外部キー制約
- 連鎖参照性合成
- インデックス
- DBOの作成、変更
- レプリケーション競合の解決
- パーティション計画
- トリガ
- トランザクション
- ヴュー
- ロック
- カーソル
- XML
- Transact SQL
- 統計
DBオブジェクト
トランザクション・ログ | ファイルのサイズは、通常データ・ファイルの10-15%で作成する。 |
クラスタ化インデックス | テーブルにある行の物理的な順序。→物理的な順序を連続した順序で並び替える。 1テーブルに1つだけ作成可能。例えるならば辞書。 |
非クラスタ化インデックス | テーブルにある行の論理的な順序。→物理的な順序は並び替えない。 1テーブルに249まで作成可能。例えるならば索引。 クラスタ化インデックスが存在する場合、インデックス行にはクラスタ化キーを格納。 クラスタ化インデックスが存在しない場合、インデックス行には、データ行へのポインタを格納。 |
グローバル一時テーブル | ユーザーがSQL Serverとの接続を解除した時点で削除される。 |
アカウント管理
ログイン作成 - Windows認証の場合
作成 | SP_GRANTLOGIN |
削除 | SP_REVOKELOGIN |
拒否 | SP_DENYLOGIN |
ログイン作成 - SQL Server認証の場合
作成 | SP_ADDLOGIN |
削除 | SP_DROPLOGIN |
アカウント作成
作成 | SP_GRANTDBACCESS |
削除 | SP_REVOKEDBACCESS |
サーバー・ロール管理
作成 | SP_ADDSVRROLEMEMBER |
削除 | SP_DROPSVRROLEMEMBER |
DBロール管理
作成 | SP_ADDROLEMEMBER |
削除 | SP_DROPROLEMEMBER |
パフォーマンス・チューニング
システム・テーブルとデータを分けて格納する。
ファイル・グループ内のすべてのファイルに対して均等の取れたデータ書き込みが可能。
バックアップや復元にかかる時間を短縮可能。
DBCC CHECKIDENT | 指定されたテーブルの、現在のID値を確認する。 必要に応じてID値を修復する。 |
DBCC INDEXDEFRAG | インデックスの断片化を解消する。 |
DBCC DBRIINDEX | インデックスの再構築。 制約を強制しているインデックスを再構築できる。 |
DBCC SHRINKDATABASE | データベース単位で圧縮。初期サイズよりも小さくすることはできない。 |
DBCC SHRINGFILE | ファイル単位で圧縮。初期サイズ以下に圧縮可能。 |
SP_RECOMPILE | 次回実行時にSP、トリガの再コンパイルを実施。 テーブルやヴューを指定した場合、参照するすべてのSPが対象となる。 インデックス追加、変更→統計が変化→SP、トリガの効率低下→再コンパイルによりクエリを最適化。 |
パフォーマンス・ガイドライン
Memory: Available Bytes | 常に5MB以上を維持する。 |
Memory: Page/sec | 常に0以下を維持する。 |
Process: Working Set | 常に5MB以上を維持する。 |
System Processor Queue Length | 常に2以下を維持する。 |
DB移行
1 | SP_DETACH_DBを実行。 |
2 | DB、トランザクション・ログをコピー。 |
3 | SP_ATTACH_DBを実行。 |
データインポート
Bulk-Logged Recovery Model | 最高のパフォーマンス、最小のログ使用領域。 |
TABLOCKオプション | 一括コピー中にテーブル・レベルのロックを維持する。 |
リストア
1 | NO_TRUNCATEオプションとともに、トランザクション・ログをバックアップ。 |
2 | 最新のフルバックアップを復元。 |
3 | 最新の差分バックアップを復元。 |
4 | 3以降のトランザクション・ログを復元。 |
5 | 最後のトランザクション・ログをSTOPATオプションとともに復元。 |
障害復旧
TORN_PAGE_DETECTIONが有効の場合。 | 不完全なI/O操作を検出する。破損ページは、「復旧」時に検出される。 |
REPAIR_REBUILD | REPARI_FASTの修復対象項目とインデックスを再構築する。 |
データ型
tinyint | 1バイトの整数データ 0~255の整数 2^8 |
smallint | 2バイトの整数データ ±約3万の整数 -32,768~32,767 -2^16~2^16-1 |
int | 4バイトの整数データ ±約20億の整数 -2,147,483,648~2,147,483,647 -2^32~2^32-1 |
bigint | 8バイトの整数データ -2^63 - 2^63 - 1 |
money | ±約922兆の金額 -922,337,203,685,477.5808 - 922,337,203,685,477.5807 |
smallmoney | ±約200兆の金額 -214,748.3648 - 214,748.3647 |
datetime | 1753/01/01から9999/12/31までの日付時刻。 |
smalldatetime | 1900/01/01から2079/06/06までの日付時刻。 |
char | 8000文字以内の固定長文字データ |
nchar | 4000文字以内の固定長UNICODEデータ |
varchar | 8000文字以内の可変長文字データ |
nvarchar | 4000文字以内の可変長UNICODEデータ |
text | 約20億文字以内の可変長データ |
ntext | 約10億文字以内の可変長UNICODEデータ |
主キー、一意制約、外部キー制約
主キー指定列には自動的にインデックスが作成される。 | デフォルトはクラスタ化インデックス。 |
代替候補キー指定列には自動的にインデックスが作成される。 | デフォルトは非クラスタ化インデックス。 |
外部キー指定列には、自動的にインデックスが作成されない。 |
連鎖参照性合成
1 | 外部キー制約のCASCADEオプションを指定。 |
2 | 主キー制約、一意制約指定列への変更、削除が外部キーへ自動的に反映される。 |
3 | NO ACTIONオプションを指定した場合、変更に対してエラーを発生し、ロールバックする。 |
インデックス
カバリング・インデックス | 検索に必要な全情報を格納している場合、DBアクセスの必要がなくなる。→I/Oの減少 こういったインデックスをカバリング・インデックスと呼ぶ。 |
レプリケーション競合の解決
対象:マージ・レプリケーション、キュー更新可能なサブスクライバ・オプション
競合が発生する可能性がある。
回避策
- 競合回避モジュール
- ストアド・プロシージャ
- レプリケーション競合回避モジュール
トリガ
AFTER | すべての実行操作が成功し、連鎖参照操作、制約チェックが成功したときにトリガを起動する。 ビューには指定できない。 |
トリガ動作の指定
sp_settrigger order | 最初と最後時実行するトリガを指定。 |
OBJECTPROPERTY | 現在のトリガ設定を確認。 |
トランザクション
- トリガ = トランザクション
- トリガのネストを無効→sp_configure 'nested triggers', 0
SET IMPLICIT_TRANSACTIONS | 暗黙のトランザクション・モードを設定する。 |
onの場合 | commitを明示しない限り、すべての変更はユーザーの切断時にロールバックされる。 |
offの場合 | 自動コミット・モード |
ヴュー
WITH CHECK OPTION | ヴューの範囲外の修正時を拒否。 集計関数やグルーピングを使用したビューへの設定不可。 |
SCHEMABINDING | 参照対象オブジェクトのスキーマに、関数をバインドする。 その関数によって参照されるオブジェクトは変更、削除できない。 |
ロック
ペシミスティック同時実行 | 他のユーザーに影響を与えるようなデータ変更を防止する。 データソースで行ロックする必要が無い。 ロック適用操作中、競合する操作を実行することができない。 |
オプティミスティック同時実行 | レコード・ロックを実施しない。→パフォーマンスの上昇。 |
sp_lock | ロックに関する情報をレポートする。 |
sp_who | ユーザーとプロセスに関する情報をレポートする。 |
オプティミスティック同時実行制御違反テスト
1.テーブルにタイム・スタンプを含める。
- テーブルにtimestamp列をが含まれる。
- レコードが更新されると、timestampに更新日時が反映される。
- 変更時に対象データのtimestampとDBのタイム・スタンプが比較される。
- 一致した場合→更新
- 不一致の場合→制御違反
2.元のすべての列値と、DB内の値が一致するかを確認する。
ロックのヒント
UPDLOCK | 他のユーザーがデータを読むことをブロックしない。 読み取り以来のデータは変更されない。 |
カーソル
SCROLL_ROCK | カーソルは読み取り字に、対象行をロックする。 カーソルの位置指定更新、位置指定削除の成功を保証する。 |
FECTH | カーソルから特定行を取得する。 |
FETCH ABSOLUTE | カーソルの先頭から指定行目に位置する行を返す。 |
FETCH RELATIVE | 現在のカーソル行から指定行目に位置する行を返す。 |
XML
sp_xml_preparedocument | xmlを解析し、解析済みドキュメントとして使用できる状態にする。 解析済みドキュメントは内部キャッシュに格納される。 SQL Serverが利用できるメモリ全体の1/8を使用する。 解析済みドキュメントへのハンドルを返す。 |
sp_xml_removedocument | 解析済みドキュメントの内部キャッシュを削除する。 解析済みドキュメントへのハンドルを削除する。 |
Transact SQL
インライン・ユーザー定義関数 | table方を帰すユーザー定義関数のサブセット。 パラメータかされたビューの機能性を高めることが可能。 |
COALESCE | 引数の中から、最初のNULLではない式を返す。 |
SET SHOWPLAN_TEXT | 解析時ではなく、実行時に設定。 ステートメントを実行せずに、実行情報だけを返す。 |
xp_sendmail | メッセージにクエリ結果セットを添付して、指定された受信者へ送信する。 |
統計
sp_updatestats | 全ユーザー定義テーブルに対して、update statisticsを実行する。 |
UPDATE STATISTICS | 指定されたテーブルの統計情報を更新する。 |