sql database でも使えるほにゃらら

24
SQL Database ででででで○ ×※△ 2014/10/04 SQL Server ででで JAZUG で で

Upload: oda-shinsuke

Post on 28-May-2015

2.870 views

Category:

Technology


1 download

DESCRIPTION

2014/10/04 SQL Server 収穫祭 http://jazug.doorkeeper.jp/events/14622

TRANSCRIPT

Page 1: Sql database でも使えるほにゃらら

SQL Database でも使える○ ×※△

2014/10/04 SQL Server 収穫祭JAZUG お だ

Page 2: Sql database でも使えるほにゃらら

自己紹介

織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です

http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda

Page 3: Sql database でも使えるほにゃらら

SQLWorld って?

SQL Server を中心に DB の勉強会やってます正規化 / モデリング , NoSQL とかもやってますSQL を書くハンズオンやってます

平日夜開催 (2H 程度 )提示されたお題に対して、 SQL を書いてみる検索だけ (SELECT) 4, 5 問

Page 4: Sql database でも使えるほにゃらら

DB インストールしてないとダメなの?

DB のインストール必要無しですブラウザがあれば参加出来ますやろうと思えば、オンラインでも可

http://tsqlrunner.azurewebsites.net/

Page 5: Sql database でも使えるほにゃらら

何回か開催していると問題が…

Page 6: Sql database でも使えるほにゃらら

テーブル名が被ることが出てくる

スキーマ (Schema) を分けることで解消クエリに スキーマ 指定させるのイケてないselect * from [20140805].[ テーブル ]

開催回毎に ユーザー を作成し「既定のスキーマ」を指定する

アプリ側は同じクエリを投げても、ユーザーによって見るテーブルが変わる

Page 7: Sql database でも使えるほにゃらら
Page 8: Sql database でも使えるほにゃらら

テーブル定義の取得

T-SQL で取得しますカタログ ビューsys. ~

情報スキーマ ビューINFORMATION_SCHEMA. ~内部的には カタログ ビュー 使ってます

やりやすい方を使えば良いです。

Page 9: Sql database でも使えるほにゃらら

余計なことをさせたくない!

Page 10: Sql database でも使えるほにゃらら

自由にクエリを書けることの弊害

DROP TABLE されたらどうするん?DDL 系の操作データの追加 / 変更 / 削除

権限 ( やロール ) の設定で対応GRANT SELECT / DENY ~ロールの場合は db_datareader や カスタム作成したロール

Page 11: Sql database でも使えるほにゃらら

余計なことをさせたくない!

その2

Page 12: Sql database でも使えるほにゃらら

リソースを食い尽くす嫌なやつ

フロー制御言語を使った嫌がらせWHILE 無限ループWAITFOR 長時間ブロック

CTE( 共通テーブル式 ) を使った無限再帰クエリ

SELECT なので権限云々では防げない例:今から毎日分の日付を延々と返すクエリwith [CTE] ( [日付 ] ) as ( select getdate() union all select dateadd(d, 1, [日付 ]) from [CTE] ) select * from [CTE] option (maxrecursion 0)

Page 13: Sql database でも使えるほにゃらら

SQL Server 側では難しそう…

Page 14: Sql database でも使えるほにゃらら

ScriptDom

.NET から使える T-SQL の Parser / GeneratorSQL Server Feature Pack からインストールSQL Server 2008 位からあるようです

2008 当時と 2012/2014 では 名前空間 の構成が違うので注意

Page 15: Sql database でも使えるほにゃらら

Parser/Generator

各バージョン毎の Parser/Generator80(2000)/90/100/110/120(2014)新しい構文は古い Parser ではエラーになるAzure SQL Database 用はありません!Generator である程度は書式整形出来る

Page 16: Sql database でも使えるほにゃらら

Parser を使って…

複数バッチ / 複文 を NGSELECT でないと NGMAX RECURSION を指定してると NG

権限では防げないような物でも大体OK!

Page 17: Sql database でも使えるほにゃらら

ScriptDom をどこで使うか

ビルド時の .sql 検証構文エラー / 規約違反

クエリの書式統一クエリの動的生成

使ってみたらわかるけど、結構面倒で非現実的…

Page 18: Sql database でも使えるほにゃらら

おまけ

SQL Database で対応しているか調べる Visitor を作ってましたが…

ドキュメント (MSDN) と 実環境 とでちょいちょい乖離が…進化のスピード早いし、ドキュメントが追い付かないのもしゃーない結局 SQL Database で動かしてみないと判らん

Page 19: Sql database でも使えるほにゃらら
Page 20: Sql database でも使えるほにゃらら

どのクエリが良いのか比べたい!

テーブルも多くて 3 個、データ数も 2 桁インデックスもクラスタ化 (PK) のみ

速度を比較しても…比較は難しい感

あえて可読性くらい?

Page 21: Sql database でも使えるほにゃらら

実行プラン 出してみた

実行プランは XMLオプション指定すると、クエリで取れるSET SHOWPLAN_XML ON

SET SHOWPLAN_XML ONGOselect * from ~GOSET SHOWPLAN_XML OFF

Page 22: Sql database でも使えるほにゃらら

SqlCommand で投げる場合

GO が使えないGO は T-SQL ではないSSMS/sqlcmd 等で認識されるコマンド

Execute を分けて実行using (var conn = new SqlConnection(ConnStr))using (var cmd = new SqlCommand(@"SET SHOWPLAN_XML ON", conn)) { conn.Open(); cmd.ExecuteNonQuery(); cmd.CommandText = "select * from [MemTable] where [Id] <= 100"; File.WriteAllText("Plan.sqlplan", cmd.ExecuteScalar() as string);}

Page 23: Sql database でも使えるほにゃらら

Html-query-plan

http://code.google.com/p/html-query-plan/

XML => XSLT 経由で HTML に変換JavaScript + CSS も使ってますサンプル通りの使い方でほぼOKC# 側は XslCompiledTransform で OK実行プランの線が表示されてないのは未調査。。

Page 24: Sql database でも使えるほにゃらら

まとめ

SQL Server/SQL Database には、普段あまり目にしない / 使ってないものがまだまだあると思います。

色々使って試してみましょう!