SQL⽂⾃動⽣成器による
簡潔かつ洗練度の⾼い
Data	Profilingの試み
2019-04-12	下野寿之
RDBMS⾁の会@築地
How	can	data	scientists	utilize	data?	
So	many	tables	and	columns.
Difficulties	occur	in:
Øknowing	the	meanings,
Øreading	the	documents,
Ødiscussing	with	the	clients.	
What	is	the	good	way	for	
utilizing	data	sleeping	in	
the	data	base	?	
2
▲ Many	tables,	each	entailing	many	columns	!
1. 前処理と分析の前に
データの意味理解が必要。
(DB移⾏のためにも)
2.どのような操作が必要か
探索が必要。
3.その為のDB操作で
何を抽出すれば良いかは
⾃明では無い。
Data	Profilingを容易にするには
その操作の結果の出⼒表が
1. 後で読んで意味が分かること
2. それらが整理容易なこと
3. ミスがあればすぐ分かること
が望ましい。
※ データの意味理解の作業を
「Data	Profiling」と⾔う。
素朴なSQL⽂だけでは厳しい(1)
4
8個のテーブルのレコード数の⼀覧
⼿打ちのSQL⽂で上記のようなものがすぐ⼊⼒出来るだろうか?
order	by	句が無いと出⼒は⾒にくいが、⼊⼒し忘れないだろうか?
素朴なSQL⽂だけでは厳しい(2)
5
あるテーブルから等確率にレコードをいくつか取り出す
上記は MS	SQL	Server	であり、他のDBMSだともっと簡単ではある。
(select	*	from	T	where	rand()	<	??? のようになる。)
上記は単純ランダム抽出だが、重み付きランダム抽出だと
select	*	from	T	where	rand	()	<	???	*	COL_X となる。
SQL⽂を急いで書く必要がある時に、ミス無く⼿⼊⼒が可能か??
多分無理。
SQL⽂は便利なんだが..
Ø複雑なSQL⽂を、ミス無く迅速に、
必要な時にちゃんとすぐ書けるだろうか?
Øちょっとしたこと(⾏数⼀覧,	ランダム抽出)でも
意外と、厳しいことが多い。
Ø現場で使う様なものは、さらに10倍くらい⻑い!!
Ø「データの意味を解読する」⽬的で
SQL⽂を書くと⻑⼤な⽂になる。
6
SQL⽂の
⾃動⽣成器を
作りたい!!!
⇒
DB
SQL	cmd
generator
Table
info
Column
info
Short-cutting
operations
Extracted
info Findings	before
main-analysis
Generated
SQL	cmd
Concrete
values
ü Value
formats
ü Special/err
values
ü Columns’
relations
ØMeanings
Simpler	table(s)
<- column	selecting
<- time(date)	narrowing
<- customer	narrowing
Ø Visualization
Ø Math	methods
Business	Value
by	main-analysis
Big	discovery	from	data	+	Big	business	values
Random	User	Tracking
Monetary	value	sums	
over	time,	by	areas.
Frequent	character	
string	detections
Visual	graphic	
presentation	..	
Advanced	statistical	
methods
Machine	learning	
methods
この流れ全体を可能にしたい。
そもそもDB上でデータ分析を始めると
どんな困難が発⽣するか??
Ø「網羅しがたい」という問題 :	
Ø 似た様な意味のカラムが同じテーブルに⾒つかる。
Ø 外部キーの関係にあるカラムが多数⾒つかる。
Ø 特別値として扱うべき値が次々と⾒つかる。
Ø「意味を把握することの困難」の問題 :
Ø 分析に使えるデータがどのカラムにあるのか。
Ø 合計で数百本のカラムがあるので、混同する。
8
1
DBからどんな情報を抽出すれば
良いだろうか
1. データに破損(⽋落,異常) /余分(重複,⽬的外)は無いか?
2. お互い混同しやすいテーブル/カラムは無いか?
3. 同じ符号体系のカラムの組合せ(外部キー探索)
4. 各カラムの値形式,	データ型(数値/⽇付/⽂字列)
5. 特別値がどのカラムに、どんな値で、どんな条
件で、出現するか。
6. 省略可能なテーブル/カラム/レコード
7. 同じテーブルの異カラム間の値の関係(関数従属性)
8. テーブル名とカラム名が的確な名前であるか
9. 前処理が必要か/どんな前処理が必要か? 9
2
DBから抽出する情報は
どんな条件を満たすべきか
üその情報が必要な時に取得が容易。
ü 必要な時に、その抽出⽅法が思い出しやすい。
ü 煩雑なプログラミングが不要。
ü 算出時間が合理的。
ü 抽出した情報を整理して保管することが容易。
ü 後で必要な時に、すぐに取り出せる。
ü 階層化容易(表 - シート群 - ファイル - ディレクトリ ..	)	
ü 疑義が発⽣した時にその解消が容易。
ü 不具合があれば容易に⾒つかる。
ü 再実⾏が容易。⼿の数が少ない。
ü 再現性が⾼い(ランダムシードが設定できるなど)
10
3
【DBを理解する】作業⼿順の流れ
下記を把握する/把握可能にする :
1. 全てのテーブルのそれぞれ
2. それらテーブルの各カラム[キー,特別値,..]
3. 各テーブルの異カラム間の関係[関数従属性,	⼤⼩]
4. 異なるテーブル間の関係[外部キー]
5. 同じユーザー個体の複数テーブルでの挙動
6. ⽂字列値の部分⽂字列が頻出する様⼦
11
4
取り消し線は、後述する⾃動⽣成されるSQL⽂の機能が未設計という意
味で有り、完了という意味ではありません。
何を出⼒するSQL⽂の⽣成器を作るか
以下の機能で Data	Profiling	は⼗分かもしれない.		(検証したい)
12
5
① テーブル名⼀覧からそれぞれのレコード数。
② 全カラムのcardinality,	最⼩値と最⼤値, 最頻値g個,	それらの頻度。
③ 全カラムから代表値4個:	
各列の値集合Uをある基準(先頭⽂字や⻑さ)でAとBに分けて、
Aの最⼩値と最⼤値、Bの最⼩値と最⼤値。
④ 各テーブルのランダムなレコードn個。
ただし等確率の場合と、特定の列の値に⽐例した確率による場合。
⑤ 1個のテーブルの全カラムに対して、
ある条件を満たすか否かの2通りに対して、
カラム毎の、null件数, cardinality,	最⼩値と最⼤値。
次スライド以降で上記の機能を使った場合の出⼒例を⽰す。
(1)	テーブルごとのレコード数の⼀覧
Ø テーブル名(T01〜T08)は実際は英単語2〜4個の組合せであった。
Ø テーブル名からテーブルの意味は確認しても、後で思い出す際に意外と混同
が発⽣する。(テーブル名は変更されたりもするので。)
Ø テーブル名よりも、レコード数の⽅が思い出しやすく、混同が発⽣しにくい。
Ø この出⼒表に、カラム数とバイト数をさらに付加すると、もっと実⽤的。
13
(2)	全列それぞれの値範囲,最頻値,頻度 -1
Ø 上記の表中にある値をひとつずつ、プログラミングして抽出することは可能。
Ø しかし、全部得るには⼤変な⼿間、ミスのリスク、整理の困難が発⽣する。
Ø 全部まとめて、かつ、視覚的に分かり安く整理できることが⼤きなメリット。14
(2)	全列それぞれの値範囲,最頻値,頻度 - 2
15
(3)	全列の代表値4個(最⼩,最⼤,	?,	?	)
Ø 全部のカラムのそれぞれから、
代表値4個の値を取り出して
並べる。
1. 最⼩値
2. 最⼤値
3. 先頭⽂字が最⼩の内の最⼤値
4. 先頭⽂字⾮最⼩の内の最⼩値
Ø 値の⽂字列としての形式が
出⼒表を⾒てすぐ分かる。
Ø ⾔葉で形容すると意外と⼤変。
Ø 外部キー関係にあるカラムの
組合せが⾒るだけで分かる。
Ø ほぼ網羅的に。
16
(3)	全列の代表値4個(最⼩,最⼤,	?,	?	)
17
数値符号が、のべ500列の中に現れたので、同じ意味カラム(同じ符号体系のカ
ラム)を網羅したい場合はよく発⽣する。各カラムの値集合をアルゴリズム
的にAとBに分けて、AとBのそれぞれの最⼩値と最⼤値を取り出し、異なる
カラム間で⽐較すると、容易にそれを⾒つけ出すことができる。
Idea	to	get	4	values	from	each	column
18
(1) Color	the	values	if	their	first	character	is	the	minimum	character.
(2) From	the	colored	values,	extract	the	minimum	and	the	maximum.
(3) From	the	uncolored	values,	extract	the	minimum	and	the	maximum.
(4) Those	4	values	*would*	tell	the	column	characteristic	well	J
What	is	the	good/simple	method	to	get	some	typical	values	from	a	column
if	its	data	type	is	text,	number,	date	or	whatever?
Complement:	SQL	statements.
19
①
②
特別値/異常値の探索
20
• ランダムサンプリングと⽐較せよ。
• 最⼩と最⼤の2個のみより、4個の⽅が分かり安い。
• 6個以上取り出す⽅法も試したが、効果的な⽅法はまだ⾒つからず。
(4)	ランダムにレコードを抽出 - 1	
ランダムサンプリングは、カラムの値の意味を推定するのに、使える。
Ø 年齢と、結婚ステータス(1または2)を⻩⼟⾊で着⾊。
Ø 1が配偶者有り,	2が未婚であると容易に推定できる。
(同じDBの異なるテーブルは、その1と2が逆であった。;	会員状況更新は通常何年も後であることに注意。) 21
(4)	ランダムにレコードを抽出 - 2
ランダムサンプリングは、カラムの値の意味を推定するのに、使える。
Ø 5本の⽇付カラムをあるテーブルが含んでいたとする。
Ø この5本の、同じレコード上の前後関係を⽬で⾒て推定ができる。
22
(5)	各レコードの値の条件ごとに、
全列の最⼩/最⼤値,	cardinalityなどを⾒る
23
多数のカラムを持つテーブルにおいて、あるカラムが特別値をもつ場合に、他のカラムがどのよ
うな値を持つのか⽐較するのは⼿間のかかる操作である。上記のように⼀覧にすると、この問題
が容易に解決する。
5個の集計⽅法のまとめ
① 件数⼀覧 :	
多数のテーブルの混同を阻⽌できる
② 各列(カラム)の値範囲-頻度-特性:	
多数の列の意味の把握が、ワンショットで⼤きく進む
③ 各列の代表値4個 :	
特別値と網羅的な外部キーの把握が容易
④ ランダム抽出 :	
列間の関係が容易に推測できる。(不確定性は必ず残る)
符号値の意味が容易に推論できる。
⑤ 場合分けで同じテーブルの全列の値範囲-頻度-特性 :
ある列で特別値が発⽣するレコードについて、
どんな条件が他の列で起こるとそうなるかが分かる。
24
上記の集計⼿段があれば、DBの内容について殆ど何も知らない状態から、
すぐに各テーブルや各列のことが容易に網羅的に把握出来て、分析/DB移
⾏などが容易となる。
ここから3スライド
で、提案5	個で何が
できるかを整理する
集計法5個が
可能とすること
どの【課題】を解決するかを⽰す↑
集計法5個が
可能とすること
どんな【情報】を抽出したかを⽰す↑
5個の他に考えられる集計法
Ø 各列の分位点を取り出す
Ø あるテーブルの複合キー列の候補を探索する機能
Ø 複数の値集合(様々なテーブルの様々な列)からベン図を描くような機能
Ø あるテーブルで、ある列の値が別の列の値を決定する様⼦を網
羅的に決める機能(関数従属性)
Ø あるテーブルで、複数の列の前後/⼤⼩関係を決める機能
Ø ⻑すぎる識別⼦に対して先頭から最低何⽂字あれば識別できる
か決める機能
Ø 複数のテーブルで、何⼈かの同じユーザーをDBから抽出して、
トラッキングして、テーブル間で⾒やすい形で⽐較する機能。
27
集計⽅法が多すぎると、それぞれのSQL⽂⽣成器についての、
習得困難や存在忘却のデメリットが発⽣するので、
(集計⽅法とそのSQL⽂⽣成器の)厳選が必要であることに注意。
SQL⽂の⽣成器の設計
1. サブコマンド⽅式で実装する。
→	約30個のCLIは既にある。
DBMSと機能ごとにばらばら。
サブコマンド(gitコマンドのようなインターフェース)
にすることで、存在する機能が忘れ去られないようにしたい。
2. ⽣成されたSQL⽂の出⼒表は、
`集計値’のみで無くて、
できるだけ具体例を出すようにする。
→	具体例があることで解釈が容易になり、
解釈ミスも少なくなり、
何かの不具合に気付くことが容易になる
3. DBMSごとに計算上の得意/不得意があるので
それを考慮した設計が必要である。
28
6
最後に
ØSQL DBに限らずCSV/TSV
形式のファイルに対して
も同じような処理ができ
るCLIを作ることも想定
しています。
Ø以上の資料は、未作成の
SQL⽂⾃動⽣成器の設計
です。まだその⽣成器は
作成途上です。
Ø完成したらGITHUBに上
げる予定です。
29
予備1
• レコードのランダム抽出機能は、ネイティブに
DBMSのSQL⽂の機能やプレビューの機能に含
まれて欲しいものである。
• Cf.	F.	Olken,	Random	Sampling	from	Databases,	PhD	
thesis,	University	of	California,	Berkeley,	1993.
• あるテーブルの、カラムの本数を返すSQL⽂の
関数が欲しい。
• 最⼩値n個(n>1)を抽出するSQL関数が欲しい(あり
そう)
30
予備2.
• 定性的な主張のみでなくて、定量的な論拠が欲
しい。
• ユーザーテスト可能にして、実⾏したい。
31

Sqlgen190412.pdf