kagamihogeの日記

kagamihogeの日記です。

Oracle

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ではメモリ管理なり記憶域管理なりだいぶ変わっているのでその辺は適…

整合性制約の有無によるUPDATEの速度差

整合性制約の有無によるINSERTの速度差 - kagamihogeのblogの続き。整合性制約の有無でUPDATEに速度差が生じるかを確認する。検証する制約は、主キー・チェック・外部キー。制約を付与してからUPDATEするのと、UPDATEしてから制約を付与するのとで、UPDATEの…

整合性制約の有無によるINSERTの速度差

(略)次のような場合は、パフォーマンス上の理由から、表の整合性制約を一時的に使用禁止にすることを検討してください。 ・表に大量のデータをロードする場合 ・表に大規模な変更を加えるバッチ操作を実行する場合(たとえば、既存の番号に1000を加えてすべ…

表の行順序とインデックス範囲スキャン

リレーショナルデータベースは論理レベルではテーブルの行順序は重要では無い。しかし、物理レベルではディスクなど順序が重要な意味を持つ媒体に格納されるのが現実である。このエントリでは、表の行の格納順序を昇順orランダムにし、それにインデックスを…

INSERT10万件をマルチスレッドで分割

20130426 追記 実行時間の計測方法がおかしかったので書き直しOracle内部の処理が並列になるパラレルクエリ等はともかく、Oracleの外部から与える複数のINSERTを分割しても意味は無い気がするが、実際にどうなるかやってみる。 環境 jdk1.7.0_17 Eclipse 4.2…

SQL*Loaderで1億件(1.6GB)ロードしてみる

ここんとこSQL*Loaderで遊んでるんで、もうちょい大きいデータファイルでもロードしてみるか、ってだけのエントリです。 環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 SQL*Loaderを起動するクライアントと、Oracle Databaseは物理…

SQL*Loaderで大きい表に少量データロードするときの速度

Oracle Databaseユーティリティ11g リリース1(11.1)11 従来型パス・ロードおよびダイレクト・パス・ロードの「従来型パスを使用する場合」には、ダイレクトパスロードよりも従来型INSERTを用いた方がよいケースについての記述がある。 従来型パスを使用す…

SQL*Loader入力ファイルのソート順による実行速度とインデックスへの影響

SQL*Loaderの従来型INSERTモードを使用してインデックスが有効なテーブルへデータをロードするとき、入力ファイルがソートされているかいないかがどのような影響を及ぼすのかを確認する。 環境 Oracle Database Express Edition 11g Release 2をWindows上で…

データベースパフォーマンスアップの教科書 基本原理編

最初はOracle Databaseの実行計画の見方良くわからなんな、というのが出発点だった。ぐぐってると@IT:Databaseフォーラム全記事インデックス - Oracle SQLチューニング講座をオススメしてる人がいて、まずこれを読んだ。読んだが、もうちょっと根本的なと…

SQL*Loaderリファレンスのダイレクト・パス・ロードのパフォーマンスの最適化に書いてあることやる

Oracle Databaseユーティリティ11g リリース1(11.1)11 従来型パス・ロードおよびダイレクト・パス・ロードに、ダイレクト・パス・ロードのパフォーマンスの最適化という項目がある。OracleとSQL*Loaderの勉強ということで、ここに書いてある方法を試してい…

SQL*Loaderさわる

SQL*Loaderマッタク使ったことないんで、とりあえず使ってみる。参考: Oracle Databaseユーティリティ11g リリース1(11.1)第II部 SQL*Loader 環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 Oracle SQL Developer 3.2 準備 下記の…

NOLOGGING有無によるダイレクトパスインサートの速度の差

Oracleは、NOLOGGINGを指定することでREDOログを抑制する結果としてINSERT等の速度を改善することが出来る……らしい。今回はその辺を実際にやってみることにする。参考URL: Oracle Database管理者ガイド 11g リリース2 (11.2) REDOレコードの書込みの制御 Or…

APPEND_VALUESの間違った使い方をしてみる

Oracleにはダイレクト・パス・インサートというINSERTを高速に行う機能がある。それを指示するためのオプティマイザ用のヒントは2種類あり、APPENDとAPPEND_VALUESとがある。文法上の違いだけを見ると、APPENDはINSERT 〜 SELECTに使うもので、APPEND_VALUES…

マルチテーブル・インサートで同一テーブルに複数データ挿入してみる

Oracleには、マルチテーブル・インサートという単一のINSERT文で複数のテーブルに挿入できる機能がある。参考: INSERT - Oracle Database SQL言語リファレンス 11gリリース2(11.2) SQLクリニック(12):1つのSQL文で複数の表にINSERTする絶品テクニック (1…

サブクエリの条件が悪くメインクエリがフルスキャンになる

環境 Oracle Database Express Edition 11g Release 2をWindows上で動作 起きたこととか 下記のようなSQLを実行したところ、ちょっと表現が難しいくらい猛烈な実行時間がかかってしまった。 UPDATE BILLING B SET AMOUNT = 0 WHERE B.BILLING_ID = (SELECT O…

10万件INSERTを1件ずつコミットと1回だけコミットしたときの速度比較してみた

これまたやる前から結果分かってることなんですが。ループでINSERT文を発行する処理を想定したとして、commitをループの1件ごとにするときと、ループ終了後に1回だけするとき、とではどのくらい速度に差が出るものなのかをやってみる。 環境 jdk1.7.0_17 Ecl…

SQL Developerのインポート機能でken_all.csvを読み込んでみる

SQL Developerのインポート機能を使用してファイルをテーブルにインポートする場合、その方法をいくつかの選択肢の中から選ぶことが出来る。どれも最終的にはテーブルが作られて*1、そのテーブルにSELECT文などのSQLでアクセス可能になる。ただし、どの方法…

Oracleの外部表でken_all.csvを読み込んでみる

外部表 - オラクル・Oracleをマスターするための基本と仕組みOracleの外部表という機能の存在を知ったので、試しに使ってみる。適当なcsvファイルということで、郵便番号データダウンロード - 日本郵便からダウンロードできる、住所の郵便番号一覧であるken_…

Oracleのシーケンス・採番テーブル・MAX+1

20130426 追記 実行時間の計測方法がおかしかったので書き直しあるテーブルの列に連番が欲しいとき、Oracleではシーケンス(順序とかSEQUENCEとか)を使うのが定番。採番テーブルでも同様に連番を作れるが、シーケンスを使うのが定石と言われている。その理…

SQL Developerの表作成機能についてのメモ

CREATE TABLEのGUI。プロジェクトなどによってはテーブル定義書からSQLを生成するマクロであったり何らかのツール使って生成するのだけど、そういうのが無かったり個人の実験用途でテキトーにテーブルをこさえたいときは、文法の細かいとこまで覚えてなかっ…

FIRST_ROWSとALL_ROWS

ALL_ROWS 最高のスループットとなるように最適化される(全表スキャン、ソート/マージ結合が選択されやすくなる) FIRST_ROWS(n) レスポンスタイムを最短にするように最適化される(索引スキャンとネステッド・ループ結合が選択されやすくなる)Oracle SQL…

TimesTenにSQL Developerから接続する

環境 TimesTen 11.2.2.4.1 for Windows (32-bit) Winsows XP (クライアント・サーバ両方とも同じ) Oracle SQL Developer 3.2 やったこと TimesTenのインストール まずTimesTenをサーバ側となるWindowsマシンにインストール。インストーラにしたがってポチポ…

SQL Developerの簡易的なデータベース監視機能

SQL Developerは、本来的には開発向けのツールである。ただ、簡易ながらDB監視の、どちらかといえば運用向けの機能も備えている。といっても、V$系のビューを多少見やすくしたGUIといったところで、さすがにEnterprise Managerなどには遠く及ばないのだけど…

CHARとVARCHAR2を比較するときCHARがサイズ分の長さがないときどうなるか

CHARとVARCHAR2を比較するときは下記のサイトにあるようなことに注意する必要がある。 CHAR と VARCHAR2 の違い - オラクル・Oracleをマスターするための基本と仕組みところで上のサイトなど非空白埋め比較セマンティクスを紹介しているところでは、CHARがそ…

パフォーマンス改善と事前対策に役立つ Oracle SQLチューニング

OracleのSQLのパフォーマンスチューニングと聞いてどのような印象を受けるだろうか。割とDBにチャランポランな俺のイメージでは、Oracleを知り尽くした玄人が固有の黒魔術的なパラメータをあれこれいじると不思議と性能が改善するという、中々に脳内お花畑な…

Oracleのデータベース変更通知

JDBCドライバでは、SQL問合せをデータベースに登録して、次のイベントの発生時に通知を受け取ることができます。問合せに関連付けられたオブジェクトに対するDMLまたはDDL変更。結果セットに影響を与えるDMLまたはDDL変更。Oracle Database JDBC開発者ガイド…