Sql server浅く広く

61
SQLServer Shallow and Wide - 浅く広く - 第1回 関西DB勉強会 サヴロウ

Transcript of Sql server浅く広く

Page 1: Sql server浅く広く

SQLServerShallow and Wide

- 浅く広く -

第1回 関西DB勉強会

サヴロウ

Page 2: Sql server浅く広く

自己紹介

・医療系のパッケージシステムを

作っています。

DBはSQLServerです。

主にSQLWorldに出没しています。

・オクマー(旧:フライパンズ)のベース&アレンジ

・ライブ予定

9/16(水) 梅田クラブクアトロ

9/27(日) 高槻アクトアモーレ(無料)

10/25(日) 武庫之荘ライブスポットアロー

http://www.okumar.com

◆サヴロウ

Page 3: Sql server浅く広く

SQLServerとは

Microsoft製のちゃんとした有償データベースです。

-> Accessの上位版ではありません。

[よくあるイメージ]

-> メンテナンス不要のオートマチックデータベース

-> タダで使えるのがあるらしい

-> 行ロックできない

-> Oracleと比べて・・・

※検索すると上記のようなものがヒットする場合が多い・・・

Page 4: Sql server浅く広く

エディション/ライセンスとバージョン①

[バージョン]

-> だいたい2年に一回バージョンアップします。

-> 現行はSQLServer2014でSQLServer2016が来年出ることはアナウンス済み。

-> 大雑把ですが、Enterpriseの機能を使わないのであればSQLServer2008でも十分かと

[プラットフォーム]

-> Windowsのみ

[注意]ライセンスに関してはこの資料は参考程度にして、

正しくはMicrosoftに問い合わせてください。

Page 5: Sql server浅く広く

エディション/ライセンスとバージョン②

[エディション]

-> Express

-> Standard

-> Business

Intelligence

-> Enterprise

-> Web

-> Developer

Edition

-> Evaluation

タダ!後で説明

可用性、ReportServices、管理ツール他

一通り全部

Standard+BIツール(PowerBIツール)

インメモリ分析

高可用性、インメモリテーブル、BIツール、

透過的データ暗号化、カラムストアインデックス他全部

Webホスティング企業、Web VAP向け

開発者用(タダ)

試用版(タダ)

Page 6: Sql server浅く広く

エディション/ライセンスとバージョン③

[SQLServerのエディションと詳細]

-> 公式

http://www.microsoft.com/ja-jp/server-cloud/products/sql-server-editions/overview.aspx

-> MSDN

https://msdn.microsoft.com/ja-jp/library/Cc645993(v=SQL.120).aspx

[SQLDatabase]

-> SaaS型のクラウドサービス

-> 可用性が元々構成されてる

-> DBサイズ、速度、サポートにより価格が違う

-> ≒SQLServer(になりつつある)

Page 7: Sql server浅く広く

エディション/ライセンスとバージョン④

[ライセンス]

-> サーバライセンス

(サーバライセンス+クライアントライセンス)

-> コアライセンス

(コアライセンスのみでクライアントライセンス購入不要)

[ライセンス詳細]

http://www.microsoft.com/ja-jp/server-cloud/local/sqlserver/2012/howtobuy/default.aspx

Page 8: Sql server浅く広く

SQL Server Express Edition①

[機能制限/特徴]

-> 1ソケット(4コアまで)

-> インスタンスごとの制限

・メモリ 1GB

・データベースのサイズ 10GB(100万ページは入る)

※サイズはデータベースごとなので、マスター、

トランザクションデータ、操作ログ、画像系などと

DBを分ければかなり使える

※DBをまたいでの結合SQLは簡単にできます

※さらにFileStreamを使えば容量制限にかかりません

-> x86,x64版あります

Page 9: Sql server浅く広く

SQL Server Express Edition②

[インストーラの種類]

-> Express

GUI管理ツールなどを含まず、データベース・エンジンと最低限の

ツールのみで構成されたエディション

-> Express with Tools

Express単体にGUI管理ツール(SQL Server Management

Studio Express)を加えたエディション

-> Express with Advanced Services

Express with Management Toolsにレポート機能や

テキスト検索機能などを加えたエディション

==> タダなのでこれを入れるべし

-> その他

Page 10: Sql server浅く広く

SQL Server Express Edition③

[ライセンス]

-> 商用利用可能

-> CALは必要か

=> CALは不要だが、そもそもWindowsCALが必要。

