タグ

SQLに関するikosinのブックマーク (97)

  • Entity-Attribute-Value: SQL アンチパターン - ペンギンラボ Wiki

    Bill Karwin “SQL Antipatterns: Avoiding the Pitfalls of Database Programming” の読書メモ。 Jaywalking 目的 ある属性について、複数の値を持たせる。 アンチパターン : カンマ区切りリスト カンマ区切りで複数の値を 1 つの列に納める。 例では、特定の製品についての担当者を複数設定するのにカンマ区切りで、担当者のアカウントIDを記述している。 create table products ( product_id integer, product_name varchar(1000), acount_id varchar(100), -- comma separated list -- ... ); insert into products (product_id, product_name, accou

  • DBのViewを作ったらRailsプログラムが綺麗になった話 | 自転車で通勤しましょ♪ブログ

    最近データベースというかSQLについて勉強しているんですが、奥が深いですね。この前の第9回中国地方DB勉強会のときに聞いたrank関数を使って、ランキング機能をリファクタリングしよう!と思って最近頑張ってます。というのも、複雑なクエリ(遅い)を業種数分(10回くらい)呼んでいたため、Herokuだと結構ギリギリの速度になることもあったので、なんとかしなければ!と思っていたのです。 とりあえず、私の開発環境を載せておきます。 Mac Yosemite Ruby 2.2 Rails 4.2.1 PostgreSQL 9.3.4 ひとまずrank関数を使うところまで まず、NewRelicを使ってActiveRecordが出力しているSQLを取得し、それを0xDBEのコンソールに貼り付けて、rank関数を使って業種でパーティションしてランキングを出すところまでしてみました。rank関数は、関数名

    ikosin
    ikosin 2015/06/18
  • SQL実践入門──高速でわかりやすいクエリの書き方 - kagamihogeの日記

    俺は実務経験をある程度こなしたあと、RDBの知識不足を認識したクチである。改めてRDBを勉強し始めて困ったことの一つは、実行計画の読み方がよくわからないことだった。もちろん、ぐぐればNESTED LOOP JOINが何かとかは出てくるし、公式のマニュアルも参考になる。ただ、webの文献は体系だって解説があるとは限らないし、個人のブログなどは粒度がバラバラで、まとまった量の知識を得るには向いていない。マニュアルも膨大な量があるので慣れていないと目的の文書が書いてあるかどうかすら分からないし、あったとしても必要なレベルの解説があるかどうは分からない。 そこで書の出番である。既存の書籍にもSQLとパフォーマンスを論じたものはあるにはあるのだが、それに特化したの存在は、少なくとも俺は知らない。一冊だけ、データベースパフォーマンスアップの教科書 基原理編 - kagamihogeの日記という極

    SQL実践入門──高速でわかりやすいクエリの書き方 - kagamihogeの日記
  • Goのトランザクションマネージャ作った

    Golangdatabase/sqlはBeginとCommitでトランザクションの制御を行うことができます。 クエリの実行が確実に成功するのであれば難しくは無いのですが、 トランザクション内でエラーが発生場合、確実にトランザクションを終了させるのは少し面倒です。 また、ネストができないので、「トランザクションの中から呼び出しても外から呼び出しても、関数の中はトランザクション内」みたいなことができません。 PerlにはDBIx-TransactionManagerというものがあるのですが、 このGolang版が欲しくなったので作ってみました。 txmanager 簡単な使い方 sql.DB をラップした txmanager.DB を使います。 Begin, Commit する代わりに TxBegin, TxCommit を使ってトランザクションを開始・終了すると txmanagerの管理下

    ikosin
    ikosin 2015/05/11
  • Webアプリケーションの パフォーマンス向上のコツ 実践編

    社内 LT 大会で発表したスライドです。 スライドの日付が 2012/05/22 になっていますが、正しくは 2012/05/21 です。

    Webアプリケーションの パフォーマンス向上のコツ 実践編
  • トレジャーデータで実践:Basket 分析(頭の体操編) - トレジャーデータ(Treasure Data)ブログ

    始めに トレジャーデータはクラウドでデータマネージメントサービスを提供しています。 バスケット分析(併売分析)は,アウトプットイメージやその分析の有用性についてはマーケティング業界の誰もが周知しているのに反して,実際にそれを実践できている所はそれ程多くはありません。 マーケット バスケット分析の使用 - Tableau また、実践できているにしても上の Tableau のようなソフトウェアを入れなければならなかったり、実装のためのコストやリソースがかかっている所も少なくありません。さらに、そういったツールに頼っているところは、少し条件を変えただけの分析やより踏み込んだ分析に対応する柔軟性を兼ね備えるのは難しいところです。 シリーズで紹介するトレジャーデータで実戦可能なバスケット分析コンテンツは,誰もがロジック・仕組みの理解から実践まで行えるように、できるだけわかりやすく具体的に紹介してい

    トレジャーデータで実践:Basket 分析(頭の体操編) - トレジャーデータ(Treasure Data)ブログ
  • 実行計画が解れば怖くない。SQL実践入門 - プログラマでありたい

    技術評論社さんから、SQL実践入門を献いただきました。ありがとうございます。 SQL実践入門の主題 このの目的は、「パフォーマンスの良いSQLの書き方、特に大量データを処理するSQLの性能向上の方法を理解すること」とあります。そのパフォーマンス向上の為の解として、SQLが内部的にどう処理されているかを表す実行計画の読み解き方を、いろいろなケースを上げながらひたすら解説しています。そして、何故その実行計画になるのか、データ構造やDBの動きとともに説明しています。ということで、実行計画大事という基かつ当たり前のことを、正面から取り扱っている良質のSQLです。 SQL実践入門の構成 SQL実践入門の章立ては、下記の通りです。 第1章:DBMSのアーキテクチャ──この世にただ飯はあるか 第2章:SQLの基礎──母国語を話すがごとく 第3章:SQLにおける条件分岐──文から式へ 第4章:集約

    実行計画が解れば怖くない。SQL実践入門 - プログラマでありたい
  • Time-based SQL Injectionは意外に実用的だった

    このエントリでは、Time-based SQLインジェクション、すなわち時間差を利用したSQLインジェクションが意外に実用的だったという報告をします。デモ映像ありです。 はじめに Time-based SQL Injectionという攻撃があります。これはブラインドSQLインジェクションの一種で、ある条件の場合に一定時間(例えば5秒)スリープし、そうでない時との応答時間の差で情報を盗もうというものです。1回のHTTPリクエストで1ビットの情報が得られるので、それを積み重ねることによって、いくらでも情報を盗めるはずです…理論的には。 しかし、「理屈はそうでも、時間が掛かりすぎるよね」ということで、深くは追っかけていませんでした。SQLインジェクションの検査には有効でも、悪用としての実用性はあまりないと考えていたのです。 きっかけ きっかけは、以下のYahoo!知恵袋に以下の質問です。 SQL

    Time-based SQL Injectionは意外に実用的だった
  • 新著が出ます:『SQL実践入門』 - ミックのブログ

    4月中旬ころになりますが、新著が出ます。SQLのパフォーマンスを主題にしたで、実行計画を読むことで、なぜこのSQLは遅いのか、あるいは速いのかをデータベースの内部動作まで把握して理解しよう、という趣旨です。 リレーショナルデータベースというのは、SQLという自然言語を模したインタフェースによって、低次のレイヤーを隠蔽する意図で作られたミドルウェアなので、当は実行計画などという手続レベルの世界をユーザが覗き見るのは、末転倒なところもあります。ただそうはいっても、現実にSQLが遅かったら原因を解析せざるをえないわけだし、大体当にブラックボックスにしたいなら、なんでどのDBMSも実行計画を見られる手段なんか用意してるんでしょうね不思議ですね、という理想と現実の狭間で悩むエンジニアの方々に少しでもベターな解に辿りつけるアプローチを提示できれば、と考えております。 以下まえがきと章立てです。

    新著が出ます:『SQL実践入門』 - ミックのブログ
    ikosin
    ikosin 2015/03/30
    "結合を制する者はSQL を制す"
  • Jinq - Easy database queries for Java 8

    Jinq provides developers an easy and natural way to write database queries in Java. You can treat database data like normal Java objects stored in collections. You can iterate over them and filter them using normal Java commands, and all your code will be automatically translated into optimized database queries. Finally, LINQ-style queries are available for Java! Simple Natural Queries. With Jinq,

  • SQLインジェクション対策もれの責任を開発会社に問う判決

    ポイントは下記の通りです。 X社(原告)はセキュリティ対策について特に指示はしていなかった 損害賠償について個別契約に定める契約金額の範囲内とする損害賠償責任制限があった 当初システムはカード決済を外部委託し直接カード情報を扱っていなかった X社が「カード会社毎の決済金額を知りたい」とY社に依頼をして、その結果カード情報をいったんDBに保存する仕様となった(2010年1月29日) X社からの問い合わせに対してY社は、カード情報を保持しない方式に変更することが可能で、そのほうが安全となり、費用は20万円程度である旨を伝えた(2010年9月27日)が、その後X社は改良の指示をしなかった 以下の脆弱性その他が認められた システム管理機能のIDとパスワードが admin/password であった 個人情報が記載されたお問い合わせログファイルの閲覧が可能(ディレクトリリスティングと意図しないファイ

    ikosin
    ikosin 2015/01/22
  • O/Rマッパーによるトラブルを未然に防ぐ

    ORMがトラブル起こすから嫌い」なんじゃなくて、「ORMが起こすトラブルが解決できないから嫌い」ってのがほんとのところじゃない?だったら解決方法を知ればいいんじゃね?というお話。「N+1問題」もろくに知らずにORMを批判せんでほしい。Read less

    O/Rマッパーによるトラブルを未然に防ぐ
    ikosin
    ikosin 2015/01/08
  • SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?

    質問への回答(35件)を、ブログにまとめているのでこちらご覧ください https://little-hands.hatenablog.com/entry/2019/08/31/genba_de_ddd 「Mix Leap Study 特別編 - レガシーをぶっつぶせ。現場でDDD! コラボカンファレンス」登壇資料 ブログ:https://little-hands.hatenablog.com/ Twitter:https://twitter.com/little_hand_s 質問箱:https://peing.net/ja/little_hands

    SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
    ikosin
    ikosin 2015/01/08
  • やっぱり SQL を書きたい派に送る jOOQ

    jOOQ と Flyway で立ち向かう、自社サービスの保守運用 #jjug_ccc #ccc_ab1

    やっぱり SQL を書きたい派に送る jOOQ
  • jOOQ: The easiest way to write SQL in Java

    jOOQ generates Java code from your database and lets you build type safe SQL queries through its fluent API. Start your free jOOQ trial now! Great Reasons for Using jOOQ Our customers spend most time on their business-logic. Because jOOQ takes care of all their Java/SQL infrastructure problems. Database First Tired of ORMs driving your database model? Whether you design a new application or integr

    jOOQ: The easiest way to write SQL in Java
  • BootのO/RマッパーにMyBatisを使いたい。 - 谷本 心 in せろ部屋

    DBアクセス層に何を使うかって、当によく話題になりますよね。 「これで間違いないでしょ」っていう鉄板の選択肢がないから、だと思うわけですが 「SQLを書きたい日人」な僕としては、消去法的にMyBatisを使っています。 消去法って言うからには、消えた選択肢があるわけで。 Hibernate : アイドントライク ハイバネートサン JPA : アイドントライク ハイバネートサン Doma : アイドントライク APT S2JDBC : キャノット ユーズ ウィズ スプリング DBflute : 少し文化が違うんです。 Mirage : 開発止まっちゃったし。 ホントはMirageあたりが大好物で、過去に実案件に投入した時には まったく問題が起きなくて素晴らしかったのですが 開発が止まっていることと、実績的なアレでなかなか使いにくいんです。 そんなわけで消去法的に残ったMyBatisを使う

    BootのO/RマッパーにMyBatisを使いたい。 - 谷本 心 in せろ部屋
  • SQLインジェクションは本当に避けられないのか - ドクジリアン柔術少女 すから☆ぱいそん - ワルブリックス株式会社

    ありもしない完全な代替品を求めるよりも、より現実的な選択肢を改善することについて。 SQLからなるべく乖離しないでDRYを実現するっていうScalikeJDBCの落としどころが素晴らしい。「結局のところSQLは書かなきゃいけんねん」「SQLよりつぶしの効くRDB操作用言語は存在しえないねん」っていうORMの教訓を経てきた人類はここに到達したって感じで。 — 嶋田大貴 (@shimariso) 2014, 11月 21 というツイートをしたところ、 何をいうか。必ずORMを使うべきだ SQLは根的にSQLインジェクションを回避できない問題がある みたいな趣旨の反応があったのだけれど、前者についてはWikipediaのここ を一読いただくとして、後者についてはプログラミング言語のほうが発達してて状況が違ってきてるよという話をしたい。 誤解しないでいただきたいのは、別にSQLが良いものであると

    SQLインジェクションは本当に避けられないのか - ドクジリアン柔術少女 すから☆ぱいそん - ワルブリックス株式会社
  • SQLデータベースに正しインデックスを作るのは 誰の役割?

    SQLのパフォーマンス問題は、SQLそのものと同じぐらいの歴史がある―― ある人は、SQLはそもそも遅いものだとすら言うかもしれません。これは、SQL歴史が始まった頃は正しかったかもしれませんが、今となっては全く 当てはまらないでしょう。にもかかわらず、SQLのパフォーマンス問題は今も一般的でよくあることです。どうしてそうなってしまうのでしょうか? SQL言語は、恐らく最も成功した第4世代言語(4GL)でしょう。その最大の利点は、「何を」と「どのように」 を分離できることです。SQL文は、どのようにそれを実行するかを記述せずに、単純に 何を必要としているかのみの記述になっています。以下のような例を考えてみましょう。 SELECT date_of_birth FROM employees WHERE last_name = 'WINAND'SQLのクエリは、データを要求する英語の文として読

    SQLデータベースに正しインデックスを作るのは 誰の役割?
  • なぜ Teng は良いものなのか - tokuhirom's blog

    なぜ Teng は良いものなのか、を YAPC で再考させられたのでここにメモしておく。 Teng は自社開発のウェブアプリケーションを作ってる人たちが作っていて、それがうちのニーズにあってるのでいいっていう話であって、どこでもすごい最高!! と主張したいわけではないです。まあ、個人の感想ですね。 ソースが読みやすい ソースがよくモジュール化されていて、読みやすい。自身で書いている部分が多いという贔屓目を抜きにしても読みやすいんじゃないかなーと。 僕らのような自社開発のウェブ屋では、なにか無茶な要望を受けた時にささっと対応するということが求められるシーンが多いので、ソースの読みやすさというのはかなり重要なファクターとなっています。 複雑な SQL を発行できないように機能が制限されている SQL ビルダーを使って JOIN やサブクエリを駆使したウェブアプリケーションを開発してしまうと、運

    ikosin
    ikosin 2014/09/01
  • にひりずむ::しんぷる - DBI で実際に発行されるクエリーを取得する DBIx::QueryLog を書いた

    季節が変わって、早速風邪をひいています。 さて、もう秋を通り越して冬の様相を呈してきた昨今ではありますが、DBI では、普通はプレースホルダを使い my $stmt = 'SELECT * FROM user WHERE user_id = ?'; my @bind = ($user_id); $dbh->do($stmt, undef, @bind); とか書くと思います。 このときに、実際にバインドされた後の SQL をみたいなーって衝動に駆られると思いますが*1、どう頑張ってドキュメントを読んでもわかりませんね。 こういうときは仕方ないので、$stmt と @bind を両方ログに出してお茶を濁していました。 $self->log->_dump($stmt, @bind); # => SELECT * FROM user WHERE user_id = ?, [1234] でもこれっ