理系学生日記

おまえはいつまで学生気分なのか

db

PostgreSQLにおけるCOLLATIONとソート

PostgreSQLを使っているとき、日本語がうまくソートできない。これはいわゆるCOLLATION (照合順序)の設定によります。 色々とこの順番を設定できるため、今回その設定を試してみました。 基礎知識 Postgresqlでは、それぞれのデータタイプはcollationを持っ…

機密情報を参照させないPostgreSQLのカラムレベル権限設定

本番環境のシステム運用を考えたとき、データベースの中身を参照せざるを得ないことは多くあります。 データは貴重な情報資産であるため、運用者に対してすら、そのデータ参照を厳しく制限せねばなりません。 例えば要配慮個人情報を運用者に対して簡単に参…

マルチテナントデータを安全に扱うための Row Level Security、そして1ユーザーが複数のテナントに所属するときの対応について

このエントリでは、マルチテナントアプリケーションを構築する場合に、テナントに紐づくデータをどう安全に扱うかという点でRLSについて記載します。 特に、1ユーザが複数テナントに関する権限を持つ場合にRLSをどう適用すべきか、頭を悩ませました。 マルチ…

Postgresqlに対するアプリケーション用DBユーザーの作成と権限

データストアにPostgresqlを採用し、アプリケーションから当該DBに対してDB接続する。そういうユースケースは枚挙に暇がありません。 データベース・スキーマの作成 アプリケーション用ユーザーの作成 ユーザーのデフォルトスキーマ切り替え ユーザーへの権…

PostgreSQLの論理バックアップ時に使用するpg_dumpの基本的な使い方

db

pd_dump は、PostgreSQL のデータバックアップを取得するためのコマンドラインツールです。 どういう形でバックアップするのかは、まずは実例を見て頂けるとわかりやすい。 $ pg_dump -h 127.0.0.1 -U postgres dvdrental | less -- -- PostgreSQL database …

PostgreSQLのサンプルデータを簡単につくる

db

PostgreSQL で遊ぶときのテストデータを簡単につくりましょうという話です。 PostgreSQL にはDocker 公式のイメージがあるので、それを立ち上げればまずは PostgreSQL 環境はできあがりです。 $ docker run --name postgres -d -p 5432:5432 postgres:9.6.1 …

MHA (mysql-master-ha) Manager の信頼性

MHA を検証する、という話で最初に「どうしよう」と思ったのは MHA Manager をどこに置き、どう信頼性を確保するか、という点だった。 MHA Manager 自身は、MySQL のサービスには一切介在しないので、MHA Manager が例え落ちていたところでサービス影響はな…

mysql-master-ha (MHA) まとめ

諸々の事情により MHA を検証・導入しようという流れがあり、イマイチまだ全体像が見えていないのでまとめてみた。 **MHA とは MySQL のマスタを failover させスレーブをマスタに昇格させるという面倒な作業を短時間(10-30 秒と言われている)で行わせること…

Query Transformation と OR-expansion

db

もろもろ悲しい目にあったので、もろもろまとめないといけないという使命感に駆られています。 Oracle Database に限らず DBMS というのは、SQL をいかに速く実行したろかと粘着しまくるようにできていて、アクセスパス解析だったりを駆使しまくります。その…

SQLアンチパターン

読んだ。 ISBN:978-4-87311-589-4:detailタイトルに珍しい感じの題がつけられてるけど、"SQL クックブック"とか、"SQL ベストプラクティス" みたいな内容だった。 書籍の構成としては、 I 部:データベース論理設計のアンチパターン II 部:データベース物理…

AskTom の Tom

db

Oracle の仕組みマジメに調べてたらよく Ask Tom っていうサイトが引っ掛かる。 Ask Tom Home謎のQAサイトここの Q&A を読み込むと分かるんだけど、Answer してる Tom、異常に Oracle の内部構造に詳しい。 一方で、Q&A と言ったら「教えて!goo」とか「Yaho…

Oracle における共有プール分割について

db

導入 Oralce の SGA には共有プールの領域がある。共有プールと言っても、実態はメモリ領域であり、その中には色んな要素が格納される。親・子カーソルはその一例だし、SQL Text や、オブジェクトの情報、PL/SQL の情報など、本当に多岐に渡る。 ポイントは …

同時接続数を増加させる際のメモリ見積り方法

db

Oracle に同時接続できるユーザプロセス数の最大数は processes という初期化パラメータによって制御されるのだけれど、これを増やす段になって気をつけないとならないのが「増やすことによる弊害」だと思う。 processes を増やすということは、DB サーバか…

ヒストグラム統計と bind peek と CURSOR_SHARING について

db

