データベース

SQLもテストする

プログラムはテストするのに、SQLはテストしないことが多い。 様々なパターンのデータを登録し、SQLを検証したほうがよい。

バッチ処理における排他制御の戦略について

バッチ処理はユーザ画面が存在しないので、排他制御の戦略がオンライン処理と異なってきます。 まず、大量のデータを参照、更新するので通常は表ロックが前提です。 また、集計処理を行う場合は、途中で更新処理が入って集計結果が変わってしまうことを防ぐ…

アプリケーションレベルでのトランザクション制御について

アプリケーションレベルでのトランザクション制御には、楽観的排他制御と悲観的排他制御があります。 悲観的排他制御について データを参照した時点で、その後に行う更新までをロックする。 たとえば、登録画面=>プレビュー画面=>登録結果画面という画面の流…

ダーティリード、ファントムリード、ファジーリード

以下のページが詳しい http://www.interdb.jp/techinfo/postgresql/p-2-07.html自分なりの理解 ダーティリード トランザクションAがcommitする前のデータを、トランザクションBが読み込んでしまう。トランザクションAがロールバックした場合、トランザクショ…

マスター系テーブルにuniq制約はつけない

uniq制約は便利であるが、反面問題点もある。 例えば、商品コード、商品名(uniq制約)、削除フラグで構成される商品テーブルがあるとする。 新規に商品情報を商品テーブルに登録する際に、論理的に削除されたレコードの商品名と重複する場合、レコードが追加…

マスター系テーブルのレコードは物理削除してはいけない。

商品テーブルや社員テーブルのような系統のテーブルをマスター系テーブルといい、 明細テーブルなどをトランザクション系テーブルという。マスター系テーブルを削除する場合、レコードをdelete文で物理削除するのではなく、削除フラグを更新するようにして論…

正しいwhere句の指定の仕方について

インデックスを使っているカラムについて、where句で!=を使った場合インデックスは無効になるらしい。

セレクティビティについて

カラムにおける、ある値の占める割合が大きいことをセレクティビティが高いといい、逆をセレクティビティが低いという。 セレクティビティが高い値を検索する場合、インデックスを使う意味はあまりないらしい。

RDBMSの実行計画の方式について

RDBMSの実行計画の方式は、大きく分けて以下の2つがある。 1)「ルールベース」方式 2)「コストベース」方式ルールベース方式が主流の頃は、SQLをいかに上手に書くかということが重要でしたが、コストベース方式が主流になるにつれて高速なSQLをひねりだ…

テーブルの結合方法3つ

テーブルの結合方法には以下の3つがある。 1)ネステッドループ結合 2)ノートマージ結合 3)ハッシュ結合 ネステッドループ結合 総当り方式の結合方式 プログラムにするとループの中にループを入れ込んだような仕組みだからネステッドループとよぶのかも。 ソ…

インデックスの欠点について

インデックスには以下の欠点がある。 インデックス自身のデータを格納するためのディスク容量が必要となる。 更新性能が落ちる。(本テーブルだけでなく、インデックスも更新する必要があるため。)

SQLの最適な実行計画

インデックスの有無やデータの偏りによって実行効率は大幅に変わってくる。つまりSQLの最適な実行計画はこれらを考慮して作成される。

RDBMSの仕組み

RDBMSの中身(ORACLEの場合。ただし他のRDBMSも似た仕組みを持つ。)は、以下のようになっている。 パーサー => クエリートランスフォーマー => エスティメーター => プランジェネレータ パーサー SQLの文法チェック、ユーザがテーブルに対してアクセス権限を…

トランザクションのACID特性について

トランザクションは、ACID特性を満たしていないといけない。

テーブル名について

2chから抜粋 899 名前: NAME IS NULL [sage] 投稿日: 2008/07/15(火) 23:23:05 ID:??? テーブル名について質問です。 以下のような3つのテーブルを作っています。 □会社テーブル ・会社コード ・会社名 □所属テーブル ・所属コード ・所属名 □会社and所属…