http://salaryman-life.blogspot.jp/2013/03/sql-server-expresssql-server-cal.html

[ネットワーク接続]

-> デフォルトではリモート接続を許可していない。ポートも動的

https://msdn.microsoft.com/ja-jp/library/ms345343(v=SQL.120).aspx

Page 11: Sql server浅く広く

その他のライセンス

[SQLServerでパッケージソフト開発]

-> ISV契約(勘定系のソフトに多いです)

-> SQLServerを製品に組み込むことで安価にライセンスを販売することができる

-> ServerCAL,ClientCALが必要

Page 12: Sql server浅く広く

インストーラ

[インストーラ]

-> インストールで落ちることがほとんどないので快適です

Page 13: Sql server浅く広く

インストール設定①新規インストールorインスタンス追加

Page 14: Sql server浅く広く

インスタンス

[インスタンスとは]

-> SQLServerの実行単位。同一マシン内に複数のインスタンスをインストール可能

-> SQL Server構成マネージャー

から確認できる

[別インスタンス同士の異なるデータベースの結合]

-> リンクサーバーを使用して結合する

https://msdn.microsoft.com/ja-jp/library/ms188279.aspx

Page 15: Sql server浅く広く

インストール設定②ライセンス条項

Page 16: Sql server浅く広く

インストール設定③機能の選択 -> 全部指定

Page 17: Sql server浅く広く

インストール設定④インスタンス名指定

Page 18: Sql server浅く広く

インストール設定⑤サービスアカウントと照合順序

Page 19: Sql server浅く広く

インストール設定⑥サービスアカウントと照合順序

Page 20: Sql server浅く広く

照合順序①

[照合順序とは?]

-> 特定の言語とロケールの基準に基づいて、文字データの文字列の並べ替え方法および比較方法に関する規則を指定します。

[ざっくり]

-> バイナリ比較の場合は、Japanese_XJIS_BIN2で

=> BINはSQLServer2000時代のもの。

=> 並べ替えは文字コード順

-> 日本語照合順序はJapanese_XJIS_100_XX_CSで

=> XXはCI_ASが一般的(T=t,が≠か,あ=ア,ア=ア)

=> _CSはサロゲートペア文字のLENが正しくなる

=> _CSは2012から追加された

Page 21: Sql server浅く広く

照合順序②

[照合順序]https://msdn.microsoft.com/ja-jp/library/ms143726(v=SQL.120).aspx

http://blogs.msdn.com/b/jpsql/archive/2013/10/17/10455655.aspx

[JIS2004]

https://support.microsoft.com/ja-jp/kb/931785

[_CS]

http://blog.engineer-memo.com/2012/05/25/

Page 22: Sql server浅く広く

照合順序の設定画面

Page 23: Sql server浅く広く

インストール設定⑦データベースエンジンの構成

Page 24: Sql server浅く広く

Windows認証と混合認証

[Windows認証モード]

-> Windowsのユーザーでのログイン。デフォルトこちら。

[混合モード(SQL Server認証とWindows認証)]

-> sa(Adminユーザー)のパスワードを設定する。

-> パスワードはWindowsのパスワードポリシーに依存。

-> Windows認証側のユーザーを残しっぱなしにしてしまう

ことが多いので注意

-> 本番環境に自動インストールするときにパスワードポリシーで跳ねられることがよくある。

Page 25: Sql server浅く広く

インストール設定⑧データベースエンジンの構成

Page 26: Sql server浅く広く

Filestream

[Filestreamとは]

-> varbinary(MAX)のデータをデータベース内ではなく、ファイルシステム上のファイルとして保存する機能。

-> Expressの容量としてカウントされません。

[FileTable]

-> FileTableで管理されているフォルダをエクスプローラーで開いて、ドラッグ&ドロップするとSQL Serverのテーブルに保存される機能。

該当のテーブルをSELECTすると、ファイル情報、バイナリも取得できる

Page 27: Sql server浅く広く

インストール設定⑨Reporting Servicesの構成

Page 28: Sql server浅く広く

インストール設定⑩インストール開始

Page 29: Sql server浅く広く

インストール設定⑪インストール終了

Page 30: Sql server浅く広く

インストーラ補足

[Expressの動きが若干違うみたい]

-> 製品版のインストール時にはインストール直前に

「この構成でインストールします」という画面がでてきて

その下に[ConfigurationFile.ini]のパスが記載される

