[SQLite] SQLiteで実行計画を見てみよう その2

テーブルをもう1つ作成

[SQLite] SQLiteで実行計画を見てみよう その1では結合もサブクエリもないSQLだったので、selectid,order,fromがすべて0の実行計画だった。
テーブルを結合した時の実行計画はどうなるだろうか?

まずはもう1つのテーブルTest2を作成しておく。
$ cat create_table2.sql
create table if not exists Test2
  ( id integer primary key
  , name text
  , last_modified text
  );

create index if not exists idx_Test2_name on Test2
  ( name
  );
$ paste -d, \
  <(seq 10000) \
  <(LC_CTYPE=C tr -dc 'A-Za-z0-9' </dev/urandom |
    fold -w8 | head -n10000) \
  <(LC_CTYPE=C tr -dc '0-9' </dev/urandom |
    fold -w10 | sed -e 's/^0*//' |
    awk '$1<1497711600{ print $1 }' | head -n10000 |
    sed -e 's/^/@/' | date -f- '+%Y-%m-%d %T') \
  >Test2.csv

[SQLite] SQLiteで実行計画を見てみよう その1

テーブル作成とデータ投入

[unix] シェルを使って、テストデータ生成でテストデータを作ったので、SQLiteにデータを投入してみよう。

まずはテーブルのDDLを作成する。
$ cat create_table.sql
create table if not exists Test1
  ( id integer primary key
  , name text
  , last_modified text
  );

create index if not exists idx_Test1_name on Test1
  ( name
  );

[unix] シェルを使って、テストデータ生成

[シェルスクリプト]ランダムな数値では乱数の生成をしたけど、改めてシェルを使ってのテストデータ生成を考えてみよう。
できるだけ、デフォルトでありそうなコマンドかつ移植性のありそうな方法で。

同じ文字列の繰り返し

同じデータを繰り返し生成する場合はyesコマンドに文字列を渡して、headで行数を指定しよう。
$ yes ABCDE | head -n5
ABCDE
ABCDE
ABCDE
ABCDE
ABCDE

[awk] awkでカラム方向の計算

tr -s ' ' '\n'

前回は以下のようなコマンドでcalコマンドの結果を行方向に変換した。
$ cal | tr -s ' ' '\n' | 
awk 'NR==2 { mm = $1 } NR==3 { yy = $1 } NR>10 { print mm,$1,yy }'

これはawkの中で行毎にカラム数分ループさせるのがかっこ悪いなあと思ったので、事前に tr でデータの並びを行方向に展開する方法を取っていた。

でも、これって本当に効率がいいんだろうか。
ひょっとして、awkの中でループした方が速いんじゃないだろうか。

[unix] dateコマンド違い

ある月の土日の日付を列挙するスクリプトを作っている時に、dateコマンドの挙動がOSによってかなり違うことに気づいた。

Mac(BSD) date

最初にMac(BSD)で実行する例。
$ cal | tr -s ' ' '\n' | 
awk 'NR==2 { mm = $1 } NR==3 { yy = $1 } NR>10 { print mm,$1,yy }' | 
xargs -I{} date -j -f '%B %d %Y' {} '+%Y/%m/%d(%a)' | 
grep [土日]
2017/06/03(土)
2017/06/04(日)
2017/06/10(土)
2017/06/11(日)
2017/06/17(土)
2017/06/18(日)
2017/06/24(土)
2017/06/25(日)