1

この方法で、Ruby on Rails アプリケーションから postgreSQL DB にクエリを実行しています。

var = Map.connection.execute("
SELECT * 
FROM shortest_path('SELECT * FROM japan WHERE japan.geom_way && ST_MakeEnvelope(139.68012, 35.63993, 139.71918, 35.66024)', 242945, 582735, false, false) 
JOIN japan ON edge_id = id;")

Rails サーバー コンソールに表示される実行時間は327.8 msです。

psql promtp から同じクエリを実行します。

SELECT * 
FROM shortest_path('SELECT * FROM japan WHERE japan.geom_way && ST_MakeEnvelope(139.68012, 35.63993, 139.71918, 35.66024)', 242945, 582735, false, false) 
JOIN japan ON edge_id = id;

実行時間は53.108 msです。

キャッシングが原因で実行時間が違うのではないかと思ったのですが、Railsアプリで同じクエリを2回続けて実行しようとしても、1クエリの実行時間は変わりません。例えば:

var = Map.connection.execute("SELECT * FROM shortest_path('SELECT * FROM japan WHERE japan.geom_way && ST_MakeEnvelope(139.68012, 35.63993, 139.71918, 35.66024)', 242945, 582735, false, false) JOIN japan ON edge_id = id;") 
var = Map.connection.execute("SELECT * FROM shortest_path('SELECT * FROM japan WHERE japan.geom_way && ST_MakeEnvelope(139.68012, 35.63993, 139.71918, 35.66024)', 242945, 582735, false, false) JOIN japan ON edge_id = id;")

実行時間は330.7 ms327.8 msです。

2 つのクエリは同一であるため、RoR とプロンプトで同じ実行時間を期待すべきではありませんか?

ご意見ありがとうございます。

4

2 に答える 2

1

http://www.depesz.com/2008/05/10/prepared-statements-gotcha/を見てください- おそらく理由は似ていますか?

于 2012-06-18T15:36:21.447 に答える
0

1 つは Ruby を使用しており、もう 1 つは使用していません。

また、ネットワーク転送の影響があるかどうか、ネットワークの違いがある場合は、回線を介して返される行の数を示していません。

あなたはこれらのことをどのようにタイミングをとっているのかを言っていません。Ruby のケースで時間にクライアント側の処理が含まれている場合、2 番目のケースでは明らかに処理が少なく、プロンプトには転送時間や結果を処理して「実行時間」の一部として表示する時間が含まれていません。 「あなたに報告していること。

于 2012-06-18T18:33:48.183 に答える