Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Sql world を支える技術

1,378 views

Published on

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

Published in: Technology
  • Be the first to comment

Sql world を支える技術

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

×