Sql world を支える技術
-
Upload
oda-shinsuke -
Category
Technology
-
view
590 -
download
7
description
Transcript of Sql world を支える技術
SQLWorld を支える技術SQLWorld★ 大阪 #272014/10/18 SQLWorld お だ
自己紹介
織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です
http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda
SQLWorld って?
SQL Server を中心に DB の勉強会やってます正規化 / モデリング , NoSQL とかもやってます最近 SQL を書くハンズオンやりはじめました
提示されたお題に対して、 SQL を書いてみる
DB インストールしてないとダメなの?
DB のインストール必要無しですブラウザがあれば参加出来ますやろうと思えば、オンラインでも可
http://tsqlrunner.azurewebsites.net/
裏で使ってるやつら
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)
裏で使ってるやつら
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)
Windows Azure Web Sites
無料でも使えるクレカ無し 60 分体験も可能
サイトのホスト先SCM 経由で デプロイ
GitHub/BitBucket/DropBox/TFS/ サイトローカル…
ASP.NET MVC 4
一番新しい ASP.NET MVCWeb API も使ってます
Knockout.js
Binding の用途で利用してます回答結果画面で利用
使いやすいので便利他のライブラリに依存しない部分的に取り入れることが出来る
Signal R
流行りの 双方向通信を行えるライブラリ実行環境 (Client 含む ) によって、通信方法が切り替える
今回は双方向っていうよりは、 Server Push メインで使ってます
Unity
P&P 製の DI コンテナ特に必要無かったけど、勉強がてらに
コード /.config どちらでも設定可能コンテナなので、インスタンスのライフサイクル管理も可能正直この規模なら要らない
Dapper
Micro ORMクエリの結果とクラスのマッピングだけ
個人的にはこれ位で調度良いEF (Entity Framework) とかちょっと…Java でも Commons DB Utils/Seasar Doma とか良く使ってる
SQL Database ( 旧 SQL Azure)
Azure の SQL ServerAzure Web Sites にも 20MB 分付いてくるSQL Server フル機能は使えないけど、今回の用途では無問題!IaaS に SQL Server を載せるやつとは違う
何回か開催していると問題が…
テーブル名が被ることが出てくる
スキーマ (Schema) を分けることで解消クエリに スキーマ 指定させるのイケてないselect * from [20140805].[ テーブル ]
開催回毎に ユーザー を作成し「既定のスキーマ」を指定する
アプリ側は同じクエリを投げても、ユーザーによって見るテーブルが変わる
テーブル定義の取得
T-SQL で取得しますカタログ ビューsys. ~
情報スキーマ ビューINFORMATION_SCHEMA. ~内部的には カタログ ビュー 使ってます
やりやすい方を使えば良いです。
余計なことをさせたくない!
自由にクエリを書けることの弊害
DROP TABLE されたらどうするん?DDL 系の操作データの追加 / 変更 / 削除
権限 ( やロール ) の設定で対応GRANT SELECT / DENY ~ロールの場合は db_datareader や カスタム作成したロール
余計なことをさせたくない!
その2
リソースを食い尽くす嫌なやつ
フロー制御言語を使った嫌がらせWHILE 無限ループWAITFOR 長時間ブロック
CTE( 共通テーブル式 ) を使った無限再帰クエリ
SELECT なので権限云々では防げない例:今から毎日分の日付を延々と返すクエリwith [CTE] ( [日付 ] ) as ( select getdate() union all select dateadd(d, 1, [日付 ]) from [CTE] ) select * from [CTE] option (maxrecursion 0)
SQL Server 側では難しそう…
SQL Server ScriptDom
.NET から使える T-SQL の Parser / GeneratorSQL Server Feature Pack からインストールSQL Server 2008 位からあるようです
2008 当時と 2012/2014 では 名前空間 の構成が違うので注意
Parser/Generator
各バージョン毎の Parser/Generator80(2000)/90/100/110/120(2014)新しい構文は古い Parser ではエラーになるAzure SQL Database 用はありません!Generator である程度は書式整形出来る
Parser を使って…
複数バッチ /複文 を NGSELECT でないと NGMAX RECURSION を指定してると NG
権限では防げないような物でも大体OK!
ScriptDom をどこで使うか
ビルド時の .sql 検証構文エラー / 規約違反
クエリの書式統一クエリの動的生成
使ってみたらわかるけど、結構面倒で非現実的…
おまけ
SQL Database で対応しているか調べる Visitor を作ってましたが…
ドキュメント (MSDN) と 実環境 とでちょいちょい乖離が…進化のスピード早いし、ドキュメントが追い付かないのもしゃーない結局 SQL Database で動かしてみないと判らん
SQL Database に投げて確認する
オブジェクト ( テーブルとか ) が無くてもとりあえずクエリ投げて OK
サポートしてないよってエラーが返ってきたら未サポートオブジェクト が無いよって返ってきたらサポートされてる
どのクエリが良いのか比べたい!
テーブルも多くて 3 個、データ数も 2桁インデックスもクラスタ化 (PK) のみ速度を比較しても…
比較は難しい感あえて可読性くらい?
実行プラン 出してみた
実行プランは XMLオプション指定すると、クエリで取れるSET SHOWPLAN_XML ON
SET SHOWPLAN_XML ONGOselect * from ~GOSET SHOWPLAN_XML OFF
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);}
Html-query-plan
http://code.google.com/p/html-query-plan/
XML => XSLT 経由で HTML に変換JavaScript + CSS も使ってますサンプル通りの使い方でほぼOKC# 側は XslCompiledTransform で OK実行プランの線が表示されてないのは未調査。。
まとめ
Azure Web Sites + 20MB SQLDB なら無料!色んなの使って動いてます他にも面白そうで使えそうなのあれば教えてください勉強会で使う問題も募集中!