34
SQLWorld をををををを SQLWorldをを #27 2014/10/18 SQLWorld を を

Sql world を支える技術

Embed Size (px)

DESCRIPTION

SQLWorld★大阪#27(http://sqlworld.org/event/20141018/)

Citation preview

Page 1: Sql world を支える技術

SQLWorld を支える技術SQLWorld★ 大阪 #272014/10/18 SQLWorld お だ

Page 2: Sql world を支える技術

自己紹介

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

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

Page 3: Sql world を支える技術

SQLWorld って?

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

提示されたお題に対して、 SQL を書いてみる

Page 4: Sql world を支える技術

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

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

http://tsqlrunner.azurewebsites.net/

Page 5: Sql world を支える技術

裏で使ってるやつら

Windows Azure Web SitesSQL Database ( 旧 SQL Azure)ASP.NET MVC 4Knockout.js (JS MVVM FW)Signal R (Realtime Web for .NET)SQL Server ScriptDom (T-SQL Parser)Unity (DI の方ね )Dapper (Micro ORM)html-query-plan (execution plan to html)

Page 6: Sql world を支える技術

裏で使ってるやつら

Windows Azure Web SitesSQL Database ( 旧 SQL Azure)ASP.NET MVC 4Knockout.js (JS MVVM FW)Signal R (Realtime Web for .NET)SQL Server ScriptDom (T-SQL Parser)Unity (DI の方ね )Dapper (Micro ORM)html-query-plan (execution plan to html)

Page 7: Sql world を支える技術

Windows Azure Web Sites

無料でも使えるクレカ無し 60 分体験も可能

サイトのホスト先SCM 経由で デプロイ

GitHub/BitBucket/DropBox/TFS/ サイトローカル…

Page 8: Sql world を支える技術

ASP.NET MVC 4

一番新しい ASP.NET MVCWeb API も使ってます

Page 9: Sql world を支える技術

Knockout.js

Binding の用途で利用してます回答結果画面で利用

使いやすいので便利他のライブラリに依存しない部分的に取り入れることが出来る

Page 10: Sql world を支える技術

Signal R

流行りの 双方向通信を行えるライブラリ実行環境 (Client 含む ) によって、通信方法が切り替える

今回は双方向っていうよりは、 Server Push メインで使ってます

Page 11: Sql world を支える技術

Unity

P&P 製の DI コンテナ特に必要無かったけど、勉強がてらに

コード /.config どちらでも設定可能コンテナなので、インスタンスのライフサイクル管理も可能正直この規模なら要らない

Page 12: Sql world を支える技術

Dapper

Micro ORMクエリの結果とクラスのマッピングだけ

個人的にはこれ位で調度良いEF (Entity Framework) とかちょっと…Java でも Commons DB Utils/Seasar Doma とか良く使ってる

Page 13: Sql world を支える技術

SQL Database ( 旧 SQL Azure)

Azure の SQL ServerAzure Web Sites にも 20MB 分付いてくるSQL Server フル機能は使えないけど、今回の用途では無問題!IaaS に SQL Server を載せるやつとは違う

Page 14: Sql world を支える技術

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

Page 15: Sql world を支える技術

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

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

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

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

Page 16: Sql world を支える技術
Page 17: Sql world を支える技術

テーブル定義の取得

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

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

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

Page 18: Sql world を支える技術

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

Page 19: Sql world を支える技術

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

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

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

Page 20: Sql world を支える技術

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

その2

Page 21: Sql world を支える技術

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

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

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

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

Page 22: Sql world を支える技術

SQL Server 側では難しそう…

Page 23: Sql world を支える技術

SQL Server ScriptDom

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

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

Page 24: Sql world を支える技術

Parser/Generator

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

Page 25: Sql world を支える技術

Parser を使って…

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

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

Page 26: Sql world を支える技術

ScriptDom をどこで使うか

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

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

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

Page 27: Sql world を支える技術

おまけ

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

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

Page 28: Sql world を支える技術

SQL Database に投げて確認する

オブジェクト ( テーブルとか ) が無くてもとりあえずクエリ投げて OK

サポートしてないよってエラーが返ってきたら未サポートオブジェクト が無いよって返ってきたらサポートされてる

Page 29: Sql world を支える技術
Page 30: Sql world を支える技術

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

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

比較は難しい感あえて可読性くらい?

Page 31: Sql world を支える技術

実行プラン 出してみた

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

SET SHOWPLAN_XML ONGOselect * from ~GOSET SHOWPLAN_XML OFF

Page 32: Sql world を支える技術

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 33: Sql world を支える技術

Html-query-plan

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

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

Page 34: Sql world を支える技術

まとめ

Azure Web Sites + 20MB SQLDB なら無料!色んなの使って動いてます他にも面白そうで使えそうなのあれば教えてください勉強会で使う問題も募集中!