このファイルにインストール時の設定がすべて記載されている。=>

C:¥Program Files¥Microsoft SQL Server¥120¥Setup Bootstrap¥Log¥YYYYMMDD_hhmmss¥ConfigurationFile.ini

-> ConfigurationFile.iniを使用するとSQLServerのサイレントインストールが可能

Page 31: Sql server浅く広く

サイレントインストール

-> 下記コマンドでsetup.exe /ConfigurationFile=ConfigurationFile.ini /qs

-> Expressの場合はSQLEXPRADV_x86_JPN.exe

/ConfigurationFile=C:¥ConfigurationFile.ini /qs

https://msdn.microsoft.com/ja-jp/library/Dd239405(v=SQL.120).aspx

Page 32: Sql server浅く広く

異なるバージョンの混在と互換性バージョン①

[異なるバージョンのインストール]

-> 可能。(例)SQLServer2008と2014を同一マシンにインストール可能。

https://msdn.microsoft.com/ja-jp/library/ms143694(v=SQL.120).aspx

[互換性バージョン]

-> 旧バージョンとの互換性を保つため、データベース単位で互換性バージョンを設定可能

=> SQLServer2014上でSQLServer2008上で作った

データベースを互換性を保ったまま動作させることができる。

=> 新しい互換性バージョンでは廃止する機能が多くあるので

新しいバージョンでどの互換性バージョンをサポートするか

理解しておく必要がある

Page 33: Sql server浅く広く

異なるバージョンの混在と互換性バージョン②

[バージョンと互換性バージョン対応表]

-> SQLServer2016が出ると、互換性バージョン100がサポートされない恐れがある。SQLServer2008/R2は結構数が出てる(期間も4年やし)

互換性バージョン(SQLServerバージョン)

80(2000)

90(2005)

100(2008/R2)

110(2012)

120(2014)

SQLServer 2008/R2 ○ ○ ○

SQLServer 2012 ○ ○ ○

SQLServer 2014 ○ ○ ○

Page 34: Sql server浅く広く

SQL Server Management Studio(SSMS)

[管理、設定、監視、SQLすべてここで]

-> Expressも含め標準で搭載

Page 35: Sql server浅く広く

SSMS – 基本1

[オブジェクトエクスプローラー]

-> 階層構造で閲覧可能

-> それっぽいところで右クリックすると

なんでもできる↓下記はデータベースをスクリプト化しているところ

Page 36: Sql server浅く広く

SSMS – 基本2

[スクリプト生成が楽]

-> 何か設定を追加するときに左上に[スクリプト]ボタンがある。

・・・OKを押す前にスクリプトを作成しましょう↓下記はインデックスをGUIで追加しようとしているところ

Page 37: Sql server浅く広く

SSMS – 基本3

[便利な機能たち]

-> 動的管理ビューも一覧で

-> コードスニペットマネージャー

Page 38: Sql server浅く広く

SSMS – 基本4

[利用状況モニタ]

-> インスタンスのrootで右クリック

Page 39: Sql server浅く広く

SSMS – クエリを書く1

[USEとGO]

-> TransactSQLといってMicrosoftがSQLを拡張して作ったコマンドです。とりあえず下記だけ覚える。

use [データベース名] ・・・データベースを変更

go ・・・ステートメントの終了

[実行]

-> [実行]またはF5を押す。

[デバッグ]を押したがるが違う。

Page 40: Sql server浅く広く

SSMS – クエリを書く2

[インテリセンス]

-> テーブル名等、オブジェクトの頭を入力すれば候補が出る

-> もう一回出すには[Ctrl]+[Space]

-> 邪魔な場合は[Ctrl]を押していると下が透ける

Page 41: Sql server浅く広く

SSMS – クエリを書く3

[出力形式]

-> テキスト形式

-> 表形式

-> ファイルに出力

↓下記か、設定で切り替え

Page 42: Sql server浅く広く

SSMS – クエリを書く4

[実行プランを表示]

-> Ctrl + M

Page 43: Sql server浅く広く

SSMS – クエリを書く5

[トランザクションの注意点1]

-> SSMSでのトランザクションは自動コミットがデフォルトです。

↓下記のようにやればOK

--begin tranを入れる

begin tran

delete from Sales.SalesOrderDetail

where SalesOrderid = 43659

rollback

commit

-> 余談:TRUNCATE TABLEもロールバックできます。

Page 44: Sql server浅く広く