検索パターンは3つ 全表検索、インデックス範囲検索、インデックスユニーク検索 テーブル結合方法 ネステッドループ、ハッシュ結合、マージ結合 データベースの中身の仕組み パーサで構文解析 クエリートランスフォーマーでSQLの最適化 エスティメータで実…

サロゲートキー

テーブルの主キーのことであるが、ビジネス上の意味をもたないもの。代替キーともいうらしい。

where句に計算式は使えない。

オラクルだけの話かもしれないけど、where句に計算式は使えないらしい。 計算式を使いたい場合は、from句の中のselect句の中で計算式を別名として定義した後、 where句でその別名を指定すればよいらしい。

SQLの副問い合わせについて

副問い合わせで1つの値を算出する使い方の場合,その結果が2つ以上であると実行時にエラーになるので要注意。

SUMやAVGなどの集約関数ではNULLは無視される。

集約関数(SUM、AVG、COUNT)ではNULL値のレコードは無視される。 NULLは0に置き換える(オラクルならNVL、MySQLならcaseを利用)などしてから、 集約関数に渡すようにしないと予想外の結果になったりする。でも、SUMで問題おきたりすることはないのかも。あと…

コネクションプールについて

イメージとしては、接続のたびに生成されるスレッドを最初から生成しておき、 使いまわすという感じらしい。MySQLでは新規接続もともとはやいから意味ないらしいけど、 オラクルだと、新規接続0.1秒かかったりするので、コネクションプール必須らしい。

カラムのネーミングについて

2chから引用 61 :NAME IS NULL:2007/02/25(日) 13:58:00 ID:6/IGUhkO 一つ間違って欲しくないのはSQLを書きやすくするためのテーブル設計をしてはだめ。 CUSTOMERS.NAMEが得意先名の方が自然だろ。 得意先名というのは得意先の名前であって得意先の得意先…

複合インデックスの場合、インデックス内のカラムの指定順番が重要

複合インデックスは、複数のカラムを検索条件として使用する場合に利用する。 a,b二つのカラムがあり、複合インデックスとして登録されているとする。 検索条件に、複合インデックスの先頭カラムとして指定されているaが含まれない場合、 インデックスは使用…

副問い合わせについて

副問い合わせについて 以下のSQLで括弧にあたる部分が副問い合わせというらしい。 select * from hoge where id = (select id from foo where id = 2); 副問い合わせの結果は上記のようにwhere句に=を使っている場合、一件でないとエラーになる。 メリット …

テーブルの種類

トランザクション系テーブル 毎日登録、更新されるような更新頻度の高いテーブル。売り上げ明細テーブルのようなものが該当する。 マスタ系テーブル 1度データを登録すると、滅多に登録、更新を行わないようなテーブル。社員テーブルなどが該当する。

候補キー

いまいち何のことだかよくわからない。 主キーに似たようなものらしいのだが。。

indexのデメリットについて

まず、indexのデータを格納する領域が必要なので、余分にディスク容量がいるのだと思ふ。 あと、書き込みの際は、通常のテーブルの書き込みの他にindexも書き込む必要があるので、書き込み速度が遅くなると思われる。 なので、書き込みが頻繁に発生するよう…

正規系の種類 第1正規系 導出属性の排除 単価、数量、合計というカラムがある場合、合計に関しては単価と数量から求めることができるが、このような属性を導出属性というらしい。 繰り返し項目の排除 ひとつのレコードとして、データを配列で持っている状態…

RDBMSをブラックボックスにしない http://itpro.nikkeibp.co.jp/article/COLUMN/20070918/282210/?ST=middleware更新処理とトランザクション編の第四回のROLLBACK〜はよんだ。

勉強になりそうなリンク集

暇があればよんでおきたい。http://www.atmarkit.co.jp/channel/dbnovice/dbnovice.html http://www.atmarkit.co.jp/channel/channel_index.html#db http://www.atmarkit.co.jp/channel/dbnovice/dbnovice.html http://allabout.co.jp/internet/database/clo…