2016-07-28 14 views
1

私はstate_codeでレコードをフィルタリングする機能を持つRailsアプリケーションを持っています。私は検索用語として「CA」を渡すとすぐに結果が得られることに気付きました。もし私が 'AZ'に合格すれば、それは1分以上かかるでしょう。ほとんど同じPostgreSQLクエリで1分の違いがありますか?

なぜそういうことはありませんか?以下は

クエリはpsqlのからの説明です: 高速1:

EXPLAIN ANALYZE SELECT 
    accounts.id 
FROM "accounts" 
LEFT OUTER JOIN "addresses" 
    ON "addresses"."addressable_id" = "accounts"."id" 
    AND "addresses"."address_type" = 'mailing' 
    AND "addresses"."addressable_type" = 'Account' 
WHERE "accounts"."organization_id" = 16 
AND (addresses.state_code IN ('CA')) 
ORDER BY accounts.name DESC; 
                     QUERY PLAN 
--------------------------------------------------------------------------------------------------------------------------------------------------------- 
Sort (cost=4941.94..4941.94 rows=1 width=18) (actual time=74.810..74.969 rows=821 loops=1) 
    Sort Key: accounts.name 
    Sort Method: quicksort Memory: 75kB 
    -> Hash Join (cost=4.46..4941.93 rows=1 width=18) (actual time=70.044..73.148 rows=821 loops=1) 
     Hash Cond: (addresses.addressable_id = accounts.id) 
     -> Seq Scan on addresses (cost=0.00..4911.93 rows=6806 width=4) (actual time=0.027..65.547 rows=15244 loops=1) 
       Filter: (((address_type)::text = 'mailing'::text) AND ((addressable_type)::text = 'Account'::text) AND ((state_code)::text = 'CA'::text)) 
       Rows Removed by Filter: 129688 
     -> Hash (cost=4.45..4.45 rows=1 width=18) (actual time=2.037..2.037 rows=1775 loops=1) 
       Buckets: 1024 Batches: 1 Memory Usage: 87kB 
       -> Index Scan using organization_id_index on accounts (cost=0.29..4.45 rows=1 width=18) (actual time=0.018..1.318 rows=1775 loops=1) 
        Index Cond: (organization_id = 16) 
Planning time: 0.565 ms 
Execution time: 75.224 ms 
(14 rows) 

遅い1:

EXPLAIN ANALYZE SELECT 
    accounts.id 
FROM "accounts" 
LEFT OUTER JOIN "addresses" 
    ON "addresses"."addressable_id" = "accounts"."id" 
    AND "addresses"."address_type" = 'mailing' 
    AND "addresses"."addressable_type" = 'Account' 
WHERE "accounts"."organization_id" = 16 
AND (addresses.state_code IN ('NV')) 
ORDER BY accounts.name DESC; 
                     QUERY PLAN 
--------------------------------------------------------------------------------------------------------------------------------------------------------- 
Sort (cost=4917.27..4917.27 rows=1 width=18) (actual time=97091.270..97091.277 rows=25 loops=1) 
    Sort Key: accounts.name 
    Sort Method: quicksort Memory: 26kB 
    -> Nested Loop (cost=0.29..4917.26 rows=1 width=18) (actual time=844.250..97091.083 rows=25 loops=1) 
     Join Filter: (accounts.id = addresses.addressable_id) 
     Rows Removed by Join Filter: 915875 
     -> Index Scan using organization_id_index on accounts (cost=0.29..4.45 rows=1 width=18) (actual time=0.017..10.315 rows=1775 loops=1) 
       Index Cond: (organization_id = 16) 
     -> Seq Scan on addresses (cost=0.00..4911.93 rows=70 width=4) (actual time=0.110..54.521 rows=516 loops=1775) 
       Filter: (((address_type)::text = 'mailing'::text) AND ((addressable_type)::text = 'Account'::text) AND ((state_code)::text = 'NV'::text)) 
       Rows Removed by Filter: 144416 
Planning time: 0.308 ms 
Execution time: 97091.325 ms 
(13 rows) 

スローつの結果はさらに混乱している、高速の1が821行で、25行です。

+0

'C'で始まる行の数と 'A'で始まる行の数はいくつですか?あなたの質問も表示できますか? –

+0

@LajosArpad私の質問を編集しました。私は 'A'よりも 'C'のレコードが多いです。 リストがはるかに大きい「AZ」だけでなく、「CA」はほぼ正常に動作しています。これは私には奇妙です。 –

+0

Petya、それは面白いです。カリフォルニア州の検索はアリゾナ州の検索よりも遅いと予想されます。しかし、ここでは違ったやり方が起こっています。この2つのケースでは、結果の数がほぼ同じであるため、注文を原因として除外することができます。私は選択句がそれを遅くするかどうか疑問に思います。どちらのケースでも、単一の小さなカラムを選択してテストできますか?あなたがそうするなら、その行動は変わるでしょうか? –

答えて

1

psqlコマンドラインのVACUUM ANALYZEコマンドを使用して解決しました。

関連する問題