Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQLの駅結合度付ビュー #15

Closed
xkikeg opened this issue Dec 6, 2011 · 1 comment
Closed

SQLの駅結合度付ビュー #15

xkikeg opened this issue Dec 6, 2011 · 1 comment
Labels

Comments

@xkikeg
Copy link
Owner

xkikeg commented Dec 6, 2011

CREATE VIEW station_kilo
   AS SELECT * FROM (SELECT station.*,count(*) AS jointcount
                          FROM station NATURAL JOIN kilo GROUP BY kilo.stationid)
                      NATURAL JOIN kilo;

というViewを現在与えているが、さらにNATURAL JOIN lineしてしまったほうが多分使い勝手はいい(それほど良くなるか?というのは置いておいて。)
しかし、自分のThinkPad X40で実行した時には付け加えた時の実行時間の遅さは半端無かった。今自分の手元のマシンで試してみると一瞬で出てきたのだが、これは再考の余地があるかもしれない(例えばたまたま重いプログラムが裏で走ってたとか)。
実際に後で実機で試して見るべき。

@xkikeg
Copy link
Owner Author

xkikeg commented Dec 6, 2011

結論

  • 作ったビューに対してline.linename LIKE '東海道'とかしてしまうと実行時間がとても遅くなることが分かった。
    • ちなみにline NATURAL JOIN ...すると若干は早い(でもちょっと遅い)
  • 一方line.lineid=69のように直接路線IDで引くと早いことが分かった。

実行環境

あと、X201s(Ubuntu 11.10 oneiric)で実行するとCore i7の威力なのかSQLite3のバージョンが3.7.3から3.7.7に上がったからか、めっちゃ早い。

  • 一応実行計画読んでみたけど意味不明。
  • Pythonで実験したところX201sでは25%程度のオーバヘッドが加わる。
  • 一方T40 (Debian squeeze)ではidで引くと1秒/op.程度なのがname LIKEで11秒/op.になる。これはアーキテクチャというよりはSQLiteの実装がショボかったんではという気がしてくる。

結論としてはどうせlinenameでLIKEするうっかりさんはいるんだから最初からlineも結合しておけば便利なんじゃねという感じ。実験用のコードは下に示す。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3
import time

DB = sqlite3.connect("ares.sqlite")

def lineid():
    for i in range(100):
        cur = DB.execute(u"SELECT * FROM station_kilo NATURAL JOIN line WHERE lineid=69")
        for i in cur: pass

def linename():
    for i in range(100):
        cur = DB.execute(u"SELECT * FROM station_kilo NATURAL JOIN line WHERE linename LIKE '東海道'")
        for i in cur: pass

def get_time(function):
    begin = time.clock()
    function()
    end = time.clock()
    return end - begin

print "lineid: ", get_time(lineid), "sec"
print "linename: ", get_time(linename), "sec"

@xkikeg xkikeg closed this as completed in 553c36e Dec 6, 2011
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant