« PostgreSQLへ....その3 | メイン | 最近のコメントのOrder順について »
PostgreSQLへ...その4??
2004年08月12日

無事移行も完了して、やれやれ....っと思っていたのに。

ふとみたメイン画面、

「なんだかおかしい....」

『最近のコメント』に表示されている内容が古い順のようです。

もしかしたら、auto_increment@mySQLからsequence@PostgreSQLへ移行したのでそのせいかしら??

と思って、チェックしてみたけれど両者相違なし。

comment_idとcomment_created_on(コメントされた日時)はすべて一致していました。

あとはMain Indexテンプレート中の「最近のコメント」部分、
<MTEntries recently_commented_on="5" sort_order="ascend">
の"ascend"の部分を"descend"にしてみたりしたけれど、駄目でした。

仕方ない、何が原因かわからないので、とりあえずは仲介したBerkeleyDBで見てみました。
結果はOKです。
きちんと表示されました。

っというコトは、問題があるのはPostgreSQLの環境のみということになります。

もしかしたら、テーブルを結合して、ORDERを取るけれど、その時になにか間違えている??

=======

コメントをいただいた通り、この件は認知されているようで、パッチを配布してくださっている方もいらっしゃるようです。

ただ、アプリケーションエンジニアな私としては、SQLを理解しないと気がすまない。

MovableTypeのソースはちんぷんかんぷんですが、とりあえず、途中のsqlを吐かせるようにして、中身をチェックしてみました。

recently_commentを作成するためのSQLは2つ。
エントリーを求めるであろうメインカーソルと、エントリーからそれに属するコメントを求めるサブカーソルのふたつです。
#一気に求めたほうがクエリ的には速いはずなのですが、SQLの組み立て自体が標準化のようになっていて、個々のクエリに対して最適化されていないようです。

そのうちのひとつ、エントリーを求めるクエリに問題があることがわかりました。
MovableTypeが生成したクエリは下記のとおりです。
(みやすくするために、改行を入れています。長くてごめんなさい。)

select distinct
entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by
from
(
select
entry_id,
entry_blog_id,
entry_status,
entry_author_id,
entry_allow_comments,
entry_title,
entry_excerpt,
entry_text,
entry_text_more,
entry_convert_breaks,
entry_to_ping_urls,
entry_pinged_urls,
entry_allow_pings,
entry_keywords,
entry_tangent_cache,
entry_basename,
entry_category_id,
entry_created_on,
entry_created_by,
entry_modified_on,
entry_modified_by,
comment_created_on
from mt_entry,
mt_comment
where 1 = 1
and entry_id = comment_entry_id
order by comment_created_on desc
) t
limit 5

Fromの中にさらにSELECTがあって、そのSELECT中にORDER句がありますが、
これは意味をなしません。
あってもなくても同じです。

問題なのは、distinctだと思います。
distinctを指定すると、結果が重複する場合1行だけ返してくれるのですが、この機能を実装するために、内部でこの列の並び順でorderされているはずです。
distinctしたがために、結果はentry_id順に取得されることになります。
そう考えると、今のメイン画面の結果にぴったりなのです。

いろいろ試してみたいのですが、今は時間を取れなくて残念~くやし~

続きはまた今度。


投稿者 megu : 2004年08月12日 19:21

コメント

これは割によく知られた問題で以下にパッチがあります。
http://mt.mizba.net/archives/000151.php

投稿者 (o) [TypeKey Profile Page] : 2004年08月13日 03:30

(o)さん、こんにちは。
いつもありがとうございます。
私も検索していろいろ見てみました。
それで到達したのは、ご紹介してくださったパッチでした。
MT3.01Dではソースプログラムでの行数が多少異なっています。
パッチの内容を理解しながら、手を入れて、できあがったSQLを再度チェックしたいと思います。
これを機会にぜんぜんわかっていない中身の組み立てが少しでもわかってくれば....なんて考えているのですが、まだまだ甘いですね...汗。

投稿者 megu [TypeKey Profile Page] : 2004年08月13日 18:11

コメントしてください




保存しますか?