SMSS – クエリを書く6

-> Oracleみたいにする場合は下記

Set implicit_transactions on

[その他]

-> Dual表はないので、fromなし構文を使用

select ISNUMERIC('a')

-> システム関数、構成関数等

select host_name()

select serverproperty(‘edition’)

select @@versionhttps://msdn.microsoft.com/ja-jp/library/ms187786(v=SQL.120).aspx

https://msdn.microsoft.com/ja-jp/library/ms173823(v=sql.120).aspx

https://msdn.microsoft.com/ja-jp/library/ms174396(v=SQL.120).aspx

Page 45: Sql server浅く広く

SQL

[使用できるSQL構文]

-> 一般的なANSI準拠SQLはすべて対応

-> 集計関数はちょっとクセありRANK()他

-> 再帰クエリ(CTE)の記述も可

-> XMLにも対応しているのでXQueryの記述も可

-> PIVOT他の集計関数も記載可

-> インデックスヒントも書けます

-> DBのチェック等はDBCCコマンドhttps://msdn.microsoft.com/ja-jp/library/ms188796(v=sql.120).aspx

-> Unicode文字列を扱う場合は頭にNを!

select * From person.person

where FirstName like N'Bob%'

Page 46: Sql server浅く広く

データベースの作成1

[復旧モデル]

-> 完全 トランザクションログの内容をすべて保持し

復旧時には任意の時点に普及することが可能

トランザクションログのバックアップ管理が必要

-> 一括ログ ログ記録するが最小限の一括ログしか記録しない

-> 単純 トランザクションログの管理を行わない。

全体/差分/増分バックアップ時点までにしか

リストアできない。

修復時の復旧可能性は

完全 > 一括ログ > 単純

Page 47: Sql server浅く広く

データベースの作成2

[注意点]

-> 自動終了 Falseで! (ExpressでTrueになるケースあり)

-> 統計の自動更新 Trueで!

[基本ファイル構成]

-> データファイル(.mdf)

-> ログファイル(.ldf)

の2つ

Page 48: Sql server浅く広く

データベースの作成3

[ファイル拡張]

-> データファイル(.mdf)の自動拡張設定。以前は%での拡張だったので、*MB単位に変更する。DBが大きくなればなるほどファイル拡張のコストが大変なことになる

[ページの概念]

-> SQLServerはページと呼ばれる8Kバイト単位のファイルで構成される

-> 8ページで1エクステント(64K)

同一ページが拡張した場合はそのページ専用のエクステントができる

Page 49: Sql server浅く広く

システムデータベース

[SQLServerの起動に必要なデータベースの主な役割]

-> master 保持しているデータベース情報

ログイン情報

-> msdb SQLServerエージェントのジョブ情報、

スケジュールの設定情報、

バックアップ履歴など

-> model CREATE DATABASEのテンプレート

-> tempdb ソート用。勝手につくられる

-> resource 内部用(見えません)

[ちなみに”データ破損に備える”で以前喋りました]http://www.slideshare.net/savurou/sql-server-47408528

Page 50: Sql server浅く広く

クラスタ化インデックス1

[クラスタ化インデックスとは]

-> PrimaryKey順に物理的にソートして保存するテーブル構造。

データがInsertされると、そのデータはテーブルの該当するPrimaryKeyの場所(リーフページ)にデータを入れる。場合によってはページ分割発生。

[注意点]

-> 自然キーをPrimaryKeyにしていると、Insert時に断片化が発生しやすい。

=> リーフページのページの余裕を設定するFillfactorがデフォルト100%になっているため。

=> サロゲートキーを主キーにするか、Fillfactorを適切に

設定する

Page 51: Sql server浅く広く

テーブル系のその他機能1

[テーブル系]

->ビュー、トリガー、ストアド、インデックス付きビュー(マテビュー)、シーケンス、一時テーブル、制約、BLOB

・・・一般的なものはそろってます

-> カラムストアインデックス(列ベースのデータストレージ)

-> フルテキスト検索

-> パーティション

-> ストアド、トリガーをC#、VB.NETのコードで書けるSQLCLR

Page 52: Sql server浅く広く

テーブル系のその他機能2

[インデックス系]https://msdn.microsoft.com/ja-jp/library/ms175049(v=sql.120).aspx

-> 非クラスタ化インデックス

=> 普通のインデックスです。

-> リーフページに値を置くinclude

-> 計算列インデックス

