kagamihogeの日記

kagamihogeの日記です。

SQL

MyBatis ThymeleafのSQL Generator

MyBatis ThymeleafのSQL生成機能であるSQL GeneratorはMyBatisとは独立して使用できる。基本的には他のO\Rマッパーと共に使用する。今回はmybatis-thymeleaf単体で使用可能な事を示すためにあえて他の依存性は何も追加せずにSQL生成のみ試す。 ソースコード…

spring-batchでJDBCのキーブレイク

背景 Javaでキーブレイク*1を意識することはあまり無い。JPAならOneToManyで自動的にコレクションにマッピングされるし、JSONやXMLでも同様である。 今回、spring-batchでO/Rをとある事情で使えずSQLを直接使用、かつ、キーブレイクが必要になった。その実現…

FlywayのdocumentationのConceptsを読んだ

https://flywaydb.org/documentation/ を読んだ。 Overview Flywayはデータベースマイグレーションをやりやすくします。 Tip: すぐに読み終えられるのでGet Startedセクションを先に目を通すことをオススメします。 Flywayはオープンソースのデータベースマ…

Flywayのチュートリアル読んだ

flyway使ってるの初めて見て良く分からん感じだったのでとりあえずチュートリアル https://flywaydb.org/getstarted/ を読んで訳した。 ※画像はすべて本家のものです。 Why database migrations? まず最初にShinyというプロジェクトを仮定し、ここでの成果物…

Spring Framework Reference Documentation 4.1.xのV. Data Access 18. Data access with JDBCをテキトーに訳した

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#jdbc をテキトーに訳した。※途中で飽きたので一部抜けあり。 18. Data access with JDBC 18.1 Introduction to Spring Framework JDBC Spring Framework JDBCの抽象化が…

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

10万件のUPDATEをマルチスレッドで分割した場合、実行時間にどのような影響があるか。実際にやってみる。 環境 DB CentOS-6.5-x86_64 Oracle Database 11g Release 2(11.2.0.1.0) Enterprise Edition Java Java SE Development Kit 8u31 Eclipse Luna(4.4.1)…

インデックスがタクサンあるときのINSERTとUPDATEの速度

一般的に、インデックスを作りすぎるとINSERTやUPDATEのパフォーマンスに影響を与えるため、よろしくないとされている。今回は実際にはどういう現象を発生させるのか、を見てみる。 やること 100列のテーブルを作り、INSERTとUPDATEの速度を、インデックス数…

UPDATEのINSERT SELECT置換から学ぶ

概要 シバタツ流! DWHチューニングの極意 第4回 SQL書き換えテクニックによると、DWHにおけるUPDATEをダイレクトパスインサートを用いたINSERT /*+ APPNED */ INTO ... SELECT ...に置き換えることで高速化を見込める、というテクニックが紹介されている。…

Oracleのビットマップインデックスのロックを学ぶ

Oracleのビットマップインデックスを学ぶ - kagamihogeのblogでは、基本的な使い方とその構造について学習した。次に、一般的な解説として、ビットマップインデックスは更新時にビットマップ全体をロックするのでオンライン向けの機能では無い、とされること…

Oracleのビットマップインデックスを学ぶ

@kagamihoge ppは基本的にOracleサイトから落とせますよ( ^ω^) 商用利用せずに個人で実験するレベルであれば、製品版と同じ物を使用できますよ☆ xeは機能制限が多くて、、、— かーりん (@curry9999) August 5, 2014 OTN開発者ライセンス付きのソフトウエア…

30 SQL Developer Tips in 30 Daysをテキトーに訳した(16~30)

30 SQL Developer Tips in 30 Daysをテキトーに訳した(1~15) - kagamihogeの日記 ↑の続きの16~30です。 30 SQL Developer Tips in 30 Days, Day 16: Comparing In-Memory Results with Autotrace まず、このTipsはversion 4.0.3以上にアップグレードして…

30 SQL Developer Tips in 30 Daysをテキトーに訳した(1~15)

http://www.thatjeffsmith.com/のaboutによるとProduct Manager for Oracle, working on the SQL Developer teamという方が主にSQL Developerについて書かれているブログがあります。詳しい経緯は不明ですがSQL DeveloerのTipsについて30日間連続で書き続け…

一回のSQLで明細・小計・総計を集計する

やりたいこと 下図のイメージのように、左側のデータを基に、右側の集計表を作りたい、とする。ポイントは、テーブル全体の販売個数だけでなく、種類ごとの小計、種類と名前ごとの小計も出力する。さらに加えて、明細行も一緒に出す、というのをやりたい。 …

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 …

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の高速化を図れる、というもの。クラスタリングとかと概念は似てるけど、機能的には別モ…

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

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

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

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

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

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

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

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

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

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

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

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

FIRST_ROWSとALL_ROWS

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

SQL Hacks ―データベースを自由自在に操るテクニック

ここ半年ほどの個人テーマはSQL再入門である。元々勉強しなおそうと決めた理由は、Oracleまわりでトラブルやっちゃったり、イマイチSQLのパフォーマンスが出ないのに悩んだりと、DBまわりで苦しむことが多い時期があった背景がある。それと同時に、RDBMSの能…

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

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