Tihiroのストレスフリーな生活

少しだけ頭使って後は根性

PostgreSQLでテーブル指定でロックを調べるSELECT文

概要

テーブルの定義を変更しようとしたら、誰かがSELECT文を投げていて待たされる。そんな経験、誰もがお持ちですよね? そこでどんな処理でロックがかかっているのかが分かればストレスも多少は軽減されます。

環境

PostgreSQL 10です。

調べる

SELECT
    loc.pid
  , cls.relname
  , loc.mode
FROM
  pg_locks loc
 INNER JOIN pg_class cls
       ON loc.relation = cls.oid
WHERE
  cls.relname = 'テーブル名'

もっと調べる

pg_stat_activityと組み合わせると、そのクエリがいつから実行されているのかもわかります(どのIPアドレスから実行されているかも!)。

SELECT
    loc.pid
  , act.datname
  , cls.relname
  , loc.mode
  , act.backend_start
  , act.xact_start
  , act.query_start
  , act.query
  , act.client_addr
  , act.state
FROM
  pg_locks loc
 INNER JOIN pg_class cls
       ON loc.relation = cls.oid
 INNER JOIN pg_stat_activity act
       ON loc.pid = act.pid
WHERE
  cls.relname = 'テーブル名'

まとめ

時間がないときに限って時間がかかる。

ビンのラベルをストレスなく剥がす方法。

概要

ジャムとか調味料とかのビンに貼られているラベルをストレスなく、かつ、お金をかけずに剥がす方法の紹介。

経緯

ラベルを剥がさないとダメな状況になったので、100均で売っているシール剥がしスプレーを使ってみたけど全然剥がせなかった(失敗)。ので、色々調べたのを自分用メモがわりに記録。

観察してみる

とりあえずやる前に観察してみるとラベルは

ビン | 接着剤 | 紙 | コーティング

的な感じになっている模様。

剥がしてみる

利用するもの

作業手順

  1. ラベルのコーティング部分を剥がす(多分簡単に剥がれるはず)。
  2. 接着剤と紙部分が残っている状態になる。
  3. ティッシュペーパーにお酢を含ませて、残っている「接着剤+紙」部分を覆うように貼り付ける。
  4. 5分ほど放置(乾燥が気になるなら、さらにラップで覆うと良い感じ)。
  5. 金属ヘラでこそぎ落とす(ツルッツル!)※指をこそぎ落とさないように注意。本当に注意。

注意点

ラベルのコーティング部分の上からお酢をやっても効かなかったので、きちんとコーティング部分は剥がしておく。

感想

他にもドライヤーとかやってみたけど、全然ダメでした。というわけで匂いが気になるけど、お酢最高です。

PostgreSQLでテーブル一覧を取得する。

環境

多分、PostgreSQL 10ぐらい

取得する

テーブルと外部テーブルとパーティションテーブル(親)をSELECTする。

SELECT
    nam.nspname
  , cls.relname
  , cls.relkind
FROM
  pg_class cls
    INNER JOIN pg_namespace nam
                 ON cls.relnamespace = nam.oid
WHERE
      cls.relkind IN ( 'r', 'f', 'p' )
  AND cls.relispartition = 'f'
ORDER BY
    nam.nspname
  , cls.relname

パーティションテーブルと子テーブルをSELECTする。

SELECT
  *
FROM
  pg_class
WHERE
  relkind = 'p'
  OR relispartition = true
ORDER BY
  relname

C言語で文字列の長さを測りたい

結論

sizeofではなくてstrlenを使う。

呼び出し側

void testA() {
    testB("test_string");
}

# 呼び出され側
## OK

void testB(char* testStr) { int size = strlen(testStr); // size = 文字列の長さ(11)となる }

NG

void testB(char* testStr) {
    int size = sizeof(testStr); // size = char*のサイズ(=4)となる
}

嘆き

C言語で文字列を操作するのがとてもしんどい。

PostgreSQLで関数を確認したい。

いっつも忘れるのでメモ。

SELECT * FROM pg_proc

定義されているスキーマを知りたい場合は

SELECT * FROM pg_proc INNER JOIN pg_namespace ON pg_proc.pronamespace = pg_namespace.oid

でOK。