2017-02-10 5 views
0

2つのクエリの実行速度を調べるのは難しいですが、1つのクエリでタイムアウトが発生したため、分析とベンチマークを説明できますが、このクエリが原因であるかどうかはわかりません。レール内のActiveRecordカウントの分析

queue_count = purchase.purchase_items.where("queue_id = ?", queue.id).count 

同じSQLクエリ

SELECT COUNT(*) FROM "purchase_items" WHERE "purchase_items"."purchase_id" = 1241422 AND (queue_id = 3479783) 

はそう私は私がこの

queue_count = purchase.purchase_items.where("queue_id = ?", queue.id).all.count 
のようなクエリを持って、アレイ内のすべてのレコードを取得し、その後、カウントを行うための一つの解を得た後、カウントを削除する必要があります

同じSQLクエリ

SELECT "purchase_items".* FROM "purchase_items" WHERE "purchase_items"."purchase_id" = 1241422 AND (queue_id = 3479783) 

は、クエリ分析とベンチマークで確認していたときに最終的に若干のバリエーションを得ました。これが正しい方法でしたか?または私は間違って何かをしていますか?

答えて

1

パフォーマンス面では、2番目のクエリは非常に恐ろしいことになります。それはメモリにすべてのレコードをロードし、Rubyを使用してカウントします。データベースはこのようなことをすばやく行うように設計されています。

クエリを分析するために、EXPLAIN ANALYZEをPsqlコンソールで実行できます。私の長年の挑戦は、あなたがいくつかのインデックス(purchase_idとqueue_id)を見逃しているということです。

EXPLAIN ANALYZE SELECT COUNT(*) FROM purchase_items WHERE purchase_id = 1241422 AND (queue_id = 3479783) 

PostgreSQLがテーブル全体をスキャンしていることがわかると、パフォーマンスは最適ではありません。インデックスを追加してみてください:

CREATE INDEX purchase_id_purchase_items_idx ON purchase_items (purchase_id); 
CREATE INDEX queue_id_purchase_items_idx ON purchase_items (queue_id); 

、その後EXPLAIN ANALYZEを使用してパフォーマンスを調べます。しかし決してすべてのレコードをRubyにロードして簡単に.countを実行してください。

+0

私はすでにこのインデックスを持っていますが、分析するともう1つ説明します。この最初のヒットでこのクエリが表示されるpurchase_id = 1241422 AND(queue_id = 3479783)実行時の選択SELECT COUNT(*)from purchase_items実行時間:これは0.148ミリ秒を示しています。何度もチェックするロジックがありますか、最初のヒットの実行時間は正しいですか? – django

+1

これを数回実行してf.eを計算する必要があります。平均 - 1回の試行では正確なデータを得るには不十分です。そして、それが1ミリ秒または0.1ミリ秒であれば、それは本当に速く、確かにボトルネックではありません – Esse

関連する問題