-> ほとんどデータがないカラム向けにスパース

-> Enterpriseでは、インデックスの再構築をオンラインで行える

Page 53: Sql server浅く広く

バックアップとリストア

-> x86とx64とのバックアップの行き来OK

->互換性バージョンに関係なく古いバージョンへのリストア不可

=> SQLServer2012、互換性レベル110のバックアップを

SQLServer2014にリストアしてしまうと、もう

SQLServer2012環境にはリストアできません

-> バックアップの圧縮は2014Standard以上から。できないEditionはzip圧縮で・・・

Page 54: Sql server浅く広く

便利なツール①

[SQL Server Profiler]

-> DBに投げられたSQLを監視・保存できる

=> デフォルトインストールでは入らないので、

「管理ツール(完全)」をインストールする

=> ExpressEditionにはありませんが、下記を行えば

DBに発行されたSQLを見ることはできます。

http://nishio.hateblo.jp/entry/20120906/1346945058

[データベースエンジンチューニングアドバイザ]

-> 指定されたデータベースでクエリがどのように処理されるのかを調査し、インデックス、インデックス付きビュー、パーティション分割などのデータベース構造を更新/提案してくれる。

Page 55: Sql server浅く広く

便利なツール②

[SQLCMD]

-> SSMSが使えない、ログインできなくなった時用の

コマンドプロンプト形式のツール

[SQL整形ツール]

-> PoorMansT-SQLFormaterSSMSAddins

=> 下記にインストールされるので、同様に12.0のフォルダを作成して、11.0の内容をコピー

C:¥ProgramData¥Microsoft¥SQL Server Management Studio¥11.0

Page 56: Sql server浅く広く

CPUとメモリ割り当て

-> CPUの割り当てができます。

-> メモリの割り当てもできます。

=> SQLサーバーの特徴として

一度SQLServerがメモリを

割り当ててしまうと、インスタ

ンスを再起動しない限り、

つかんだまま離さないという

仕様がある。裏技としてDB動作

中にメモリ割り当てを一旦小さく

すると開放する。

Page 57: Sql server浅く広く

アプリケーションからの接続①

[接続用のAPI]

-> .NETの場合はSQLClientで

-> JavaならJDBC

-> ODBC経由で

-> FireDAC、その他・・・

[通信ポート]

-> TCP:1433

-> Expressの場合は動的ポートになるので、下記参照https://msdn.microsoft.com/ja-jp/library/cc646023(v=sql.120).aspx

Page 58: Sql server浅く広く

SqlClientを使用した接続①

[接続文字列]

-> SqlConnectionStringBuilderで。各値をプロパティで設定可能。

-> Connectionを張るのにコストがかかる。必ずPoolingをTrueにする

-> コネクションは使いまわしてください。ループ中に別SQLを発行する場合に別コネクションを張る必要はないです。

[SqlDataReaderかSqlDataAdapter+DataSetか]

-> SqlDataReaderはカーソルでFetchしていく感じで

DataSetに比べるとかなり軽い

-> DataSetはFillした段階で全データ取得するので

DBに負担はかかりにくい。

Page 59: Sql server浅く広く

SqlClientを使用した接続②

[パラメータクエリを書く]

-> SQLインジェクションの対応があるので必須

-> パラメータクエリを書かないとアドホッククエリとなり

SQLのコンパイルが都度発生し、クエリキャッシュが増大

-> SQLServerはセミコロンで区切ってSQLを複数

一度に発行できるので、不正な操作をされないよう注意

-> 型を合わせる。varcharとnvarcharの間で、暗黙の型変換が

起こると異常に遅くなります。

=> 実行プランで[右クリック]-[実行プランのXML表示]

の中にCONVERT_IMPLICITが入っていればNG。

-> AddWithValue構文は文字列の長さに応じて都度別の

キャッシュができてしまうので注意

Page 60: Sql server浅く広く

参考

基本はMSDNで検索

自習書 http://www.microsoft.com/ja-jp/server-cloud/local/sqlserver/2014/technology/self-learning.aspx

MSSQLSupportTeamBlog http://blogs.msdn.com/b/jpsql/

@IT DatabaExpert http://www.atmarkit.co.jp/ait/subtop/db/

ムッシュのページ http://blog.engineer-memo.com/

おださんのページ http://odashinsuke.hatenablog.com/

Page 61: Sql server浅く広く

◆ご清聴ありがとうございました