このエントリでは、Oracle DB についての挙動理解の整理をしたいとおもいます。 ヒストグラム統計 SQL の実行計画を作成するのはオプティマイザであるわけですが、Oracle のオプティマイザが実行計画を立てるとき、基本的には列値は一様分布に従うという仮定…

シーケンスオブジェクトの現在値を変更する方法

db

Oracle にはシーケンスオブジェクトというものがあって、これを使えばシステムグローバルなシーケンス値が取得できます。 順序疑似列 この値を使って主キーを生成するとかよくあるパターンですね。 select sequence_name.nextval from dual; -- これを連続で…

SQL にはバインド変数をちゃんと使いましょうという話

db

先に断っておくと、Oracle ベースの話。 SQL インジェクション云々の問題を除いても、実行する SQL にはバインド変数を使うのが正しい、という命題は OLTP に限っていえばほぼ真と言って良いと思う。ここで "限って"という限定を用いているのは、一部にはバ…

Oracle の統計情報更新ジョブの起動時刻を移動させる

db

Oracle は 10 g 以降、基本的には CBO (Cost Base Optimizer) で実行計画を定めるようになる。では、何を基準としてコストを図るのかというとそれは統計情報で、Oracle のデフォルトだと、統計情報収集ジョブが日夜統計情報を収集・更新するという動作になっ…

同じ問合せブロックが複数出現するときは with 句 使えばいいのでは

db

1 つの SQL に同じ問い合わせブロックが何度も何度も出現するときは、それを出現回数分 DBMS に検索させるのマジでムダだしパフォーマンス悪くなるから、with 文で一時的なビューを作るようにした方がいいです。 以下は、Oracle の公式ドキュメントに記載さ…

逆キー索引についてのまとめ

db

時刻をキーとしているログテーブルを insert するロジックを組んでいるケースで、このログテーブルにバースト的な insert が走ると、パフォーマンスが悪化するという事象が散見されました。 調査した結果、インデックス競合によって後段の insert が待ちにな…

SQL クックブック

猛烈に忙しかった仕事も若干落ち着いてきて、久しぶりに土日はゆっくり休養することができたので、積んでたこの本を読んだりしました。ISBN:978-4-87311-315-9:detailクックブックといえば、現実的にそんなことしねーだろ的なレシピがあることで有名ですが、…

Oracle でのページング

db

RMI でスレッド起動されるロジックにおいて、数十万程度の処理対象レコードを DB から一度に読みこむ形でプログラムを実装してたのだけれど、あんまり RMI が呼ばれすぎるとメモリが枯渇してヤベーみたいな話になったので、ページングさせて小分けに処理する…

sqlite でテーブルの主キーを変更する方法は?

db

CDTV のランキングデータを DB に突っ込むバッチ的プログラムを走らせておりましたところ、主キー制約違反でバッチが死にました。 元凶は 2010/08/07 付のランキングで、92 位がなぜか 2 つある。 ランキング用テーブルの主キーは日付 + 順位だったので、同…

SQL 実行の高速化

db

SQL を実行する際は、SQL 実行用のバッファが確保された後、解析処理が行われる。解析にはハード解析とソフト解析があり、解析済みの SQL に対しては負荷の低いソフト解析が用いられる。両者の大きな違いは、ハード解析ではオブジェクトの定義チェック、オブ…

RAC

RAC (Oracle Real Application Clusters) は Shared Disk、Active/Active 構成のクラスタ。構成するには 2 台以上のノード、アプリケーションとの通信用のパブリック、ノード間通信用のプライベート(インターコネクト)、共有ディスクが必要。RAC 上の各イン…

相関サブクエリって FROM 句には使えないんですね

db

相関サブクエリというと、内部クエリから外部クエリのテーブル(カラム)を参照するってヤツで、みなさん毎日相関サブクエリのことばかり考えていらっしゃることでしょうけど、そういうのキモいかもしれないからよくかんがえたほうがいいです。 ちなみにですけ…

Oracle の実行計画が振れてしまう

db

数百万レコードを含むテーブルをいくつか JOIN する SELECT 文が数十分かかっても返ってこないという事象が時々発生する。bind 変数の値以外は同じ SQL を流しても、遅いときと早いときがあり、ちょっとした問題になる。 実行計画を見る限りでは、遅いときと…

MySQL (Mac) の README に書かれていること

db

MySQL の Mac 用バイナリをインストールしたのですが、README に書いてあることを忘れそうだったので、ここにメモしておきます。 全文訳しているわけではなく、必要かもしれないと思ったところだけなので。 インストール場所 インストールされるのは、/usr/l…

Berkeley DB

db

subversion ではデータストアとして Berkeley DB (BDB),FSFS のどっちかを選べるそうですが,何が違うんだろうと思いました. wikipedia を読みますと,Berkeley DB についてこんなことが書いてあります. Berkeley DB - Wikipedia> より発展したアプリケー…