<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kanru&#039;s 探險日誌 &#187; patch</title>
	<atom:link href="http://blog.kanru.info/archives/tag/patch/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.kanru.info</link>
	<description>當發現美好的事物時，所要做的第一件事，就是把它分享給所有人</description>
	<lastBuildDate>Sun, 23 May 2010 09:51:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Abook Tags Support</title>
		<link>http://blog.kanru.info/archives/472</link>
		<comments>http://blog.kanru.info/archives/472#comments</comments>
		<pubDate>Sun, 23 Nov 2008 13:49:30 +0000</pubDate>
		<dc:creator>kanru</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[小工具]]></category>
		<category><![CDATA[爬網探險]]></category>
		<category><![CDATA[abook]]></category>
		<category><![CDATA[mutt]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://blog.kanru.info/?p=472</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href="http://abook.sourceforge.net/">Abook</a> 是一個文字模式的通訊錄軟體，可以跟 mutt <a href="http://wiki.mutt.org/?MuttGuide/Aliases">搭配</a>使用。</p>

<p>功能很齊全，就是沒有群組的功能&#8230;<a href="http://people.debian.org.tw/~koster/misc/abook_tags.diff">這個 patch</a> 新增一個 tags 欄位，讓 abook 在搜尋的時候會搜尋 NAME, NICK, EMAIL, TAGS 四個項目，模擬群組的功能。</p>

<p>不知道若原作者看到這種 patch 會做何感想 XD</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kanru.info/archives/472/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Emesene &amp; SQL Optimization</title>
		<link>http://blog.kanru.info/archives/330</link>
		<comments>http://blog.kanru.info/archives/330#comments</comments>
		<pubDate>Wed, 17 Sep 2008 14:27:00 +0000</pubDate>
		<dc:creator>kanru</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[小工具]]></category>
		<category><![CDATA[爬網探險]]></category>
		<category><![CDATA[emesene]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[msn]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://blog.kanru.info/?p=330</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p>最近都是用 <a href="http://www.emesene.org">emesene</a> 上 MSN，不過他的啟動速度實在是非常慢，啟動的時候硬碟燈狂閃，判斷應該是在讀取聯絡人的資料快取。先用 python profiler 跑過一次，結果果然是 Logger.py 裡面從 sqlite 撈資料的函式在慢。</p>

<p>大小約 17MB 的 db，每個 query 竟然都要一秒以上，難怪 emesene 啟動要這麼久了。就來幫 emesene 最佳化一下 sql 吧。</p>

<p>以底下這個 query 為例：</p>

<p><pre lang="sql">
    select e.stamp, ue.data 
    from event e, user_event ue, user u
    where e.id = ue.id_event and
    u.id = ue.id_user and
    e.name = "status-changed" and
    u.account = "%s"
    order by e.stamp desc
    limit 1
</pre>
結果是
<pre lang="c">
1221129396.22343|NLN
CPU Time: user 1.173822 sys 0.023997
</pre></p>

<p>用 explain query plan 看看</p>

<p><pre lang="c">
    0|1|TABLE user_event AS ue
    1|0|TABLE event AS e USING PRIMARY KEY
    2|2|TABLE user AS u USING PRIMARY KEY
</pre></p>

<p>應該是先把 user_event 與 event, user 三個 table join 在一起，最後再檢查 e.name 與 u.account。</p>

<p>來看看三個 table 的大小</p>

<ul>
<li>user_event: 180801 row</li>
<li>event: 192968 row</li>
<li>user: 196 row</li>
</ul>

<p>這樣 join 起來是多大的 table 呀</p>

<p>先試試改寫 from clause 裡的順序
<pre lang="sql">
    select e.stamp, ue.data 
    from user u, event e, user_event ue
    where e.id = ue.id_event and
    u.id = ue.id_user and
    e.name = "status-changed" and
    u.account = "%s"
    order by e.stamp desc
    limit 1
</pre>
結果是
<pre lang="c">
    1221129396.22343|NLN
    CPU Time: user 0.485926 sys 0.008998
</pre>
很好，時間少了一半，explain query plan 顯示
<pre lang="c">
    0|2|TABLE user_event AS ue
    1|0|TABLE user AS u USING PRIMARY KEY
    2|1|TABLE event AS e USING PRIMARY KEY
</pre>
如果幫 user_event 建個 index 呢？
<pre lang="sql">
    create index ueiduser on user_event(id_user);
</pre>
再 query 一次
<pre lang="c">
    1221129396.22343|NLN
    CPU Time: user 0.017997 sys 0.004999
</pre>
快了非常多吧！explain query plan 顯示：
<pre lang="c">
    0|0|TABLE user AS u
    1|1|TABLE user_event AS ue WITH INDEX ueiduser
    2|2|TABLE event AS e USING PRIMARY KEY
</pre>
這是因為 sqlite 會以 from clause 的第一個當作 outer loop，所以我把數量最小的 user 移到前面，再適當的建立 index，使得 query 的速度快了 100 倍&#8230;</p>

<p>參考</p>

<ul>
<li><a href="http://www.sqlite.org/optoverview.html">http://www.sqlite.org/optoverview.html</a></li>
<li><a href="http://www.sqlite.org/cvstrac/wiki?p=QueryPlans">http://www.sqlite.org/cvstrac/wiki?p=QueryPlans</a></li>
</ul>

<p>Patch <a href="http://people.debian.org.tw/~koster/misc/emesene_sqlquery_optimization.diff">在此</a></p>

<p>Emesene svn trunk 已經收錄最新 patch <img src='http://blog.kanru.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kanru.info/archives/330/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evince Autoreload</title>
		<link>http://blog.kanru.info/archives/298</link>
		<comments>http://blog.kanru.info/archives/298#comments</comments>
		<pubDate>Sun, 15 Jun 2008 06:13:18 +0000</pubDate>
		<dc:creator>kanru</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[小工具]]></category>
		<category><![CDATA[爬網探險]]></category>
		<category><![CDATA[evince]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://blog.kanru.info/?p=298</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p>Evince 是個好用的文件瀏覽器，速度非常的快，是我平時最常用的 pdf 瀏覽器。有時候在編輯文件就會希望可以在轉成 pdf 之後，可以直接更新 Evince 內容。上網搜尋了一下，不只我有這樣的需求，而且已經有 patch 了，這個熱騰騰的 patch 是 6/12 才更新的。</p>

<p><a href="http://bugzilla.gnome.org/show_bug.cgi?id=304249">http://bugzilla.gnome.org/show_bug.cgi?id=304249</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kanru.info/archives/298/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
