kagamihogeの日記

kagamihogeの日記です。

DB

JDBCのsetFetchSize変更時の動きをstatspackで見てみる

昔書いたJDBC経由で100万件取得・追加してみた - kagamihogeのblogでは、JDBCのjava.sql.Statement#setFetchSize(int rows)を変更するとSELECT文の実行速度が改善できる可能性があることを調べた。ここでは、なぜ速度が改善されるかを考える。やることとして…

CSVファイルを元にUPDATEする

下記のように主キーと値からなるテーブルがあるとする。 ID VALUE 1 value1 2 value2 3 value3 上記のテーブルを、下記のようなCSVファイルを入力として更新していくプログラムを考える。 1,update_value1 2,update_value2 3,update_value3 環境 DB CentOS-6…

EclipseでSQL発行するEclipse Data Source ExplorerとSQL Scrapbook

EclipseからSQL発行できるViewが存在している。SQL Developerとか使っちゃうんでほとんど使うことないんだけどメモ書き程度に使い方を書いておく。 環境 DB CentOS-6.4-x86_64 Oracle Database Express Edition 11g Release 2 Java Java SE Development Kit …

ループでinsertよりinsert selectが早い理由をstatspackで見てみる

ループでinsertを回数分だけ発行するより、insert into ... select ... の方が早い。後者はselect出来るものしか使えないので、比較対象としてはちょっと違うかもしれないけれども。逆に言えばselect出来るようにしてしまえばいいので、例えばファイル取り込…

statspack練習にコミット間隔有無で比較

statspackさわる - kagamihogeの日記でstatspackを自分の環境で手軽に試せるようになった。なので、練習がてら分かりやすくハッキリと差が出るレポートを取得して眺めてみる。やることは、10万回insertを実行するJavaのプログラムを2種類用意する。1つは、1…

Oracle SQL Developer 4.0 EA3のインストールにハマッた

SQL Developer 4.0 Downloads でOracle SQL Developer 4.0 EA3がダウンロード可能になっている。前バージョンの時(Oracle SQL Developer 4.0のインストールとややハマッた時のメモ - kagamihogeの日記)と同じくハマったので対応方法を残しておく。 環境 Wi…

OracleのPIVOTによる行列変換

PivotとUnPivotはOracle11gR1の新機能で、select文での行列変換を容易に行うことができます。 図でイメージするOracle DatabaseのSQL全集 第8回 PivotとUnPivot より抜粋 環境 Oracle Database Express Edition 11g Release 2をCentOS 6.4 x86_64上で動作 Or…

Oracleのクラスタを範囲スキャン代わりにする

Oracleのクラスタさわってみる - kagamihogeのblogの続き。Oracleのクラスタの使用例で良く見かけるのは、2つ以上のテーブルを結びつける多重クラスタが多い。ただし、別に1つのクラスタに1つのクラスタ化表しか入れなくても問題は無い。このとき受けられる…

Oracleのクラスタさわってみる

Oracle Database管理者ガイド11g リリース2 (11.2) - クラスタの概要クラスタとは、joinするデータをあらかじめ連続した領域に置いておくことでディスクI/Oを減らしjoinの高速化を図れる、というもの。クラスタリングとかと概念は似てるけど、機能的には別モ…

Oracle SQL Developer 4.0の新機能

SQL Developer 4.0 New Featuresというわけで、上記のNew Featuresをテキトーに日本語訳&試せる機能については試す。下記の、引用ブロックの上半分はSQL Developer 4.0 New Featuresをそのまま引用したもの。下半分は俺による非公式日本語訳です。おかしな…

Oracle SQL Developer 4.0のインストールとややハマッた時のメモ

Oracle SQL DeveloperでSQL Developer 4.0 Early Adopter 2 is now available.というわけで、Oracle SQL Developer 4.0がダウンロード可能になっている。新機能はSQL Developer 4.0 New Featuresのような感じ。それらを試したいところだが、インストールに若…

statspackさわる

とりあえず、stats$ナントカ表とかTop 5 Timed Eventsとかのレポートを見れるようになるところまで。なお、STATSPACK 設定手順 を見ながらやりました。 環境 Oracle Database Express Edition 11g Release 2をCentOS 6.4 x86_64上で動作 手順 インストール S…

SELECTをアスタリスクと列指定したときの速度差

SQLアンチパターン18章 インプリシットカラム(暗黙の列)では、SELECT,INSERT,UPDATEするときは、*(アスタリスク)を使わず、必要な列のみを列挙したほうが良い、といったことが書かれている。その理由については色々書かれているが、このエントリでは実行…

集計関数がメモリで処理しきれなくなったとき起きたこと

一般的にOracleなりRDBMSのパフォーマンスは、メモリでさばける量を超えると突然悪化すると言われる。その理由は、メモリで処理しきれていたものが、ディスクIOを必要とするようになるから、ということになる。よって、実際のところどの程度悪化するものなの…

Oracleのdbms_random.valueで1とmaxの間によるランダムセレクションのばらつきを調べる

OracleのSAMPLE句によるランダムセレクションのばらつきを調べる - kagamihogeのblog の続き。SQLアンチパターンのランダムセレクションのベーシックな方法のオススメとして下記のやり方が紹介されている。 1から主キーの最大値までの間の値をランダムに選択…

OracleのSAMPLE句によるランダムセレクションのばらつきを調べる

SQLアンチパターンを読んでいるのだけど、第15章 ランダムセレクションでは文字通りランダム抽出についての章がある。その章で、ベンダー依存の解決策という断り書きがされた上で、OracleのSAMPLE句を使用したやり方が紹介されている。 Oracleでは(中略)SA…

where句なしでupdateしちゃったとき

RDBMSでwhere句なしのupdate/deleteをする機会は極めて限られ、本番環境でついうっかりやってしまうと夜逃げしたくなるレベルである。しかしやっちまったものは仕方ないので、どうすれば少なくとも無かったことにする状態に出来るのかを考える。 環境 Oracle…

truncateとdeleteのちがいを使用ブロック数から見てみる

テーブル切捨てのtruncateと、条件無しでdeleteは、どちらも結果的にテーブルから全行削除される。しかし、両者の動作は異なるもので、想定される使い方も異なる。Oracleの運用ミス事例でもしばしば取り上げられる。システムはなぜダウンするのかのp.232「2…

インデックスのついた列をUPDATEしまくるとインデックスのサイズは増えまくる

インデックスをタクサン作ったときINSERT,UPDATE,DELETEは遅くなるか - kagamihogeのblog を書いたあと、下記の本をあらためて見直したところ、このような記述となっていた。 データを削除するとテーブルの行は物理的に削除されるが、インデックスの行は単に…

Oracle 11g XEのリスナーが起動しなくなった

centosにインストールしたoracle 11g xeをアンインストールしてもっかいインストールしなおしたら、リスナーが起動しなくなった。 環境 Oracle Database Express Edition 11g Release 2をCentOS 6.4 x86_64上で動作 Oracle SQL Developer 3.2 起きたこと、や…

インデックスをタクサン作ったときINSERT,UPDATE,DELETEは遅くなるか

一般に、DB運用のアドバイスとして使われないインデックスは削除すべき、とある。ディスクのムダはもとより、インデックスのメンテナンスコストの増大は性能劣化に繋がるからである。というわけで、今回はインデックスを大量に付与したとき何が起こるかを見…

Webエンジニアのための データベース技術実践入門

俺が最近RDBMS関連の勉強をしているのは、Oracleの運用で痛い目にあったからである。危機感というか、いくらなんでもDB知らなさすぎやばい、という感情に背中を押されてのことである。ところで、本書の対象読者として、既に現場で技術者として働いておりデー…

ジョインしてgroup byとgroup byをインラインビューにしてジョインの差を見たかった

SQLのパフォーマンスの本を読んでいると、なるべくジョインの回数は抑えるべし、とある。ここでは、カンタンな集計クエリを通してそのことを確認してみ……たかった。結論から書くと、下記環境でのカンタンなクエリでは差を見ることは出来なかった。 環境 Orac…

リレーショナルデータベース入門―データモデル・SQL・管理システム

RDBMSの知識不足を感じて以来、ここのところその勉強に力を入れている。学習方針は、 達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ - kagamihogeのblog等の著書のミック氏が推奨している方法で、理論と実装の両面から進めている。俺の場合、…

PCTFREE変えたときのテーブル全選択・全更新・全削除の速度

pctfree 0/10/90に変更してデータ入れて、where条件無しのselect/update/deleteを実行したときに速度差が出るか見る。 環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 Oracle SQL Developer 3.2 SQL*Plus: Release 11.2.0.2.0 Produc…

update単独の更新とループでupdateの速度

テーブルのある範囲を、別のテーブルから抜き出した結果に基づいて更新する、という処理を考える。このとき、単一のupdateのみによる処理と、カーソルで回しながら主キーに基づいてupdateを逐次実行する処理、とでどのような差が発生するかを調べる。 環境 O…

ネステッドループジョインと反復連結

反復連結(Loop query)という単語はデータベースパフォーマンスアップの教科書 基本原理編から借りたもの。これは、JOINを使うのではなく、手続き的にテーブル間を連結するもの。親テーブルをフェッチしながら、子テーブルにキーで順次アクセスするやり方の…

インデックス範囲スキャンとフルテーブルスキャンの損益分岐点

損益分岐点というたとえが正確かどうかはわからないが。範囲検索がある一定以上になると、インデックスよりもフルスキャンのほうが速くなるポイントがある。というわけで、それはどのへんにあるのかをやってみる。やることとしては、連番の数値と文字列の2列…

Oracleで適当な件数のテストデータつくる

Oracle勉強していて何気に面倒なのが、テキトーな件数のレコードを持つテーブルを作ること。ので、いままでに自分の知ることが出来た範囲でやり方をメモしていく。 環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 Oracle SQL Develop…

ORACLEハイパフォーマンスチューニングSQL編

2002年発行と今となって古い本であり、9iが一番新しいバージョンという想定で書かれているのでさすがに古さが否めない。RBOへの言及が多かったり、FREELISTSとか、hash_area_sizeとか、11gではメモリ管理なり記憶域管理なりだいぶ変わっているのでその辺は適…