MW211 EXIT

devlog
PostgreSQL/乱数に重みをつける
2013年02月18日
ただランダムに値を取得するのではなく、頻度を分けたい場合がある。
「1」の目を多く出るようにしたい場合とかである(コンプガチャか!?)

こういう場合は、配列と組み合わせてこんな感じにできるであろう。
┌──────────────────────────────────────┐
│SELECT (ARRAY[1,1,2,3,4,5,6])[trunc(random() * 7) + 1];               →1~6│
└──────────────────────────────────────┘
これだと、「1」(はずれ?)の目の確率が他の二倍となる。
分類:PostgreSQL
PostgreSQL/乱数
2013年02月17日
乱数は「random()」で「0以上1未満」の値が取得できる。

「trunc()」(切り捨て)と組み合わせると、「0から指定した値未満まで」を取得できる。
┌──────────────────────────────────────┐
│SELECT trunc(random() * 10);                                          →0~9│
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/剰余計算
2013年02月15日
「mod()」を使う。
「mod(割られる数,割る数)」の書式だ。

試しにいろいろな数を「3」で割ってみると。
┌──────────────────────────────────────┐
│SELECT mod(-4,3);                                                       →-1│
│SELECT mod(-3,3);                                                       → 0│
│SELECT mod(-2,3);                                                       →-2│
│SELECT mod(-1,3);                                                       →-1│
│SELECT mod( 0,3);                                                       → 0│
│SELECT mod( 1,3);                                                       → 1│
│SELECT mod( 2,3);                                                       → 2│
│SELECT mod( 3,3);                                                       → 0│
│SELECT mod( 4,3);                                                       → 1│
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/ANALYZEとは(2)
2013年02月14日
で、実際の「ANALYZE」の実行について。

┌──────────────────────────────────────┐
│ANALYZE;                                                                    │
└──────────────────────────────────────┘
単なる「ANALYZE」は、全ての表を対象とする。

┌──────────────────────────────────────┐
│ANALYZE 表;                                                                 │
└──────────────────────────────────────┘
もちろん表を絞り込むことができる。

┌──────────────────────────────────────┐
│ANALYZE VERBOSE;                                                            │
└──────────────────────────────────────┘
「VERBOSE」を付けると進行状況を報告してくれる。
分類:PostgreSQL
PostgreSQL/ANALYZEとは(1)
2013年02月13日
「ANALYZE」は「統計情報」を最新に更新してくれる機能。

SQLでデータを読み込む時に、いろいろな方法がある。
目的地にたどり着くのにいろいろな経路があるようなものだ。

意識しなくても、一番最適な(最速な)経路をみつけてくれる(実行計画という)のだが、
その判断根拠となるのが、「統計情報」になる。

インプット情報が正しくなければ正しい結果は導き出せないので、
「統計情報」ってのはかなり大事だといえよう。

たいていは、「VACUUM」同様、都度、統計情報は最新に更新されるモードがとられるが、
任意で実行したい場合には「ANALYZE」を使う。

┌──────────────────────────────────────┐
│EXPLAIN SQL文;                                                              │
└──────────────────────────────────────┘
SQL文の先頭に「EXPLAIN」を付けて実行すると、実行計画が提示される。
┌──────────────────────────────────────┐
│… (cost=… rows=1234 …)                                                   │
└──────────────────────────────────────┘

さらに「EXPLAIN ANALYZE」にすると、実行計画の提示とともに
実際に実行してその見積もり(実行計画)がどうだったか教えてくれる。
┌──────────────────────────────────────┐
│EXPLAIN ANALYZE SQL文;                                                      │
└──────────────────────────────────────┘
こんな感じの結果となる。
┌──────────────────────────────────────┐
│… (cost=… rows=1234 …) (actual … rows=123456 …)                        │
└──────────────────────────────────────┘
「actual」(実際に)の後が、実際の結果だ。
見積もりでは「1234」だったのに、実際にやってみたら「123456」だった…って
見積もり大間違いじゃんというオチである。

ま、そんな時に「ANALYZE」を実行して、「統計情報」を最新にってことだ。

ちなみに、「ANALYZE」は全件調査するわけではなく、無作為抽出調査だ。
そのサンプル数を増やせば改善される場合もある。
分類:PostgreSQL
PostgreSQL/VACUUMを復習
2013年02月12日
「VACUUM」というのは簡単にいえば「お掃除係」。

┌──────────────────────────────────────┐
│VACUUM;                                                                     │
└──────────────────────────────────────┘
単なる「VACUUM」は、ゴミ領域のお掃除をしてくれるだけ。(なので排他とか関係ない)

┌──────────────────────────────────────┐
│VACUUM FULL;                                                                │
└──────────────────────────────────────┘
「VACUUM FULL」は、お掃除に加えて整理整頓をしてくれる。よって排他がかかる。
つまり、効果は大きいが、遅い・場所をとる・占有するっていう弊害がある。
やるんなら、覚悟してやるってことだね。

