タグ

SQLとperformanceに関するmanabouのブックマーク (17)

  • インデックスを理解したい - Qiita

    はじめに みなさんはDBのインデックスを正しく使えていますか? 私はなんとなく「DBのパフォーマンスを向上するためのもの」という認識はあったのですが、 どのような場面で使うものなのか、逆にどのような場面では使うべきでないのかなど 明確に理解できていませんでした。 今回はそんなインデックスについての理解を深めたいと思います。 インデックスとは インデックスとは、その名の通り「索引」です。 表現の仕方と変えると、(x, a)という形式の配列であるとも言えます。 xというキー値とそれに結びつくaというデータ情報があり、 これを利用することですべてのデータを網羅して見ることなく、 まさにの索引のように目的のデータにたどり着くことができます。 インデックスはSQLのパフォーマンスを改善するための非常にポピュラーな手段であり、 理由としては下記の3点が挙げられます。 アプリケーションのコードに影響を

    インデックスを理解したい - Qiita
  • SQLの実行計画の読み方 |

    今回は、SQLを書く上で特にパフォーマンスに影響のあるSQLの実行計画の読み方について解説します。実行計画はデータベース製品によってさまざまに差異がありますが、ここでは比較的どのデータベース製品でも共通する内容について解説します。 実行計画とは記述したSQLが実際にデータベースの内部でどのように処理されて結果を返すか、その処理方法を記述した情報です。 A5:SQL Mk-2では、SQLエディタで実行計画を見たい SQL の上にキャレットがある状態でメニューから [SQL(S)] – [SQLの実行計画(J)] または、Ctrl+E で表示できます。 表示の仕方はデータベース製品ごとに異なりますが、多くのデータベース製品ではツリー状の情報として表現されます。(このため A5:SQL Mk-2でもツリービューで実行計画を表示します。) ツリーのリーフ(端)から処理が行われ、ルート(根)に向かっ

  • データベースを遅くするための8つの方法

    はじめに Twitterのタイムラインを見ていたらバッチ系のプログラムで逐次コミットをやめて一括コミットにしたら爆速になったというのを見ました。当たり前でしょ、と思ったけど確かに知らなければ分からないよね、と思って主に初心者向けにRDBを扱うときの注意点をまとめてみました。 プログラミングテクニック的なところからテーブル設計くらいの範疇でDBチューニングとかは入ってないです。 自分の経験的にOracleをベースに書いていますが、他のRDBでも特に変わらないレベルの粒度だと思います。 大量の逐次コミットをする バッチアプリケーションでDBにデータをインサートすると言うのはかなり一般的な処理です。しかしデータ量が少ない時はともかく大量のインサートを逐次コミットで処理するとめちゃくちゃ遅くなります。数倍から十数倍遅くなることもあるので、10分程度のバッチが1時間越えに化けることもザラにあるので原

    データベースを遅くするための8つの方法
  • 1000万件オーバーのレコードのデータをカジュアルに扱うための心構え - joker1007’s diary

    自分が所属している会社のメンバーの教育用資料として、それなりの規模のデータを扱う時に前提として意識しておかなければいけないことをざっくりまとめたので、弊社特有の話は除外して公開用に整理してみました。 大規模データ処理、分散処理に慣れている人にとっては今更改めて言うことじゃないだろ、みたいな話ばかりだと思いますが、急激にデータスケールが増大してしまったりすると環境に開発者の意識が追い付かないこともあるかと思います。 そういったケースで参考にできるかもしれません。 弊社は基的にAWSによって運用されているので、AWSを前提にした様なキーワードやサービス名が出てきます。後、句読点があったり無かったりしますが、ご容赦ください。 追記: 社内用の資料の編集なのでかなりハイコンテキストな内容だから誤解するかもしれませんが、これらはそもそもRDBの話ではありません。(関係無くは無いけど) 1000万オ

    1000万件オーバーのレコードのデータをカジュアルに扱うための心構え - joker1007’s diary
  • MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる

    仕事やらなんやらでMySQLのクエリの良し悪しを判断する必要があるとき、EXPLAINの内容だけだとどのぐらい良くなったり悪くなったのか分からないので SET long_query_time = 0; してrows_examined (そのクエリでrows_sent行の結果を返すために何行に触ったのか)も一緒に提示するようにしている(少なくともMySQL 5.7時点ではrows_examinedはslow_query_logでしか確認できないはずperformance_schemaが有効ならevents_statements_historyやその仲間たちで確認できるとのこと*1 MySQL :: MySQL 5.6 リファレンスマニュアル :: 22.9.6 パフォーマンススキーマステートメントイベントテーブル)。 例: 上の例のBeforeは、もともとDBAが書いた温かみのあるSQLでO

    MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる
  • 遅いクエリと向き合ったり、ログ基盤を刷新したり──Cybozu Meetup #6レポート - Cybozu Inside Out | サイボウズエンジニアのブログ

    まいど! コネクト支援チームの風穴(かざあな)です。 今回は、7月25日に開催した「Cybozu Meetup #6 大規模サービスを支える名脇役たち」についてレポートします。 Cybozu Meetupとは? 「Cybozu Meetup」は、サイボウズのエンジニアとカジュアルに交流する場として企画している、ミートアップイベントです。会場はサイボウズのオフィス(今のところ東京と大阪)なので、社内の雰囲気や社員の様子を、実際に肌で感じて頂ける機会でもあります。 開催ペースは、東京オフィスは毎月1回、大阪オフィスは3カ月に1回となっています(今のところ)。これまでに、以下のようなテーマで計6回開催してきました。 [02/27]Cybozu Meetup #1 フロントエンド(東京、大阪) ⇒ 開催レポート [04/03]Cybozu Meetup #2 SRE(東京) ⇒ 開催レポート [0

    遅いクエリと向き合ったり、ログ基盤を刷新したり──Cybozu Meetup #6レポート - Cybozu Inside Out | サイボウズエンジニアのブログ
  • なぜ、SQLは重たくなるのか?──『SQLパフォーマンス詳解』の翻訳者が教える原因と対策|ハイクラス転職・求人情報サイト AMBI(アンビ)

    なぜ、SQLは重たくなるのか?──『SQLパフォーマンス詳解』の翻訳者が教える原因と対策 『SQLパフォーマンス詳解』の翻訳者の松浦隼人さんに、8つの「SQLが重たくなる原因とその対策」を聞きました。システムのボトルネックになるような「問題のあるSQL」を回避するノウハウを学びましょう。 データの操作や定義をする言語「SQL」は、どのような領域を担うエンジニアにとっても必修科目です。しかし、その仕様をきちんと理解し、パフォーマンスに優れたSQLを書ける方はそれほど多くありません。問題のあるSQLを書いてしまい、知らぬ間にそれがシステムのボトルネックになってしまう事態はよく発生します。 では、どうすればそうした事態を回避できるのでしょうか? そのノウハウを学ぶため、今回は『SQLパフォーマンス詳解』の翻訳者であり、自身もエンジニアでもある松浦隼人(まつうら・はやと/@dblmkt)さんに8つ

    なぜ、SQLは重たくなるのか?──『SQLパフォーマンス詳解』の翻訳者が教える原因と対策|ハイクラス転職・求人情報サイト AMBI(アンビ)
  • 進捗)SSD-to-GPU ダイレクトSQL実行機能 - KaiGaiの俺メモ

    ここ暫くブログでまとめていなかった、SSD-to-GPUダイレクトSQL実行機能の進捗について。 この機能をかいつまんで言うと、NVMe-SSDに格納されているPostgreSQLのデータブロックをGPU RAMに直接転送し、そこでSQLのWHERE句/JOIN/GROUP BYを実行することで見かけ上のI/O量を削減するという代物である。 NVIDIAのTesla/Quadro GPUが対応するGPUDirect RDMA機能を使い、SSD<=>GPU間のデータ転送を仲介するLinux kernel moduleを使えば、CPU/RAMにデータをロードする前にGPU上での処理を行うことができる。 しばらく前からScan系の処理には対応していたが、JOIN/GROUP BYへの対応を加え、さらにPostgreSQL v9.6のCPU並列にも追従したということで、簡単なベンチマークなら取れる

    進捗)SSD-to-GPU ダイレクトSQL実行機能 - KaiGaiの俺メモ
  • SQLパフォーマンス詳解: 開発者のためのデータベースチューニング解説書

    前書き インデックスの 内部構造 インデックス リーフノード 検索 ツリー(Bツリー) 遅いインデックス パートI where 句 等価 演算子 プライマリキー 複合インデックス 遅いインデックス パートII 関数 - where 大文字・小文字を区別する 検索 ユーザ定義 関数 インデックスの作り過ぎ パラメータ化 クエリ 範囲 検索 大なり、小なり、 BETWEEN LIKEフィルタに 対するインデックス インデックスの結合 部分インデックス OracleにおけるNULL NULLに対する インデックス NOT NULL 制約 部分インデックスを エミュレートする 処理しにくい条件 日付型 数値文字列 列の連結 スマートなロジック 数式 パフォーマンスと スケーラビリティ データ 量 システム 負荷 レスポンス タイムとスループット 結合 処理 入れ子 ループ ハッシュ 結合 ソートマ

    SQLパフォーマンス詳解: 開発者のためのデータベースチューニング解説書
  • SQLを実行する時、SQLに実行場所を追記する - パルカワ2

    ISUCONのPerlアプリでよく使用されているDBIx::Sunnyですが、便利な機能として、SQLがどこで実行されたかを実行されるSQLにコメントする機能があります。 こういう感じでスローログに表示されるので、どこでSQLが発行されているか探す必要がなくて便利です。 SELECT * FROM users /* lib/MyApp/Web.pm line 56 */ アプリケーションログではなく、SQL自体にコメントで入っている事が重要で、SQLを改善したい時に見るのは、アプリケーションログではなくスローログを見ます。スローログを見た時点で、どこで発行されたSQLなのかはっきりしていると無駄にそのSQLがどこで発行されたのか、探す必要がなくなり、実際に集中すべきSQLの改善に集中出来ます。というのを、Railsでもやりたかったので、ActiveRecordで作ってみました。github

    SQLを実行する時、SQLに実行場所を追記する - パルカワ2
  • Where狙いのキー、order by狙いのキー

    データモデリングの方法論について解説資料を作りました。ご意見がありましたら、お願いいたします。Twitter: https://twitter.com/hidekatsu_izuno 以下に移行します。今後はこちらがメインとなります。 https://speakerdeck.com/hidekatsu_izuno/detamoderingutekunituku

    Where狙いのキー、order by狙いのキー
  • 開発者のためのSQLパフォーマンスの全て

    前書き - インデックスの作成はなぜ開発者のタスクなのか インデックスの 内部構造 - インデックスは何に似ているか インデックス リーフノード - 二重連結リスト 検索 ツリー(Bツリー) - バランス木 遅いインデックス パートI - インデックスを遅くする2つの原因 where 句 - 検索のパフォーマンスを改善するためにインデックスを作成 等価 演算子 - 一致するキーの検索 プライマリキー - インデックスの使い方を確認 複合インデックス - 複数列に対するインデックス 遅いインデックス パートII - 前の問題点が再び 関数 - where句の 中での関数 大文字・小文字を区別する 検索 - UPPERと LOWER ユーザ定義 関数 - 関数インデックスの制限 インデックスの作り過ぎ - 冗長性の排除法 パラメータ化 クエリ - セキュリティとパフォーマンスのために 範囲 検

    開発者のためのSQLパフォーマンスの全て
  • SQLデータベースに正しインデックスを作るのは 誰の役割?

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

    SQLデータベースに正しインデックスを作るのは 誰の役割?
  • 限界までMySQLを使い尽くす!!

    どこまで出来るか?!やれるところまでやってやるぜ!!と、威勢が良いのは若い間だけの話。オトナのオトコは、攻めるときはとことん攻めるが自らの限界もわきまえて賢く振る舞うのがスマートってものである。というわけで、今日はMySQLのいろいろな限界についてまとめてみる。皆さんも是非MySQLの限界を知り、MySQLをもっとスマートに使って頂きたい。 SQL文の最大長 MySQLサーバーが実行出来るSQL文の最大長は、max_allowed_packetシステム変数で表される。max_allowed_packetの最大値は1GBである。max_allowed_packetの値はセッションごとにも設定可能なので、デフォルトではそこそこの値(16MBなど)に設定しておいて、必要に応じて大きな対を使うと良いだろう。 データベースの個数 データベースオブジェクトの個数に制限はない。データベースオブジェクトは

    限界までMySQLを使い尽くす!!
  • https://labs.cybozu.co.jp/blog/kazuho/archives/2008/06/mysql_direct_access.php

  • ウノウラボ Unoh Labs: MySQL5からのインデックス結合で1テーブル複数インデックスを使う

    GT Nitro: Car Game Drag Raceは、典型的なカーゲームではありません。これはスピード、パワー、スキル全開のカーレースゲームです。ブレーキは忘れて、これはドラッグレース、ベイビー!古典的なクラシックから未来的なビーストまで、最もクールで速い車とカーレースできます。スティックシフトをマスターし、ニトロを賢く使って競争を打ち破る必要があります。このカーレースゲームはそのリアルな物理学と素晴らしいグラフィックスであなたの心を爆発させます。これまでプレイしたことのないようなものです。 GT Nitroは、リフレックスとタイミングを試すカーレースゲームです。正しい瞬間にギアをシフトし、ガスを思い切り踏む必要があります。また、大物たちと競いつつ、車のチューニングとアップグレードも行わなければなりません。世界中で最高のドライバーと車とカーレースに挑むことになり、ドラッグレースの王冠

    ウノウラボ Unoh Labs: MySQL5からのインデックス結合で1テーブル複数インデックスを使う
  • PostgreSQL パフォーマンスチューニングまとめ - 徒然なるままにBlog

    PostgreSQLをチューニングする機会があったので その時に調べたチューニング項目を備忘録として残しておきます。 バージョンの違いやサーバの規模などによっても 効果は変わってくると思うのであくまで参考程度のものですが。 ・shared_buffers 7系では8000〜10000程度まで引き上げる 8系では150000程度まで引き上げることが可能、100000程度が性能のピーク これに多く割り当てるよりOSのバッファ領域として使う方が性能が向上する テーブルサイズを割り出して設定するのがベスト 簡単に設定するなら搭載メモリ量の1/4、搭載メモリが多ければ1/2ぐらいでも可 ・max_connections 7系では256程度、8系では1000程度が性能のピーク ・work_mem(sort_mem) 適切なサイズに調整する、2048〜4096程度 プロセス毎

  • 1