┌──────────────────────────────────────┐
│VACUUM 表;                                                                  │
└──────────────────────────────────────┘
表を指定すればその表だけを対象にできる。

┌──────────────────────────────────────┐
│VACUUM VERBOSE;                                                             │
└──────────────────────────────────────┘
「VERBOSE」を付けると進行状況を報告してくれる。

┌──────────────────────────────────────┐
│VACUUM ANALYZE;
└──────────────────────────────────────┘
「ANALYZE」を付けると、「ANALYZE」もやってくれる。

ん?「ANALYZE」って何だ?

ということで、次回へ続く。
分類:PostgreSQL
PostgreSQL/COPY句を使ってファイル出力
2013年02月09日
「COPY」句は、結果をファイルとして出力してくれる便利な命令。
出力先ファイルは上書されるので注意。

テーブルをバイナリファイル形式で出力する。
┌──────────────────────────────────────┐
│COPY BINARY 表 TO 'C:\表.bin';                                              │
└──────────────────────────────────────┘

テーブルをTSVファイル形式で出力する。
┌──────────────────────────────────────┐
│COPY 表 TO 'C:\表.tsv';                                                     │
└──────────────────────────────────────┘

テーブルをCSVファイル形式で出力する。
┌──────────────────────────────────────┐
│COPY 表 TO 'C:\表.csv' WITH CSV;                                            │
└──────────────────────────────────────┘

任意の区切文字を指定して出力する。(以下の例では「|」を区切文字として指定)
┌──────────────────────────────────────┐
│COPY 表 TO 'C:\表.txt' USING DELIMITERS '|';                                │
└──────────────────────────────────────┘
区切文字は1バイト文字しかダメなようです。

NULL文字を置換する。(以下の例ではNULL文字を「??」に置換するよう指定)
┌──────────────────────────────────────┐
│COPY 表 TO 'C:\表.txt' WITH NULL AS '??';                                 │
└──────────────────────────────────────┘
こちらはなんでもOKのようです。

文字コードを指定して出力する。(以下の例では「Shift_JIS」を指定)
┌──────────────────────────────────────┐
│COPY 表 TO 'C:\表.txt' WITH encoding 'SJIS';                                │
└──────────────────────────────────────┘

SQLの結果も出力できます。(っていうか、こっちが本題っぽい)
┌──────────────────────────────────────┐
│COPY (SELECT NOW()) TO 'C:\表.txt';                                         │
└──────────────────────────────────────┘
分類:PostgreSQL
IE/別タブで開く
2013年02月05日
HTMLの設定以外で、リンク先を別タブで開く方法として有名なのが
右クリックメニューから「新しいタブで開く」を選択することではないだろうか。

実は簡単に別タブで開く方法がある。

マウスの中央についている「マウスホイール」をクリックする方法だ。
たったこれだけで別タブでリンク先のページが開かれる。

しかし、既定だと、そのタブは裏タブとなってしまう。
これを表タブにする方法としては、以下の設定を変更すればよい(チェックを入れる)。
「インターネットオプション→全般(タブ)→設定ボタン
  →■新しいタブの作成時には常に新しいタブへ移動する」
分類:ブラウザ
PostgreSQL/avg()とNULL
2013年02月04日
「AVG()」は平均を計算する集合関数。
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(3)) AS "t"("c");                   →2│
└──────────────────────────────────────┘
「(1+2+3)÷3=2」となる。

では、母集団にNULLが混じっていた場合には?
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(NULL)) AS "t"("c");              →1.5│
└──────────────────────────────────────┘
NULLは無視される。で、「(1+2)÷2=1.5」となる。

ではでは、母集団がすべてNULLだった場合は?
┌──────────────────────────────────────┐
│SELECT avg("c"::numeric)                                                    │
│    FROM (VALUES (NULL),(NULL),(NULL)) AS "t"("c");                   →NULL│
└──────────────────────────────────────┘
「NULL」になる

ついでに、母集団がなかった場合には?
┌──────────────────────────────────────┐
│SELECT avg("c") FROM (VALUES (1),(2),(3)) AS "t"("c") WHERE FALSE;    →NULL│
└──────────────────────────────────────┘
これも「NULL」になる。

集合関数は、とにかく結果を一つ返して、
値を返すのが無理そうな時はNULLを返すって感じか。
分類:PostgreSQL
PHP/foreach()とexplode()とNULLと
2013年02月03日
「foreach()」で回す配列がNULLだったらNG。「foreach (NULL as $value)」

では、「explode()」を経由するんだけど、元ネタがNULLだった場合は?
┌──────────────────────────────────────┐
│foreach ((explode(',', NULL)) as $value) {                                  │
│}                                                                           │
└──────────────────────────────────────┘
こいつはOK。

「var_dump()」で「explode(',', NULL)」を探ってみると…。
┌──────────────────────────────────────┐
│array(1) { [0]=> string(0) "" }                                             │
└──────────────────────────────────────┘
ダミーの配列を作って(空文字を入れて)くれるみたいだ。
分類:PHP
前へ 1 2 3 次へ